前言:
http:hyper text transfer protocol(超文本传输),应用层协议,监听于TCP协议的80号端口。
是html(超文本标记语言)语言所开发的文本文件
超文本文档:
======================================分割线===============================================
一、协议版本:
http/0.9:原型版本,功能简陋。
http/1.0:加入了cache机制、MIME机制、method
cache机制:缓存机制
MIME机制:Multipurpose Internet Mail Extesion(多用途互联网邮件扩展)
method:GET,POST,HEAD,PUT,DELETE,TRACE,OPTIONS(协议版本方法)
http/1.1:增强了缓存功能;
http/2.0:在1.1上进行了诸多改进。
二:工作模式:
http请求报文:http request
http相应报文:http response
一次http事务&#xff1a;请求<-->响应
web资源&#xff1a;web resource
静态资源&#xff08;无需服务器端做出额外处理&#xff09;&#xff1a;.jpg, .png, .gif, .html, .txt, .js, .css, .mp3, .avi
动态资源(服务器端需要通过执行程序作出处理&#xff0c;发送给客户端的是程序的运行结果)&#xff1a;.php, .jsp
(注&#xff1a;一个页面有多个资源组成&#xff0c;每个资源都需要单独请求&#xff09;
三&#xff1a;资源的标识机制&#xff1a;URL(Uniform Resource Locator)&#xff1a;用于描述服务器某特定资源的位置&#xff1b;
例如&#xff1a;http://www.sina.com.cn[/index.html]
Scheme://Server[:Port][/PATH/TO/SOME_RESOURCE]
四&#xff1a;一次完整的http请求处理过程&#xff1a;
&#xff08;1&#xff09;建立或处理连接&#xff1b;接收请求或拒绝请求&#xff1b;
&#xff08;2&#xff09;接收请求&#xff1a;接收来自于网络上的主机请求报文中对某特定资源的一次请求过程&#xff1b;
&#xff08;3&#xff09;处理请求&#xff1a;对请求报文进行解析&#xff0c;获取客户端请求的资源及请求方法等相关信息&#xff1b;
&#xff08;4&#xff09;访问资源&#xff1a;获取请求报文中请求的资源&#xff1b;
&#xff08;5&#xff09;构建响应报文
&#xff08;6&#xff09;发送响应报文
&#xff08;7&#xff09;记录日志
(1)接收请求的模型&#xff1a;
并发访问响应模型&#xff1a;
①单进程I/O模型&#xff1a;启动一个进程处理用户请求&#xff1b;这意味着&#xff0c;一次只能处理一个请求&#xff0c;多个请求被串行响应。
②多进程I/O结构&#xff1a;并行启动多个进程&#xff0c;每个进程响应一个请求&#xff1b;
③复用的I/O结构&#xff1a;一个进程响应n个请求&#xff1b;
1&#xff09;多线程模式&#xff1a;一个进程生成n个线程&#xff0c;一个线程响应n个请求&#xff1b;
2&#xff09;事件驱动&#xff1a;一个进程直接响应n个请求&#xff1b;
④复用的多进程I/O结构&#xff1a;启动多个&#xff08;m&#xff09;个进程&#xff0c;每个进程生成&#xff08;n&#xff09;个线程&#xff1b;
响应的请求的数量&#xff1a;m*n
(2)处理请求&#xff1a;分析请求报文的http请求报文首部
http协议事务&#xff1a;
http请求报文首部
http响应报文首部
请求报文首部的格式&#xff1a;
HEADERS: (name: value)
(3)访问资源&#xff1a;获取请求报文中请求的资源
web服务器中资源路径映射方式&#xff1a;
web服务器&#xff0c;即存放了web资源的主机&#xff0c;负责向请求者提供对方请求的静态资源&#xff0c;或动态资源运行生成的结果&#xff1b;这些资源通常应该放置于本地文件系统某路径下&#xff1b;此路径称为DocRoot;
(a) docroot
(b) alias
(c) 虚拟主机的docroot
(d) 用户家目录的docroot
五&#xff1a;http请求处理中的连接模式&#xff1a;
&#xff08;1&#xff09;保持连接&#xff08;长连接&#xff09;&#xff1a;keep—live
时间&#xff1a;
数量&#xff1a;
&#xff08;长连接模式中&#xff0c;可以有两个纬度来限制客户端的连接时长&#xff0c;因为在并发请求很多的时候&#xff0c;服务器不能让客户端的某一请求长时间占据服务端进程从而使别的请求无法送达服务端&#xff0c;我们可以设定连接时间和数量来控制客户端的请求连接&#xff0c;当时间或请求数量两个标准中任意一个指标到达预设定的标准时服务端就自动断开链接&#xff0c;不管客户端请求是否结束&#xff0c;这样一来断开连接的主导方就是服务器端而不是客户端了&#xff09;
&#xff08;2&#xff09;非保持连接&#xff08;短连接&#xff09;
&#xff08;每次请求都建立三次握手四次断开过程&#xff09;
&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;未完待续&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;
&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;接&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;
URL&#xff1a;Unifrom Resource Locator
URL方案&#xff1a;scheme
服务器地址&#xff1a; ip&#xff1a;port
资源路径&#xff1a;
基本语法&#xff1a;
params:参数
例如:http&#xff1a;//www.tz.com/bbs/hello;gender&#61;f
query:查询标准
例如:http://www.tz.com/bbs/item.php?username&#61;tom&title&#61;abc
frag:片段&#xff0c;锚定
&#xff08;1&#xff09;相对URL &#xff08;2&#xff09;绝对URL
http协议&#xff1a;stateless&#xff08;无状态的机制&#xff09;
服务器无法持续追踪客户端访问来源&#xff1b;当一个客户端有多次请求时服务端无法确认第一个请求和第二个请求是否来自同一个客户端。
可以基于COOKIE方式追踪同一个用户&#xff1a;当客户端服务器发送请求时&#xff0c;服务器端会发送一个COOKIE文件给客户端&#xff0c;客户端会接收下来存储到磁盘的某段空间&#xff0c;显然一个客户端可以存储很多个COOKIE&#xff0c;每个COOKIE就是服务器端发给客户端的随机数&#xff0c;对于每个请求来说&#xff0c;可以说就是唯一的&#xff0c;当客户端再次对该服务发起请求时就会调用该COOKIE&#xff0c;服务端就会识别该客户端为登录过的客户端&#xff0c;之后服务端就会跳过认证&#xff0c;但是这种机制也会增大风险&#xff0c;当访问敏感资源时如果不退出&#xff0c;只是关闭浏览器进程时&#xff0c;下次登录时服务端就会根据COOKIE免认证当前客户端。但有些安全性要求较高的站点在你关闭浏览器进程时&#xff0c;会自动清除COOKIE信息。
COOKIE&#xff1a;重COOKIE&#xff1a;记录数据较多&#xff0c;不安全&#xff1b;轻COOKIE&#xff1a;只记录用户名等少量信息&#xff1b;
session&#xff1a;服务器为每个客户端浏览器进程在内存空间专门维护了一个数据微小结构&#xff0c;记录了用户此前在当前服务器上的访问行为以及请求的各种数据&#xff0c;当客户端首次访问该服务器时&#xff0c;服务器为客户端生成轻COOKIE并在本地为该用户创建session并且将次session标识到该COOKIE上&#xff0c;当客户端再次访问时使用轻COOKIE关联至服务器本地此客户端的session&#xff0c;就能请求到该客户端的详细数据&#xff0c;这样既为客户端多次访问提供了方便性&#xff0c;而且保证了安全性。
http事务&#xff1a;请求&#xff08;request&#xff09;、响应&#xff08;response&#xff09;
报文语法格式&#xff1a;
①request报文&#xff1a;
②respose报文&#xff1a;
method:请求方法&#xff0c;标明客户端希望服务器对资源执行的动作
GET、HEAD、POST、PUT......
GET&#xff1a;从服务器获取一个资源&#xff1b;&#xff08;安全方法&#xff09;
HEAD&#xff1a;只从服务器端获取文档的响应首部&#xff1b;&#xff08;安全方法&#xff09;
POST&#xff1a;向服务器发送服务器要处理的数据&#xff1b;&#xff08;有点危险方法&#xff09;
PUT&#xff1a;将请求的主体部分存储在服务器上&#xff0c;而不处理&#xff1b;&#xff08;危险方法&#xff09;
DELETE&#xff1a;请求删除服务器上指定的文档&#xff1b;&#xff08;非常危险&#xff09;
TRACE&#xff1a;追踪请求到达服务器中间经过的代理服务器&#xff1b;
OPTIONS&#xff1a;请求服务器返回对指定资源支持使用的请求方法
version&#xff1a;
HTTP/
status:用来标记请求处理过程中发生的情况
三位数字
1xx&#xff1a;100-101&#xff0c;信息提示&#xff1b;
2xx&#xff1a;200-206&#xff0c;成功&#xff1b;
3xx&#xff1a;300-305&#xff0c;重定向&#xff1b;
4xx&#xff1a;400-415&#xff0c;错误类信息&#xff0c;客户端错误&#xff1b;
5xx&#xff1a;500-505&#xff0c;错误类信息&#xff0c;服务器端错误&#xff1b;
常用的状态码&#xff1a;
200&#xff1a;成功&#xff0c;请求的所哟数据通过响应报文的entity-body部分发送&#xff1b;ok
301&#xff1a;请求的URL指向的资源已经被删除&#xff1b;但在响应报文中通过首部Location指明了资源现在所处的 位置&#xff1b;Moved Permanently
302&#xff1a;与301相似&#xff0c;但在响应报文中通过Location指明资源现在所处临时新位置&#xff1b;Found
304&#xff1a;客户端发出条件式请求&#xff0c;但服务器上的资源未曾发生改变&#xff0c;则通过响应此响应状态码通知客 户端&#xff1b;Not Modified
401&#xff1a;需要输入帐号和密码认证方能访问资源&#xff1b;Unauthorized
403&#xff1a;请求被禁止&#xff1b;Forbidden
404&#xff1a;服务器无法找到客户端请求的资源&#xff1b;Not Found
500&#xff1a;服务器内部错误&#xff1b;Internal Server Error
502&#xff1a;代理服务器从后端服务器收到了一跳伪响应&#xff1b;Bad Gateway
reason-phrase:状态码所标记的状态的简要描述&#xff1b;
headers&#xff1a;用来标记每个请求或响应的属性&#xff1b;
每个请求或响应报文可包含任意个首部&#xff1b;每个首部都有首部名称&#xff0c;后面跟一个冒号&#xff0c;而后跟上可选空格&#xff0c;接着是一个值。
&#xff08;一&#xff09;请求首部&#xff1a;&#xff08;Request Headers&#xff09;
&#xff08;二&#xff09;响应首部&#xff1a;&#xff08;Reponse Headers&#xff09;
首部的分类&#xff1a;
&#xff08;1&#xff09;通用首部&#xff1a;
Date:报文的创建时间&#xff1b;
Connection&#xff1a;连接状态&#xff0c;如keep-alive、close等&#xff1b;
Via&#xff1a;显示报文经过的中间节点&#xff1b;
Cache-Control&#xff1a;控制缓存&#xff1b;
&#xff08;2&#xff09;请求首部&#xff1a;
Accept&#xff1a;通知服务器自己可接受的媒体类型&#xff1b;
Accept-Charset&#xff1a;接受哪些字符集&#xff1b;
Accept-Encoding&#xff1a;接受编码格式&#xff0c;如gzip&#xff1b;
Accept-Language&#xff1a;接受的语言&#xff1b;
Client-ip&#xff1a;客户端IP
Host&#xff1a;请求的服务器名称和端口&#xff1b;
Referer&#xff1a;包含当前住呢个在请求的资源的上一级资源&#xff1b;
User-Agent&#xff1a;客户端代理
①条件式请求首部&#xff1a;
Expect&#xff1a;期望对方发送什么信息&#xff1b;
If-Modified-Since&#xff1a;自从指定的时间之后请求的资源是否发生过修改&#xff1b;
If-Unmodified-Since&#xff1a;
If-None-Match&#xff1a;本地缓存中存储的文档的ETag&#xff08;扩展&#xff09;标签是否与服务器文档的 ETag不匹配&#xff1b;
If-Match&#xff1a;
②安全请求首部&#xff1a;
Authorization&#xff1a;向服务器发送认证信息&#xff0c;如帐号和密码&#xff1b;
COOKIE&#xff1a;客户端向服务器发送COOKIE&#xff1b;
COOKIE2&#xff1a;两个版本&#xff1b;
③代理请求首部&#xff1a;
Proxy-Authorization&#xff1a;向代理服务器认证&#xff1b;
&#xff08;3&#xff09;响应首部&#xff1a;
①信息性&#xff1a;
Age&#xff1a;响应持续时长&#xff1b;
Server&#xff1a;服务器程序的软件名称和版本&#xff1b;
②协商首部&#xff1a;某资源有多种表示方法时使用
Accept-Ranges&#xff1a;服务器可接受的请求范围类型
Vary&#xff1a;服务器查看的其他首部列表&#xff1b;
③安全响应首部&#xff1a;
Set-COOKIE&#xff1a;向客户端设置COOKIE&#xff1b;
Set-COOKIE2&#xff1b;
WWW-Authenticate&#xff1a;来自服务器的对客户端的质询认证表单
&#xff08;4&#xff09;实体首部&#xff1a;
Allow&#xff1a;列出对此实体可使用的请求方法
Location&#xff1a;告诉客户端真正的实体位于何处
Content-Encoding&#xff1a;内容的编码格式&#xff1b;
Content-Language&#xff1a;内容的语言&#xff1b;
Content-Length&#xff1a;主体的长度&#xff1b;
Content-location&#xff1a;实体真正所处位置&#xff1b;
Content-Type&#xff1a;主体的对象类型&#xff1b;
缓存相关&#xff1a;
ETag&#xff1a;实体的扩展标签&#xff1b;&#xff08;基于标签做条件请求时使用&#xff09;
Expires&#xff1a;实体的过期时间&#xff1b;
Last-Modified&#xff1a;最后一次修改的时间&#xff1b;
entity-body&#xff1a;请求时附加的数据或响应时附加的数据&#xff1b;
请求报文有可能为空&#xff1b;