为什么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 时间。