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

[计算机网络笔记]第三部分——传输层之TCP 连接建立与拆除的过程

2016-11-16 13:40 661 查看
TCP连接的建立与拆除(三次握手与四次挥手):

 三次握手:是为了确定双方都确切地连接到了一起。

 三次握手过程:

客户端发起连接,发送SYN=1的TCP报文,序号随机产生,这里为了方便我们将其设为0,即Seq=0,SYN=1

服务器接收到客户端的报文,同意建立连接,发送响应报文,响应报文中SYN=1,序号依旧随机,我们为了方便也将其设为100,同时响应报文还需携带ACK确认信息,标识位(小写ack)ack=1,确认号(大写ACK)是请求报文序号+1=1,即Seq=100,SYN=1,ACK=1

客户端收到服务器响应,需要返回接收确认报文,但不再需要SYN标识位置1,ACK确认号为对方上一次响应报文的序号+1=11,本报文的序号=对方上一次响应报文的ACK=1,即Seq=1,ACK=11

注意:

其实三次握手并不能确保连接一定建立成功,但是更多次数的开销太大

而且三次握手并不是公平的,客户端,也就是发起连接的一端应当是承担了更大风险的,例如当三次握手的第三次丢包了,此时客户端已经建立了并且要维护TCP连接,但服务器却因为没有收到第三次报文而超时,取消建立连接。但是我们需要让服务器承担更小的负担和风险,所以默认这样做。

三次握手并不是每一次SYN都是1,只有前两次SYN=1,第三次SYN=0,第三次只是普通的ACK报文

现在的TCP,为了节约时间,可以在三次握手的第三次,也就普通的ACK报文中携带数据,也就是三次握手不再单纯地建立连接,也有了发送数据的功能

在三次握手的时候,在前两次TCP报文没有携带数据,而携带了首部SYN=1,但是ACK也是要+1的,即消耗了序号Seq,而在三次握手之后,使用TCP连接,如果没有发送数据,比如只是单纯地响应回复ACK报文,是不消耗序号Seq的。

 四次挥手:实质上是一方断开连接*2,因为TCP是全双工的,即双方可以同时收发数据而不受干扰,因而允许一方关闭TCP连接不再发送数据而另一方没有关闭连接继续发送,所以,一次完整的TCP连接的拆除需要双方都关闭连接。

 四次挥手过程:

客户端(其实服务端也行)发送关闭连接的报文,其中FIN=1,为了方便我们假设这个报文的序号是100,即FIN=1,Seq=100

服务器接收到关闭连接的请求报文,发送响应报文,其中FIN不设置,也就是为0,只有确认号ACK=对方上一次请求报文序号+1=101,ack标识=1,为了方便,我们假设服务器序号Seq=200,即ack=1,ACK=101,Seq=200

客户端接收到服务器的响应报文,至此,客户端已经关闭了TCP连接,客户端不能再通过这个TCP连接发送数据了,但是可以接收数据,和返回ACK报文

服务器有数据就继续发送,如果没有了,要关闭连接了,进入四次挥手的第二阶段,也就是第三次挥手,服务器发送FIN=1,Seq=200的连接关闭请求报文

客户端响应服务器的请求报文,发送ACK确认响应,其中FIN不设置,也就是为0,ack标识=1,ACK确认号=请求报文序号+1=201,序号Seq=上一次ACK报文的ACK=101

服务器接收到客户端的响应报文,至此双方的连接都关闭了

注意:

四次挥手只有第一次,第三次的FIN标识是1,剩余两次只是单纯的ACK确认响应报文

存在这样的情况,只一方关闭连接,即只完成了两次挥手,然后另一方还在发送数据,关闭连接的一方还接收数据的情况。

 TCP三次握手、四次挥手和发送数据的时序图(以上面的数据为例)



 说明:

1-3是三次握手的过程

4-7是连接建立之后互相发送数据的过程

8-11是四次挥手的过程

3只是一个单纯的ACK响应,同时从3-4可以看出,单纯的ACK响应是不消耗序号的,3与4的序号相同

在连接建立之后,发送数据时,响应报文ACK=对方的报文的Seq+Data=下一次对方发送报文的Seq

8-9是A关闭对B的连接,但是B还没有关闭对A的连接,也就是说在9-10之间,B还可以向A发送数据

真实情况中,TCP是使用流水线的(不等待对方的ACK报文,持续发送),而不是像上图一样等停(等待收到对方的响应报文之后才再次发送),流水线的情况和上图区别主要在对冗余ACK的处理上流水线的会更复杂一些。前面提到的TCP可靠传输的实现的第7点说到了冗余ACK的问题。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐