HTTP协议
HTTP(Hypertext Transfer Protocol,超文本传输协议)是一种用于在网络上传输超文本(HTML、XML、图片等)的应用层协议。它是一种无状态、无连接的协议,由客户端发起请求,服务器返回响应。
在网络传输的数据流中,需要明确地知道协议的边界(协议开始和协议结束)、协议元数据和传输的内容
常见方法名:GET
, HEAD
, POST
, PUT
, DELETE
, CONNECT
, OPTIONS
, TRACE
, PATCH
状态码:
1xx
:信息类2xx
:成功3xx
:重定向4xx
:客户端错误5xx
:服务端错误
不同版本之间的对比
HTTP/1.1
、HTTP/2
和 QUIC
都是用于在 Web 上进行通信的协议,它们之间有以下区别:
- 版本差异
- HTTP/1.1 是最早的版本,它采用了基于文本的格式,每个请求都需要建立一个新的 TCP 连接,并且只能顺序发送和接收数据
- HTTP/2 是 HTTP 协议的第二个主要版本,它引入了二进制格式,并支持多路复用(Multiplexing),可以在同一个连接上同时发送和接收多个请求和响应
- QUIC(Quick UDP Internet Connections)是一个基于 UDP 的传输协议,它比 TCP 更快速、安全,并且提供了连接复用和减少延迟的功能
- 传输机制
- HTTP/1.1 使用明文文本格式进行通信,每个请求和响应都包含头部信息和正文内容。它使用 TCP 作为传输层协议,建立多个连接来处理并发请求
- HTTP/2 使用二进制格式对请求和响应进行编码,通过帧(Frame)的方式在相同的连接上同时处理多个请求和响应,实现了更高效的多路复用
- QUIC 建立在 UDP 上,使用自定义的加密协议和错误恢复机制,提供了更好的性能和安全性
- 性能和效率
- HTTP/1.1 在处理多个请求时存在队头阻塞(Head-of-line blocking)问题,因为每个请求都需要在前一个请求的响应返回后才能发送。同时,由于需要建立多个连接,会带来额外的开销
- HTTP/2 通过多路复用将多个请求和响应复用到同一个连接中,减少了网络延迟和连接建立开销,并且支持服务器主动推送(Server Push)功能,提高了性能
- QUIC 提供了更快速的连接建立和错误恢复机制,同时支持多路复用和头部压缩,降低了延迟和带宽占用
总的来说,HTTP/1.1 是传统的基于文本的协议,HTTP/2 引入了二进制格式和多路复用机制,提高了性能,而 QUIC 则是基于 UDP 的新一代传输协议,具有更好的性能、安全性和实时性。
网络传输
ARP协议
ARP
(Address Resolution Protocol,地址解析协议)是一种用于将网络层的IP地址解析为物理层(以太网或其他局域网技术)的MAC地址的协议。
在一个以太网(Ethernet)局域网中,每个网络设备都有唯一的物理地址,即MAC地址。而在进行数据通信时,通常使用IP地址作为目标地址。ARP协议就是用来解决IP地址和MAC地址之间的映射关系。
ARP 协议的具体工作过程如下:
- 主机A需要向主机B发送数据,只知道目标IP地址,不知道对应的MAC地址
- 主机A首先在自身ARP缓存中查找目标IP地址对应的MAC地址记录。若有,则直接获取对应的MAC地址,并进行下一步处理
- 若主机A的ARP缓存中没有目标IP地址的对应记录,主机A会发送一个ARP请求广播包(ARP Request broadcast),其中包含自己的MAC地址、IP地址以及目标IP地址
- 局域网中的所有主机都会收到该ARP请求广播包,但只有与目标IP地址匹配的主机会响应
- 目标主机B接收到ARP请求后,会向主机A发送一个ARP响应单播包(ARP Reply unicast),其中包含自己的MAC地址、IP地址以及请求主机A的IP地址
- 主机A接收到ARP响应后,将目标IP地址和MAC地址的对应关系存储在自己的ARP缓存中,并将数据发送给目标主机B
此时,主机A成功获取到了目标主机B的MAC地址,并能够进行数据通信。
ARP协议是在同一个局域网内有效的,它依赖于广播和单播传输。
TCP的三次握手和四次挥手
三次握手
-
第一次握手 客户端设标志位
SYN
为1,随机生成序号值seq=M
,保存在TCP报文的序列号字段里,并将数据包发给服务端请求连接 -
第二次握手 服务端收到数据包后,设标志位
SYN
和ACK
为1,ack=M+1
,随机生成序号值seq=N
,并将数据包发给客户端确认连接请求 -
第三次握手 客户端收到确认报文后,检查
ack
是否为M+1
,ACK
是否为1,如果正确则设标志位ACK
为1,ack=N+1
,并将数据包发送给服务端,服务端检查ack
是否为N+1
,ACK
是否为1,如果正确则连接建立成功,三次握手结束
四次挥手
-
第一次挥手 客户端发起挥手请求,设置标志位
FIN
为1,设置序列号seq=M
,将报文发送给服务端,表示客户端没有数据要发送给服务端了 -
第二次挥手 服务端收到了客户端发送的
FIN=1
的报文段,设置ACK
为1,ack=M+1
,将报文发送给客户端,表示服务端告诉客户端,确认并同意关闭请求 -
第三次挥手 服务端设置标志位
FIN
为1,设置序列号seq=N
,将报文发送给客户端,请求关闭连接 -
第四次挥手 客户端收到了服务端发送的
FIN=1
的报文段,设置ACK
为1,ack=N+1
,将报文发送给服务端,服务端收到ACK
之后就关闭连接,此时客户端需要等待2MSL
的时间,这期间没有收到回复证明服务端正常关闭,此时客户端关闭连接