TCP通信协议( 四 )


TCP通信协议

文章插图
即两次握手会造成消息滞留情况下,服务器重复接受无用的连接请求 SYN 报文,而造成重复分配资源 。
TCP四次挥手
第一次挥手:FIN=1,seq=u,发送完毕后客户端进入FIN_WAIT_1 状态
第二次挥手:ACK=1,seq =v,ack=u+1,发送完毕后服务器端进入CLOSE_WAIT 状态,客户端接收到后进入 FIN_WAIT_2 状态
第三次挥手:FIN=1,ACK=1,seq=w,ack=u+1,发送完毕后服务器端进入LAST_ACK状态,客户端接收到后进入 TIME_WAIT状态
第四次挥手:ACK=1,seq=u+1,ack=w+1,客户端接收到来自服务器端的关闭请求,发送一个确认包,并进入 TIME_WAIT状态,等待了某个固定时间(两个最大段生命周期,2MSL,2 Maximum Segment Lifetime)之后,没有收到服务器端的 ACK,认为服务器端已经正常关闭连接,于是自己也关闭连接,进入 CLOSED 状态 。服务器端接收到这个确认包之后,关闭连接,进入 CLOSED 状态
TCP通信协议

文章插图
四次挥手过程:
客户端打算关闭连接,此时会发送一个 TCP 首部 FIN 标志位被置为 1 的报文,也即 FIN 报文,之后客户端进入 FIN_WAIT_1 状态
服务端收到该报文后,就向客户端发送 ACK 应答报文,接着服务端进入 CLOSED_WAIT 状态
客户端收到服务端的 ACK 应答报文后,之后进入 FIN_WAIT_2 状态
等待服务端处理完数据后,也向客户端发送 FIN 报文,之后服务端进入 LAST_ACK 状态
客户端收到服务端的 FIN 报文后,回一个 ACK 应答报文,之后进入 TIME_WAIT 状态
服务器收到了 ACK 应答报文后,就进入了 CLOSE 状态,至此服务端已经完成连接的关闭
客户端在经过 2MSL 一段时间后,自动进入 CLOSE 状态,至此客户端也完成连接的关闭
为什么挥手需要四次?
再来回顾下四次挥手双方发 FIN 包的过程,就能理解为什么需要四次了 。
关闭连接时,客户端向服务端发送 FIN 时,仅仅表示客户端不再发送数据了但是还能接收数据 。
服务器收到客户端的 FIN 报文时,先回一个 ACK 应答报文,而服务端可能还有数据需要处理和发送,等服务端不再发送数据时,才发送 FIN 报文给客户端来表示同意现在关闭连接 。
从上面过程可知,服务端通常需要等待完成数据的发送和处理,所以服务端的 ACK 和 FIN 一般都会分开发送,从而比三次握手导致多了一次 。
TCP优化
正确有效的使用TCP参数可以提高 TCP 性能 。以下将从三个角度来阐述提升 TCP 的策略,分别是:
TCP三次握手优化
TCP通信协议

文章插图
TCP四次挥手优化
TCP通信协议

文章插图
TCP数据传输优化
TCP通信协议

文章插图
常见问题
TCP和UDP
TCP和UDP的区别?
连接TCP 是面向连接的传输层协议,传输数据前先要建立连接UDP 是不需要连接,即刻传输数据
服务对象TCP 是一对一的两点服务,即一条连接只有两个端点UDP 支持一对一、一对多、多对多的交互通信
【TCP通信协议】可靠性TCP 是可靠交付数据的,数据可以无差错、不丢失、不重复、按需到达UDP 是尽最大努力交付,不保证可靠交付数据
拥塞控制、流量控制TCP 有拥塞控制和流量控制机制,保证数据传输的安全性UDP 则没有,即使网络非常拥堵了,也不会影响 UDP 的发送速率
首部开销TCP 首部长度较长,会有一定的开销,首部在没有使用「选项」字段时是 20 个字节,如果使用了「选项」字段则会变长的UDP 首部只有 8 个字节,并且是固定不变的,开销较小
传输方式TCP 是流式传输,没有边界,但保证顺序和可靠UDP 是一个包一个包的发送,是有边界的,但可能会丢包和乱序
分片不同TCP 的数据大小如果大于 MSS 大小,则会在传输层进行分片,目标主机收到后,也同样在传输层组装 TCP 数据包,如果中途丢失了一个分片,只需要传输丢失的这个分片UDP 的数据大小如果大于 MTU 大小,则会在 IP 层进行分片,目标主机收到后,在 IP 层组装完数据,接着再传给传输层,但是如果中途丢了一个分片,则就需要重传所有的数据包,这样传输效率非常差,所以通常 UDP 的报文应该小于 MTU
ISN
① 为什么客户端和服务端的初始序列号 ISN 是不相同的?
如果一个已经失效的连接被重用了,但是该旧连接的历史报文还残留在网络中,如果序列号相同,那么就无法分辨出该报文是不是历史报文,如果历史报文被新的连接接收了,则会产生数据错乱 。所以,每次建立连接前重新初始化一个序列号主要是为了通信双方能够根据序号将不属于本连接的报文段丢弃 。另一方面是为了安全性,防止黑客伪造的相同序列号的 TCP 报文被对方接收 。


推荐阅读