【路由交换】 TCP协议工作原理及其报文格式详解

TCP协议

  1、协议介绍

        传输控制协议(Transmission  Control Protocol, TCP) 是一种可靠的、面向连接的字节流服务。源主机在传送数据前需要显赫目标主机建立连接。然后在此连接上,被编号的数据段按序收发。同时要求对每个数据段进行确认,这样保证了可靠性。如果在指定的时间内没有收到目标主机对所发数据段的确认,源主机将再次发送该数据段。

    (1)TCP的三种机制
        TCP建立在无连接的IP基础之上,因此使用了3种机制实现面向连接的服务。
        1)使用序号对数据报进行标记
            这种方式便于TCP接收服务在向高层传递数据之前调整失序的数据包。
        2)TCP使用确认、校验和定时器系统提供可靠性
            当接收者按照顺序识别出数据报未能到达或发生错误时,接收者将通知发送者:当接收者在特定时间没有发送确认信息时,那么发送者就会认为发送的数据包并没有到达接收方,这时发哦是那个这就会考虑重传数据。
        3)TCP使用窗口机制调整数据流量
            窗口机制可以减少因接收方缓冲区满而造成数据丢失数据报文的可能性。

    (2)TCP 报文首部格式

            

        源端口 (Source Port) 和目标端口 (Destination Port)
            该字段长度均为16位。TCP协议通过使用端口来标识源端和目标端的应用进程,端口号取值范围为0~65535。

        序列号 (Sequence Number)
            该字段长度为32位。因此序号范围为[0, 2^32 - 1]。序号值是进行 mod 2^32 运算的值,即序号值为最大值 2^32 - 1 后,下一个序列号又回到0。

        确认号 (Acknowledgement Number)
            该字段长度为32位。期望收到对方下一个报文段的第一个数据字段的序号。

        报头长度 (Header Length)
            报头长度又可以称为数据偏移 (Data Offset) 字段,长度为4位,单位32位。没有任何选项字段的 TCP 头部长度为 20 字节,最多可以有60 字节的 TCP 头部。

        保留字段 (Reserved)
            该字段长度为6位,通常设置为0。

        标记 (Flag)
            该字段包含的字段有:紧急 (URG)—紧急有效,需要尽快传送;确认 (ACK)—建立连接后的报文回应,ACK 设置为1;推送 (PSH)—接收方应该尽快将这个报文段交给上层协议,不需等缓存满;复位 (RST)—重新连接;同步 (SYN)—发起连接;终止 (FIN)—释放连接。

        窗口大小 (Windows Size)
            该字段长度为16位。因此序号范围为[0 , 2^16 - 1]。该字段用来进行流量控制,单位为字节,是作为接收方让发送方设置其发送窗口的依据。这个值是本机期望一次接收的字节数。

        校验和  (Checksum)
            该字段长度为16位,对整个TCP报文段(即TCP头部和TCP数据)进行校验和计算,并由目标端进行验证。

        紧急指针 (Urgent Pointer)
            该字段长度为16位。它是一个偏移量,和序号字段中的值相加表示紧急数据最后一个字节的序号。

        选项 (Option)
            该字段长度可变到40字节。可能包括窗口扩大因子、时间戳等选项。为保证报头长度是32位的倍数,因此还需要填充0。

        填充 (Padding)
            这个字段中加入额外的零,以保证 TCP 头是 32 位的整数倍。

        数据 (Data)
            从技术上讲,它并不是 TCP 头的一部分,但应该了解到,数据字段位于紧急指针和选项字段之后,填充字段之前,字段的大小是最大的 MSS,MSS 可以在源和目的机器之间协商,数据段可能比 MSS 小,但却不能比 MSS 大。


    (3)TCP建立连接
        TCP 会话通过三次握手 (Three-Way Handshake) 来建立连接。三次握手的目标是使数据段的发送和接收同步,同时也向其他主机表明其一次可接收的数据量(窗口大小)并建立逻辑连接。这三次握手的过程可以简述如下:

        双方通信之前均处于CLOSED状态。
        1)第一次握手
            源主机发送一个同步标志位 SYN=1 的 TCP 数据段。此段中同时标明初始序号 (Initial Sequence Number, ISN) 。ISN 是一个随时间变化的随机值,即 SYN=1 , SEQ=x 。源主机进入 SYN_SENT 状态。
        2)第二次握手
            目标主机接收到 SYN 包后发挥确认数据报文。该数据报文 ACK=1 ,同时确认号字段表明目标主机期待收到源主机下一个数据段的序号,即 ACK=x+1 (表明前一个数据段已收到且没有错误)。
            此外,在此段中设置 SYN=1 ,并且包含目标主机的段初始序号 y ,即 ACK=1 ,确认序号 ACK=x+1 ,SYN=1 ,自身序号 SEQ=y 。此时目标主机进入 SYN-RCVD 状态,源主机进入 ESTABLISHED 状态。

        3)第三次握手
            源主机再回送一个确认数据段,同样带有递增的发送序号和确认序号 (ACK=1 , 确认序号 ACK=y+1 , 自身序号 SEQ) ,TCP 会话的三次握手完成。接下来,源主机和目标主机可以互相收发数据。

        三次握手过程的图示如下
            

    (4)TCP释放连接
        TCP释放连接的过程可以分为四步,具体过程如下:
        双方通信前均处于 ESTABLISHED 状态。
        1)第一步:源主机发送一个释放字段(FIN=1,自身序号 SEQ=x ),源主机进入 FIN-WAIT状态。

        2)第二布:目标主机接收报文后发出确认报文(ACK=1,确认报文 ACK=x+1,自身序号 SEQ=y),目标主机进入 CLOSED-WAIT 状态。此时,源主机停止发送数据,但是目标主机仍然可以发送数据,此时 TCP 为半关闭状态 (HALF-CLOSE)。源主机接收到 ACK 报文后等待目标主机发出 FIN 报文,这可能会持续一段时间。

        3)第三步:目标主机确定没有数据,向源主机发送后,发出释放报文(FIN=1ACK=1,确认序号 ACK=x+1,自身序号 SEQ=z )。目标主机进入 LAST-ACK 状态。
        (注意:这里由于可能处于半关闭状态(HALF-CLOSED),目标主机还会发送一些数据,其序号不一定为 y+1,因此可以设为 z 。而且,目标主机必须重复发送一次确认序号 ACK=x+1

        4)第四步:源主机接收到释放报文后,对此发送确认报文(ACK=1,确认序号 ACK=z+1,自身序号 SEQ=x+1),在等待一段时间确定确认报文到达后,源主机进入 CLOSED 状态。目标主机在接收到确认报文后,也进入 CLOSED 状态。

        释放连接的过程如下图所示:

            

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值