您的位置:首页 > 理论基础 > 计算机网络

关于TCP的三次握手建立连接

2015-12-16 17:08 513 查看
先讲理论

我们知道TCP建立连接需要采用3次握手,如下图所示(该图来自TCP/IP协议族第4版)(这幅图作者可能有个笔误,下面会讲):



可以看到三次握手之前服务器端有个被动打开,这应该是服务器的准备过程,使它能够接受客户端的TCP连接。

下面开始三次握手的过程。

在上图中首先客户端发送一个SYN报文作为同步序号(synchronization)来确保客户端和服务器端的通信按次序传输,同时有一个序号seq(在TCP连接中传送的字节流中的每一个字节都按顺序编号,SYN报文段虽然不携带任何数据,不过还是会消耗一个序号)。

服务器端收到这个报文后返回一个SYN+ACK报文,其中SYN是服务器用来同步它的初始序号的,ACK(acknowledgement)告诉客户端它收到了客户端发来的SYN报文,同时ack = seq+1(表示它希望收到对方下一个报文段的第一个数据字节的序号),并且也产生了一个序号seq。可以看到还有一个接受窗口(rwnd)值,这个值用来告诉对方,从本报文段首部中的确认号算起,接收方目前允许对方发送的数据量,有时间写篇流量控制的文章再详细说这个问题。

最后客户端发送ACK报文段,通过ACK标志和确认号字段ack(客户端) = seq(服务器端) + 1来告诉服务器收到了服务器的报文段。不过可以看到上图中seq还是8000,应该有问题,因为SYN报文段消耗了一个序号了,我查了些其它书,都是加了1的,所以这应该是作者的笔误。 rwnd值含义同上。

理论讲完了。。下面眼见为实。。我们来抓个包。



可以看到第一个报文段的seq = 0,第三个报文段的seq = 1,也验证了应该加1的说法。

现在我们可以考虑下为什么要三次握手吧。。。

可以想象下两个人站在一条河的两岸,他们要进行通信,一般的过程是怎么样的?

小王问小明:小明,你听得到我说话吗?

小明回答:我听得到,那你听得到我说话吗?

小王回答:我也听得到。

这样可以可以保证A->B以及B->A的通信线路都没问题。

还看到个原因是第三次的确认可以避免下面这种情况,A发送了个连接请求报文段给B,不过因为一些原因,这个报文段在路上滞留了,根据超时重传,A又重传了一次连接请求,并顺利建立了连接,不过后来那个滞留的报文段又传到了B,如果只用两次握手,B发了个ACK + SYN给A,连接就建立了,然后B在那苦等A那根本不会来的数据,白白浪费了资源,而三次握手就可以解决这个问题,因为在这种情况下A不会发ACK报文给B,连接就无法建立。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: