HTTP
属于应用层协议,在传输层使用 TCP
协议,在网络层使用 IP
协议。
无状态:无状态是指协议对于事务处理没有记忆能力。
无连接:限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。
面向连接
OSI 网络七层协议
应用层 HTTP
表示层 SSL
会话层 SSH
传输层 TCP
网络层 IP
数据链路层 WiFi 802.11
物理层 以太网, IEEE 802.2
头部属性
Accept
指定客户端能够接收的内容类型 Accept: text/plain, text/html
Accept-Charset
浏览器可以接受的字符编码集。 Accept-Charset: iso-8859-5
Accept-Encoding
指定浏览器可以支持的web服务器返回内容压缩编码类型。 Accept-Encoding: compress, gzip
Accept-Language
浏览器可接受的语言 Accept-Language: en,zh
Accept-Ranges
可以请求网页实体的一个或者多个子范围字段 Accept-Ranges: bytes
Authorization
HTTP授权的授权证书 Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==
Cache-Control
指定请求和响应遵循的缓存机制 Cache-Control: no-cache
Connection
表示是否需要持久连接。(HTTP 1.1默认进行持久连接)Connection: close
Cookie
HTTP请求发送时,会把保存在该请求域名下的所有cookie值一起发送给web服务器。 Cookie: $Version=1; Skin=new;
Set-Cookie
Set-Cookie: delPer=1; expires=Fri, 24-Jul-2048 11:34:43 GMT
Content-Length
请求的内容长度 Content-Length: 348
Content-Encoding
Content-Encoding: gzip
Content-Type
请求的与实体对应的MIME信息 Content-Type: application/x-www-form-urlencoded
Date
请求发送的日期和时间 Date: Tue, 15 Nov 2010 08:12:31 GMT
Expect
请求的特定的服务器行为 Expect: 100-continue
From
发出请求的用户的Email From: user@email.com
Host
指定请求的服务器的域名和端口号 Host: www.zcmhi.com
If-Match
只有请求内容与实体相匹配才有效 If-Match: “737060cd8c284d8af7ad3082f209582d”
If-Modified-Since
如果请求的部分在指定时间之后被修改则请求成功,未被修改则返回 304 代码 If-Modified-Since Sat, 29 Oct 2010 19:43:31 GMT
If-None-Match
如果内容未改变返回304代码,参数为服务器先前发送的Etag,与服务器回应的Etag比较判断是否改变 If-None-Match: “737060cd8c284d8af7ad3082f209582d”
If-Range
如果实体未改变,服务器发送客户端丢失的部分,否则发送整个实体。参数也为Etag If-Range: “737060cd8c284d8af7ad3082f209582d”
If-Unmodified-Since
只在实体在指定时间之后未被修改才请求成功 If-Unmodified-Since: Sat, 29 Oct 2010 19:43:31 GMT
Max-Forwards
限制信息通过代理和网关传送的时间 Max-Forwards: 10
Pragma
用来包含实现特定的指令 Pragma: no-cache
Proxy-Authorization
连接到代理的授权证书 Proxy-Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==
Range
只请求实体的一部分,指定范围 Range: bytes=500-999
Referer
先前网页的地址,当前请求网页紧随其后,即来路 Referer: http://www.zcmhi.com/archives/71.html
TE
客户端愿意接受的传输编码,并通知服务器接受接受尾加头信息 TE: trailers,deflate;q=0.5
Upgrade
向服务器指定某种传输协议以便服务器进行转换(如果支持) Upgrade: HTTP/2.0, SHTTP/1.3, IRC/6.9, RTA/x11
User-Agent
User-Agent的内容包含发出请求的用户信息 User-Agent: Mozilla/5.0 (Linux; X11)
Via
通知中间网关或代理服务器地址,通信协议 Via: 1.0 fred, 1.1 nowhere.com (Apache/1.1)
Warning
关于消息实体的警告信息 Warn: 199 Miscellaneous warning
请求、响应消息组成 四部分
请求行(状态行)
HTTP 协议版本号 状态码 状态消息
请求头部(消息报头)
空行
请求数据(响应正文)
1 | GET /test HTTP/1.1 # 请求行 |
url
协议 域名 端口 虚拟目录 文件名 锚(#XXX)参数(?xxx=xxx)
方法
get
post
head
delete
put
虽然也是更新资源,但要求前端提供的一定是一个完整的资源对象。在指明的 URL 下存储一个文档patch
对已知资源进行局部更新。options
状态码
- 1xx 表示通知消息,如请求收到了或者正在进行处理
- 2xx 表示成功,如接受或知道了
- 3xx 表示重定向,如要完成请求还要继续采取行动
- 4xx 表示客户的差错,如请求由错误的语法或不能完成
- 5xx 表示服务器差错
地址栏键入网址回车之后的过程
DNS 网址->IP
通过
IP + 端口
和服务器建立 TCP 连接浏览器发出读取文件的 HTTP 请求,该请求报文作为 TCP 三次握手的第三个报文的数据发送给服务器
服务器做出响应,把相应的 html 文件发给浏览器
释放 TCP 连接
浏览器解析 HTML,显示内容。
IP
IP 协议主要解决网络路由和寻址问题。
TCP 控制传输协议
TCP 协议主要解决如何在 IP 层之上可靠地传递数据包,使得网络上接收端收到发送端所发出的所有包,并且顺序与发送顺序一致。
- 面向连接的、可靠的
三次握手
A 首先向 B 发出连接请求报文段,这个时候首部中的同步位 SYN=1,同时选择一个初始的序号 x。此时报文段不能携带数据。此时 A 进入到 SYN_SENT (同步已发送)状态。
B 收到连接请求报文,同意建立连接,向 A 发出确认。确认报文中,SYN 和 ACK 都置 1,确认号是 x+1,与此同时,自己选择一个初始序号 y,这个报文也不能携带数据。此时B进入 SYN_RCVD(同步收到)状态。
A 收到 B 的确认后,还要给 B 确认。这时可以携带数据,A 进入到 ESTABLISHED 状态。这就是三次握手的过程。
四次挥手
A 的应用进程向其 TCP 发出连接释放报文段,主动关闭 TCP 连接。A 进入FIN_WAIT1(终止等待1)状态
然后 B 确认,B 进入 CLOSE_WAIT(关闭等待)状态。此时 TCP 处于半关闭状态,A 已经没有数据要发送了,如果 B 仍要发送数据,B 仍然接收。
A 收到 B 的确认后,就进入FIN_WAIT2(终止等待2)状态,等待 B 发出连接释放报文。 如果 B 已经没有向 A 发送的数据,则 B 发送请求释放报文,B 进入 LAST_ACK(最后确认)阶段,等待 A 的确认。
A 在收到 B 的请求后,要发出确认,然后进入 TIME_WAIT(时间等待)状态。此时,连接还未释放,必须等待时间等待计时器设定的时间的2MSL后,A才进入CLOSED状态。
UDP 用户数据报协议
- 无连接、不可靠
长连接 短链接
HTTP/1.0 中默认使用短连接。每遇到这样一个 Web 资源,浏览器就会重新建立一个 HTTP 会话
HTTP/1.1 起,默认使用长连接,用以保持连接特性。Keep-Alive 不会永久保持连接,它有一个保持时间,在 WEB 服务器中进行设定。