TCP协议的三次握手及四次挥手

TCP(Transmission Control Protocol,传输控制协议),它是一种面向连接的、可靠的、全双工、基于字节流的传输层通信协议。

传输层接收应用层传过来的字节流数据,将这些数据进行分段打包,以TCP报文的形式传给网络层,由IP协议承载这些TCP报文。

三次握手(Three-way Handshake)和四次挥手(Four-way Handshake)都是基于TCP报文创建和关闭的连接。

TCP报文:

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDI3ODUxMg==,size_16,color_FFFFFF,t_70

源端口号(Source Port):发送端报文的端口号,标识发送源端口以。

目的端口号(Destination Port):接收端目的端口号,标识接收目的端口。

           *注意:TCP报文中的源端口号和目的端口号同IP数据报中的源IP和目的IP,建立了网络中唯一的一条连接。

序号(Sequence Number):当前报文的序号,在一次数据传送过程中(一次数据传输可能有多个TCP报文,序号一般为当前报文数据的第一个字节的序列号,这个序列号在一次数据传送过程中是唯一的。在建立连接和关闭连接时序号是随机值)是唯一的。

确认序号(Acknowledgment Number):确认收到报文,并标识下一个希望收到的报文(建立连接和关闭理解时由于不携带数据,确认序号为 发送方报文序号+1 ,当传送数据时,确认序号为: 发送方报文序号+偏移量(多少字节的数据))

控制位:(0|1)

            ACK:确认位,当为1时,确认序号才有效。

            SYN : 同步位,指的是要求同步自己的序号,即请求连接。

            FIN:结束位,指当前方数据已经发送完毕,没有数据可以发送了,要求关闭连接。

三次握手(Three-way Handshake)

三次握手指的是在需要建立连接的时候,需要双方发送三个TCP报文才能确认连接,如下图:

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDI3ODUxMg==,size_16,color_FFFFFF,t_70*大写表示控制位,小写表示序号。

第一次握手:由主动方发送SYN报文。表示请求建立连接,初始自己的序号X(这个序号是随机值)。

第二次握手:被动方接收到SYN报文,如果在可连接的情况下,发送SYN+ACK报文(表示接受到主动方的报文,并需要同步自己的序号),初始自己的序号Y(随机值),并将确认序号设置为X+1,表示希望收到下一个报文的序号。

第三次握手:主动方收到被动方的SYN+ACK报文,ACK=1且ack=X+1表示被动方已经确认主动方可以建立连接。然后主动方发送ACK报文,序号为X+1,确认序号为Y+1。当被动方收到这个报文的时候,ACK=1且ack=Y+1,表示主动方已经确认被动方可以建立连接。这个时候双方都已经确认可以建立连接,于是连接就由此建立。

三次握手实际上就是一次:请求→确认+请求→确认。

四次挥手(Four-way Handshake)

四次挥手指的是在需要建立连接的时候,需要双方发送四个TCP报文才能确认连接,如下图:

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDI3ODUxMg==,size_16,color_FFFFFF,t_70

第一次挥手:主动方发送FIN报文,表示主动方的数据发送完了,已经没有数据可以发送了。初始序号为X。

第二次挥手:被动方接收到主动方的FIN报文,如果确认接收完毕,发送ACK报文,表示确认数据接收完毕。初始序号为Y,去人序号为X+1(这次ack表示确认)

            *这个时候主动方接收到被动的ACK报文后并不会发送报文,需要被动方发送FIN报文后才能够发送ACK报文。

第三次挥手:当被动方没有数据可发送的时候,被动方发送FIN+ACK报文,并重设自己的序号为Z,表示和第二次挥手不是同一个报文,ack设为X+1(这次ACK表示希望收到的报文序号)

第四次挥手:当主动方接收到被动方的FIN+ACK报文后,确认自己已经完全接收数据以后发送ACK报文(序号为X+1 确认序号为Z+1)。当被动端接到这个ACK报文后,确认主动端也接收数据完毕。这个时候,确认双方都已经发送和接收数据完毕,连接就可以断开了。

四次挥手实际就是:请求→确认      请求→确认。

为什么连接三次、断开四次?

在连接时是没有在传送和接收数据的,SYN和ACK报文可以同时发送。在断开连接时,主动端发送FIN报文表示没有数据可以发送了,但可以接收数据。被动端接收到FIN报文后,先确认自己接收数据完了,但有可能自己的数据还没有发送完,所以先发送一个ACK报文,确认自己已经接收完了。等到自己的数据发送完之后,再发送FIN报文,表示被动端已经没有数据可以发送了,主动端接收到FIN报文后,确认已经接受完数据,就返回ACK报文,确认被动端也可以关闭连接了。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值