为什么TCP协议是三次握手和四次挥手呢?
TCP协议建立连接(三次握手)断开连接(四次挥手)
首先了解这几个术语:
SYN
代表同步位SYN=1
表示进行一个连接请求ACK
代表确认位ACK=1
表示确认有效ACK=0
表示确认无效ack
代表确认号 对方发送序号加1seq
代表序号
建立连接(3次)
- 客户端A 向 服务端B发起一个请求可记为
SYN=1
、seq=x
,其中x序号是客户端随机生成的。 - 服务端B 收到请求后需要向 客户端A 发起一个响应可记为
SYN=1
、ACK=1
、ack=x+1
、seq=y
,其中y序号是服务端随机生成的。 - 客户端A 收到响应后,需要再给 服务端B 发起一个响应可记为
ACK=1
、ack=y+1
、seq=x+1
。
完成以上三次握手,双方即可进行数据传送。
断开连接(4次)
- 客户端A 向 服务端B发起一个请求可记为
FIN=1
、seq=u
,其中u序号是客户端随机生成的。 - 服务端B 收到请求后需要向 客户端A 发起一个响应可记为
ACK=1
、ack=u+1
、seq=v
,其中v序号是服务端随机生成的。(此时服务端处于半关闭状态,还可以继续向客户端发送数据) - (当服务端B向客户端A发送数据完毕之后)服务端B 会继续向 客户端A 发起一个响应可记为
FIN=1
、ACK=1
、ack=u+1
、seq=w
。 - 客户端A 收到响应后,需要再给 服务端B 发起一个响应可记为
ACK=1
、ack=w+1
、seq=v+1
。
客户端要保证第四个数据包能被服务器收到,怎么保证呢?就是通过等待 2MSL(MSL表示一个报文的最大生存时间) ,第四个包传递到服务器需要 1 MSL,如果中间丢失了,服务器就会再发送第五个数据包去让客户端重新发第四个包,这第五个包传递到客户端又需要 1MSL 时间。所以客户端为了确保第四个数据包能被服务器收到,就要等待 2MSL 时间。