
建立连接-3次挥手
主要过程
- client发送syn报文,syn = j, 序列号X,状态置为SYN_SENT
- server发送syn+ack报文,syn = j + 1, ack = k, 序列号Y,确认号X+1,状态置为SYN_RCVD;
- client发送ack报文,ack = k + 1, 确认号Y+1,状态置为ESTABLISHED
- server接受ack报文,状态置为ESTABLISHED
为什么是3次
- TCP连接是全双工的
- 大于3次后面的通信没有必要,浪费资源
- 小于3次不安全,防止已失效的连接请求又传送到服务器端,因而产生错误,浪费资源,
失效的连接请求:若客户端向服务端发送的连接请求丢失,客户端等待应答超时后就会再次发送连接请求,此时,上一个连接请求就是"失效的"。若建立连接只需两次握手,客户端并没有太大的变化,仍然需要获得服务端的应答后才进入ESTABLISHED状态,而服务端在收到连接请求后就进入ESTABLISHED状态。此时如果网络拥塞,客户端发送的连接请求迟迟到不了服务端,客户端便超时重发请求,如果服务端正确接收并确认应答,双方便开始通信,通信结束后释放连接。此时,如果那个失效的连接请求抵达了服务端,由于只有两次握手,服务端收到请求就会进入ESTABLISHED状态,等待发送数据或主动发送数据。但此时的客户端早已进入CLOSED状态,服务端将会一直等待下去,这样浪费服务端连接资源
版权声明:本段为CSDN博主「Laurence Lau4846」的原创文章,遵循 CC 4.0 BY-SA 原文链接:blog.csdn.net/weixin_4219…
断开连接-4次挥手
主要过程
- 主动方发送FIN,状态置为FIN_WAIT1
- 被动方收到主动方发送的FIN,状态置为CLOSE_WAIT,同时发送一个ACK
- 主动方收到ACK,状态置为FIN_WAIT2,主动方至被动方的连接断开
- 被动方发送FIN,状态置为LAST_ACK
- 主动方收到FIN,状态置为TIME_WAIT,等待一段时间(2ms)后进入CLOSED状态,同时发送一个ACK
- 被动方收到ACK,状态置为CLOSED,被动方至主动方的连接断开
为什么是4次
连接可以3次是因为SYN和ACK同时发送,但断开连接时FIN和ACK不能同时发送,缓冲区里的数据全部清理完毕才能发送FIN报文
为什么等待2ms
主动方的ACK报文不一定被被动方接收到,这时被动方可能会超时重传,因此必须等待可能的重传报文。2ms是2*MSL(Maximum Segment Lifetime),MSL为网络中最大存活时间,即一个发送和一个回复的最大时间,如果超过2ms没有收到消息,主动方认为被动方已经收到ACK报文,置为CLOSED状态