一、三次握手
三次握手是所建立连接可靠性的重要保障
1. 流程图解
2. 三次握手原理及为什么需要三次握手
三次握手可保证发送方确保自己及接收方的发送读写功能正常,接收方确保自己及发送方的读写功能正常,同时可以防止重复建立连接
- 第一次client发送SYN数据包给server,server收到数据包之后确认自己接收正常,client发送正常
- server返回一个SYN/ACK数据包给client,确认***为client的顺序号+1,client收到后确认自己发送,接收正常,server接收、发送正常
- server收到clinet的ACK数据包,其中seq为自己上次数据包的ack值,ack为上次seq+1,server确认自己接收、发送正常,client接收发送正常
- 连接建立
二、四次挥手
由于TCP是全双工的,面对这种双端都要进行单方向关闭的半关闭情况,四次挥手起到了很好的作用
1. 流程图解
2. 流程说明
- A端发起关闭,发送一个FIN包给到B,seq为x,B收到后确认了A要进行关闭
- B端发送了一个确认关闭的ACK包给到A端,表示B端收到了A的关闭请求,之后B可以向A发送完自己的数据
- 数据发送完成后,B端发送一个FIN包给A,请求关闭连接,A收到之后确认了B已经可以关闭
- A发送一个确认关闭的ACK包给到B,B收到后进行关闭,A发送完成后等待2MSL(2倍数据段可生存最大时间)后关闭
3. 为什么要四次
第一次A发送是请求关闭连接的开始,B收到后返回一个确认包,但B 可能还有数据需要发送给A,所以还不能发送请求关闭连接包,待得B把需要发送的数据发完之后,B发送一个FIN包表示自己话说完了,可以关闭连接,A收到后返回一个确认,表示了解,之后就关闭连接
4. 为什么需要等到2MSL
A发送给B的确认包可能会因为网络原因丢失从而导致B重传FIN包,A则需要重发确认包,以免导致A关闭,B未关闭,造成资源浪费。同时等待2MSL可以使得本链接上的所有数据段全部消亡,以免对下一次连接产生影响