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

TCP三次握手

2015-12-08 18:41 423 查看
tcp三次握手是面试中经常会被问到,因此,查看了《TCP/IP协议族》这本书后,对TCP的三次握手总结,如下图所示:



客户端程序发出的请求称为主动打开。
1、客户发送第一个报文段(SYN报文段),在这个报文段中只有SYN标志置为1。这个报文段的作用时同步序号。在本例中,客户端选择了一个随机数作为第一个序号,并把这个序号发送给服务器,这个序号称为初始序号(ISN)。这个报文段不包括确认号,也没有定义窗口大小。SYN报文段时一个控制报文段,它不携带任何数据,但是,它消耗一个序号。
2、服务器发送第二个报文段,即SYN+ACK报文段,其中的两个标志(SYN和ACK)置为1。这个报文段有两个目的,首先,它时另一个方向上通信的SYN报文段。服务器使用这个报文段来同步它的初始序号,以便从服务器向客户发送字节。其次,服务器还通过ACK标志来确认已收到来自客户端的SYN报文段,同时给出期望从客户端收到的下一个序号。因为这个报文段包含了确认,所以它序号定义接收窗口大小。
3、客户发送第三个报文段。这仅仅时一个ACK报文段。它使用ACK标志和确认号字段来确认收到了第二个报文段。请注意,这个报文段的序号和SYN报文段使用的序号一样。也就是说这个ACK报文段不消耗任何序号。客户还需要定义服务器的窗口大小。

为什么要使用三次握手,而不是两次?
1. TCP的三次握手最主要是防止已过期的连接再次传到被连接的主机。

如果采用两次的话,会出现下面这种情况。

比如是A机要连到B机,结果发送的连接信息由于某种原因没有到达B机;

于是,A机又发了一次,结果这次B收到了,于是就发信息回来,两机就连接。

传完东西后,断开。

结果这时候,原先没有到达的连接信息突然又传到了B机,于是B机发信息给A,然后B机就以为和A连上了,这个时候B机就在等待A传东西过去。

2. 三次握手改成仅需要两次握手,死锁是可能发生

考虑计算机A和B之间的通信,假定B给A发送一个连接请求分组,A收到了这个分组,并发送了确认应答分组。按照两次握手的协定,A认为连接已经成功地建立了,可以开始发送数据分组。可是,B在A的应答分组在传输中被丢失的情况下,将不知道A是否已准备好,不知道A建议什么样的序列号,B甚至怀疑A是否收到自己的连接请求分组。在这种情况下,B认为连接还未建立成功,将忽略A发来的任何数据分组,只等待连接确认应答分组。而A在发出的分组超时后,重复发送同样的分组。这样就形成了死锁
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: