V1.在了解三次握手和四次挥手前,我们先了解一下什么是TCP?
首先是计算机网络体系结构
- TCP是面向连接的、可靠的、基于字节流的传输层通讯协议,http是基于http协议传输的
- TCP的报文格式图
- 源端口、目的端口号
- 序号(seq):用于解决包乱序的问题,因为tcp会将网络包分成多个段发送
- 确认序列(ack):用于确认对方是否成功收到传输的数据,如果失败了,则重新发送
- 状态码:主要的状态码有SYN(发起一个连接)、ACK(回复)、RST(重新连接)、FIN(结束连接)等
- 窗口大小:主要是用于流量控制和拥塞控制,在服务端和客户端中都定义一个传输的窗口来做到限流的效果,防止一次性发送或接受太多而导致的网络拥挤
2.三次握手(服务器和客户端连接)
2.1.三次握手的流程
- 一开始客户端和服务端都是处于CLOSED状态,然后服务器主动监听某个端口,服务端进入LISTEN状态
- 然后客户端会随机创建一个序号x放到SYN报文的序号(seq = x)中,再发送这个SYN报文到服务端,这时客户端进入SYN_SENT状态
- 当服务端接收到客户端发送的syn报文后,服务端也会随机创建一个服务端的序号y,并将原先报文中的序号增加一放到应答序列(ack = x + 1)中,并且将报文中的seq变为服务器的序号(及seq = y),然后将报文的状态码的SYN和ACK标志位置为1,最后发送到客户端中,此时服务端进入SYN_RCVD
- 客户端接收到服务端的ACK报文后,会发送一个SYN报文,这个SYN报文中的应答序列为客户端ACK报文的序号加一(ack = y + 1),此次可以携带数据传输。客户端进入ESTABLISHED状态
- 服务端接收到客户端发送ACK报文后会进入ESTABLISHED状态
2.2.为什么一定要三次握手,不能四次或者两次?
- 三次握手才可以解决重复历史连接的初始化(主要原因)
- 三次握手才可以同步双方的序列号
- 三次握手才可以避免资源浪费
3.四次挥手(服务器和客户端断开连接)
3.1.四次挥手的流程
- 客户端发送FIN报文,客户端进入FIN_WAIT_1状态
- 服务端接收到FIN报文后会发送ACK报文,服务端进入CLOSED_WAIT状态
- 客户端接收到服务端的ACK报文后会会进入FIN_WAIT_2状态
- 等待服务端自己内存处理完数据后,会发送FIN报文,服务端进入LAST_ACK状态
- 客户端接收到服务端的ACK报文后,会发送ACK报文,并且进入TIME_WAIT状态
- 服务端在接收到到ACK报文后进进入CLOSED状态
- 客户端在经过2MSL段数据后也会进入CLOSED状态
3.2.为什么是四次挥手而不是三次或者五次?
因为客户端和服务端都需要发送FIN报文和FIN报文的ACK报文,只有这样才能确保服务端和客户端不能发送和接受消息