tcp建立连接的三次握手

例如A请求与B建立连接,A会先给B发送一个数据包(第一次握手),这个数据包的ACK标志位=0,序列号seqx,表示还没从B中接收到消息,SYN标志位=1,表示要建立连接。 A进入SYN_SEND的状态

B收到A发的数据报后,就会进行确认,并向A发送一个数据包(第二次握手),这个数据包的ACK标志位为1,表示B收到了A序号为x的数据包,确认号ackx+1,序列号seqySYN标志位=1表示同意建立连接。  B进入SYN_RCVD状态

A收到B发送的数据包后,会再向B发送一个数据包(第三次握手),这个数据包的ACK标志位=1,表示A收到了B发出的数据包,确认号acky+1(表示下次希望收到序列号为y+1的数据包),序列号seqx+1(A所希望得到的),SYN标志位=0,表示已经建立连接。  AB进入ESTABLISHED状态,完成三次握手。

为何有第三次握手?

客户端向服务器发出建立连接的请求以及服务器向客户端确认这个请求,这两个数据包(前两次握手)足以证明客户端与服务器之间的网络是畅通的,并且协商数据通信所需要的参数。比如协商接收窗口大小,所支持的数据包最大字节数等。

如果没有最后一个数据包确认(第三次握手),A先发出一个建立连接的请求数据包,由于网络原因绕远路了。A经过设定的超时时间后还未收到B的确认数据包,于是发出第二个建立连接的请求数据包,这次网路通畅,数据包很快到达BB的确认数据包也很快就到达A。于是AB开始传输数据,过了一会A第一次发出的建立连接的请求数据包到达了BB以为是再次建立连接,所以又发出一个确认数据包。由于A已经收到了一个确认数据包,所以会忽略B发来的第二个确认数据包,但是B发出确认数据包之后就要一直等待A的回复,而A永远也不会回复。由此造成服务器资源浪费,这种情况多了B计算机可能就停止响应了。

第三次握手(第三个数据包)作用在于,告诉B计算机,B第二次握手发给A的确认数据包A收到了,是有效的。避免B计算机等待造成资源浪费。随后AB可进行下一步的通信。

原文地址:https://www.cnblogs.com/wl889490/p/12596805.html