使用TCP传输数据需要建立连接,而连接的端点并不是主机,也不是进程,而是叫做套接字(Socket)。
套接字由ip地址和端口号构成,即socket=(ip:端口号)。每一条TCP连接被通信两端的套接字唯一确定。
TCP建立连接时有三次数据传递,所以称为三次握手。三次握手的具体过程如图:
如图上的情况,加入客户端先发起一个连接,seq=100,但是因为某种原因该报文在网络中阻塞,没有到达服务端。
因为长时间没有收到服务端的回复,客户端将重新发起连接,seq=200。
如果此时seq=100的报文先到达了服务端,服务端将会返回ack=100+1的SYN/ACK报文。客户端收到该报文后会发现ack与自己期望的ack=200+1不同,因此客户端会发送RST报文中止这次连接。
当seq=200到达服务端后,就会正常地完成三次握手。
客户端单方面中止了重复的连接,但是服务端并不知道。如果seq=200在之后到达,连接会陷入混乱。
要确认双方的接收、发送能力,那么双方必须各作为发送方和接收方一次。既然这样就需要两个来回,即四次握手。
四次握手的中间两次都是从服务端到客户端的,既然如此可以将这两次握手合并,从而得到了精简的三次握手。
TCP连接的释放经历了四次数据传送,所以称为四次挥手。
假如我有一个朋友,我正在与他交流。我想说的话说完了,于是我提出了”我说完了“。朋友此时会回应他知道了,但是他可能没有说完。于是他讲继续讲,直到讲完后说”我也说完了,再见“。此时我再回复”再见“才表示此次交流结束了。
MSL(Max Segment Lifetime)最大报文生存时间,它是一个报文最长的存活时间。
加入客户端最后发送的ACK没有到达,那么服务端会认为是自己的FIN/ACK未送达,所以服务端会重发FIN/ACK。
网络正常的情况下,客户端的ACK最迟在1MSL后到达,服务端重发的FIN/ACK也是在1MSL后到达。
也就是说,从客户端收到FIN/ACK开始,到客户端接收到服务端第二次发送的FIN/ACK的时间不会超过2MSL。
所以客户端只需要等待2 MSL来处理服务端重发的FIN/ACK即可。
手机扫一扫
移动阅读更方便
你可能感兴趣的文章