TCP和HTTP
TCP(Transmission Control Protocol,传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议,采用三次握手建立连接,四次挥手终止连接。
TCP连接一旦建立,在通信双方中的任何一方主动关闭连接之前,TCP 连接都将被一直保持下去,服务器和客户端均可主动发起断开连接的请求。
HTTP(Hypertext Transfer Protocol,超文本传送协议),是互联网上应用最为广泛的一种网络协议。所有的WWW文件都必须遵守这个标准,HTTP协议是建立在TCP协议之上的一种应用。
HTTP连接最显著的特点是客户端发送的每次请求都需要服务器回送响应,在请求结束后,会主动释放连接。从建立连接到关闭连接的过程称为”一次连接”。
- HTTP 1.0中,客户端的每次请求都要建立一次单独的连接,在处理完本次请求后,就自动释放连接
- HTTP 1.1中,可在一次连接中处理多个请求,且可重叠发送请求(无需等待一个请求结果返回后再发送下一个请求)
TCP是传输层协议,定义数据传输和连接方式的规范
HTTP是应用层协议,定义传输数据的内容的规范
HTTP协议基于TCP协议,所以支持HTTP也就一定支持TCP
TCP三次握手(建立连接)
- 第一次握手:客户端向服务器发送SYN(
seq=j
)包到服务器; - 第二次握手:服务器收到SYN包,向客户端发送ACK包(
ack=j+1
)和SYN包(seq=k
); - 第三次握手:客户端收到SYN+ACK包,向服务器发送ACK包(
ack=k+1
),完成三次握手。
SYN
:(Synchronize Sequence Numbers
,同步序列编号)
ACK
:(Acknowledgement Number
,确认编号)
FIN
:结束标志
TCP四次挥手(终止连接)
- 第一次挥手:客户端向服务器发送FIN包(
seq=j
),关闭客户到服务器的数据传送; - 第二次挥手:服务器收到FIN包,向客户端发送ACK包(
ack=j+1
); - 第三次挥手:服务器向客户端发送FIN包(
seq=k
); - 第四次挥手:客户端收到FIN包,向客户端发送ACK包(
ack=k+1
),完成四次挥手。
为什么TCP连接是3次而终止是4次
连接时,服务端收到SYN后,把ACK和SYN一起打包回发给客户端,只有3次。
终止时,由于TCP连接是全双工的,每个方向都必须单独进行关闭,即FIN和ACK是分开发送的,所以有4次。
当一方完成它的数据发送任务后,发送一个FIN来终止连接。但收到一个FIN只表示对方没有数据发送,而己方仍能发送数据。因此必须单独关闭。