• 【网络协议】TCP报文格式


    1.源端口和目的端口

    源端口字段占16比特,用来写入源端口号。源端口号用来标识发送该TCP报文段的应用进程。

    目的端口字段占16比特,用来写入目的端口号。目的端口号用来标识接收该TCP报文段的应用进程。

    2.序号

    当序号增加到最后一个时,下一个序号又回到0。序号字段的值用来指出本TCP报文段数据载荷的第一个字节的序号。

    3.确认序号

    指出期望收到对方下一个TCP报文段的数据载荷的第一个字节的序号,同时也是对之前收到的所有数据的确认。

    只有当ACK置为1时,确认号字段才有效,ACK取值为0时,确认号字段无效。TCP规定:在TCP连接建立后所有传送的TCP报文段都必须把ACK置1。

    4.首部长度

    该字段以4字节为单位,用来指出TCP报文段的有效载荷部分的起始处距离TCP报文段的起始处有多远,这实际上指出了TCP报文段的首部长度。

    5.保留字段

    保留字段占6比特位,保留为今后使用,目前应置为0。

    6.窗口字段

    用来指出发送本报文段的一方的接收窗口的大小,即接收缓存的可用空间大小,这表征接收方的接受能力.可以使用接收方接受能力的大小来控制发送方的数据发送量,这就是所谓的流量控制.

    7.校验和

    检查整个TCP报文段在传输过程中是否出现了误码。

    8.标志位

    (1)SYN

    同步标志位(SYN)用于TCP双方建立连接。

    (1)当SYN=1且ACK=0时,表明这是一个TCP连接请求报文段。

    (2)若对方同意建立连接,则应在响应的TCP报文段的首部中使SYN=1且ACK=1。

    综上所述,SYN为1的报文段要么是一个连接请求报文段,要么是一个连接响应报文段。

    (2)FIN

    终止标志位(FIN)用于释放TCP连接。

    当FIN=1时,表明此TCP报文段的发送方已经将全部数据发送完毕,现在要求释放TCP连接。

    (3)RST

    复位标志位(RST)用于复位TCP连接。

    当RST=1时,表明TCP连接中出现严重差错(例如由于主机崩溃或其他原因),必须释放连接,然后再重新建立连接。

    RST置1也可以拒绝一个非法的TCP报文段或拒绝打开一个TCP链接。

    (4)PSH

    推送标志位(PSH)用于提醒对方尽快将报文交付给应用层。

    出于效率的考虑,TCP可能会延迟发送数据或向应用程序延迟交付数据,这样可以一次处理更多的数据(返回的ACK报文中窗口大小会更大)。但是当两个应用进程进行交互式的通信时,有时在一端的应用进程希望在键入一个命令后立即就能够收到对方的响应。在这种情况下,应用程序可以通知TCP使用推送(PUSH)操作。

    发送方TCP把PSH置为1,并立即创建一个TCP报文段发送出去,而不需要积累到足够多的数组在发送。

    接收方TCP收到PSH为1的TCP报文段,就尽快交付给应用进程,而不再等到接收到足够多的数据在发送。

    (5)ACK
    只有当ACK置为1时,确认号字段才有效,ACK取值为0时,确认号字段无效。TCP规定:在TCP连接建立后所有传送的TCP报文段都必须把ACK置1。
    (6)URG

    当URG置为1时,紧急指针字段有效;当URG置为0时,紧急指针字段无效。

    16位紧急指针以字节为单位,用来指明紧急数据的长度。

    当发送方有紧急数据时,可将紧急数据“插队”到发送缓存的最前面,并立即封装到一个TCP报文段中进行发送。紧急指针会指出本报文段数据载荷部分包含了多长的紧急数据,紧急数据之后是普通数据。

    接收方收到紧急标志位为1的TCP报文段,会按照紧急指针字段的值从报文段数据载荷中取出紧急数据并直接上交应用进程,而不必在接收缓存中排队。

    9.选项:

    TCP报文段首部除了20字节的固定部分,还有最大40字节的选项部分。增添选项可以增加TCP的功能。

    最大报文段长度(Maximum Segment Size,MSS)选项:

    不要被最大报文段长度的名称所误导,MSS用来指出的是TCP报文段有效载荷部分的最大长度,而不是整个TCP报文段的长度。MSS的选择并不简单。
    >若选择较小的MSS,网络的利用率就会降低。设想在极端的情况下,TCP报文段只包含1字节的数据载荷,但有20字节的TCP首部,在网络层封装成IP数据报时又会添加20字节的IP首部,为了传输1字节的数据,额外要传输共40字节的 TCP首部和IP首部,到了数据链路层还要加上一些开销,因此网络的利用率不会超过1/40。
    >若选择很大的MSS,则TCP报文段在网络层封装成IP数据报时,有可能要分片成多个短的数据报片。在目的站要将收到的各个短数据报片装配成原来的TCP报文段,当传输出错时还要进行重传,这些都会使开销增大。
    一般认为,TCP报文段的MSS应尽可能大些,只要在网络层将TCP报文段封装成IP数据报时不需要分片就行。在TCP连接建立的过程中,双方可以将自己能够支持的MSS写入该字段中。在以后的数据传输阶段,MSS取双方提出的较小的那个数值。若主机未填写这一项,则MSS的默认值是536。因此,所有在因特网上的主机都应能够接受的TCP报文段的长度为20+536=556字节。

    窗口扩大选项:

    用来扩大窗口,提高吞吐率。

    时间戳选项:有以下两个功能

    >用于计算往返时间(RTT)

    >用来处理序号超范围的情况,又称为防止序号绕回。

    选择确认选项:

    用来实现选择确认功能。

  • 相关阅读:
    M91快速霍尔测量仪—在更短的时间内进行更好的测量
    【硬核攻略】SQL Server全接触:手把手教你驾驭数据库巨轮,驶向高效查询的星辰大海!
    理解 Memory barrier(内存屏障),值得大家收藏
    Git基本概念与使用
    63 x的平方根
    近世代数——Part2 群:基础与子群
    信奥中的数学:整除
    网络运维与网络安全 学习笔记2023.11.21
    使用Github Actions自动同步到Gitee仓库
    揭秘C语言的心脏:深入探索指针与数组的奥秘
  • 原文地址:https://blog.csdn.net/zzxz8/article/details/133390167