精华内容
下载资源
问答
  • TCP头部格式和封装

    千次阅读 2020-04-15 23:53:39
    文章目录12.3 TCP头部和封装12.3.1 端口号12.3.2 序列号12.3.3 头部长度12.3.4 相关控制位12.3.5 窗口大小12.3.6 校验和12.3.7 选项字段 12.3 TCP头部和封装 ​ 下图显示了TCP在IP数据报中的封装: ​ TCP头部紧跟...

    12.3 TCP头部和封装

    ​ 下图显示了TCP在IP数据报中的封装:
    在这里插入图片描述
    ​ TCP头部紧跟着IP头部或者IPv6扩展头部,经常是20字节(默认不带选项字段)。带选项字段的话,TCP头部最长可达60字节。常见的选项字段包括最大段大小时间戳窗口缩放选择性ACK等。

    ​ TCP的头部要比UDP等协议的复杂的多,因为保持连接的每一段都需要支持最新的状态信息。TCP头部格式如下图所示:
    在这里插入图片描述

    TCP头部的标准长度为20字节,除非出现选项字段。头部长度字段以4字节为单位给出头部大小(最小值为5)。带阴影的字段(确认号(Acknowledagment Number)、窗口大小(Window Size)以及ECE位和ACK位)用于与该报文段的发送方关联的反方向上的数据流。

    字段长度含义
    源端口16比特源端口,标识哪个应用程序发送
    目的端口16比特目的端口,标识哪个应用程序接收
    序列号32比特序号字段。TCP链接中传输的数据流中每个字节都编上一个序号。序号字段的值指的是本报文段所发送的数据的第一个字节的序号。
    确认号32比特确认号,是期望收到对方的下一个报文段的数据的第1个字节的序号,即上次已成功接收到的数据字节序号加1。只有ACK标识为1,此字段有效。
    首部长度4比特首部长度指出TCP报文段的数据起始处距离TCP报文段的起始处有多远,以32比特(4字节)为计算单位。最多有60字节的首部,若无选项字段,正常为20字节。
    保留位4比特必须填0
    CWR1比特拥塞窗口减(发送方降低它的发送速率)
    ECE1比特ECN回显(发送方收到一个更早的拥塞通告)
    URG1比特紧急指针有效标识。它告诉系统此报文段中有紧急数据,应尽快传送(相当于高优先级的数据)。很少被使用
    ACK1比特确认序号有效标识。只有当ACK=1时确认号字段才有效。当ACK=0时,确认号无效。
    PSH1比特标识接收方应该尽快将这个报文段交给应用层。接收到PSH = 1的TCP报文段,应尽快的交付接收应用进程,而不再等待整个缓存都填满了后再向上交付。
    RST1比特重建连接标识。当RST=1时,表明TCP连接中出现严重错误(如由于主机崩溃或其他原因),必须释放连接,然后再重新建立连接。
    SYN1比特同步序号标识,用来发起一个连接。SYN=1表示这是一个连接请求或连接接受请求。
    FIN1比特发端完成发送任务标识。用来释放一个连接。FIN=1表明此报文段的发送端的数据已经发送完毕,并要求释放连接。
    窗口大小16比特窗口:TCP的流量控制,窗口起始于确认序号字段指明的值,这个值是接收端正期望接收的字节数。窗口最大为65535字节。
    校验和16比特校验字段,包括TCP首部和TCP数据,是一个强制性的字段,一定是由发端计算和存储,并由收端进行验证。在计算检验和时,要在TCP报文段的前面加上12字节的伪首部
    紧急指针16比特紧急指针,只有当URG标志置1时紧急指针才有效。TCP的紧急方式是发送端向另一端发送紧急数据的一种方式。紧急指针指出在本报文段中紧急数据共有多少个字节(紧急数据放在本报文段数据的最前面)。
    选项选项字段。TCP协议最初只规定了一种选项,即最长报文段长度(数据字段加上TCP首部),又称为MSS。MSS告诉对方TCP“我的缓存所能接收的报文段的数据字段的最大长度是MSS个字节”。 新的RFC规定有以下几种选型:选项表结束,无操作,最大报文段长度,窗口扩大因子,时间戳。 窗口扩大因子:3字节,其中一个字节表示偏移值S。新的窗口值等于TCP首部中的窗口位数增大到(16+S),相当于把窗口值向左移动S位后获得实际的窗口大小。 时间戳:10字节,其中最主要的字段是时间戳值(4字节)和时间戳回送应答字段(4字节)。 选项确认选项:

    12.3.1 端口号

    ​ 每一个TCP头部都包含了源端口和目的端口。这两个值与IP头部中的源和目的IP地址唯一标识一个连接(四元组)。这个特点在TCP服务器同时与多个客户端提供服务时特别重要,服务器就是根据四元组信息(或者五元组信息)来确定客户端的。

    12.3.2 序列号

    用于判断接收方是否重复接收到某一报文以及报文的乱序重组功能

    ​ 该字段标识了TCP发送端到TCP接收端的数据流中的一个字节,该字节代表着包含该序列号报文段的数据中的第一个字节。如果我们考虑在两个应用程序之间的一个方向上流动数据流,TCP给每一个字节赋予一个序列号。这个序列号是一个32位的无符号整数,到达2^32 -1 后再循环从0开始。因为每一个没交换的字节都被编号,确认号字段(ACK位置1,确认号字段生效)包含的值是数据的接收方(即ACK的发送方)期待接收到的下一个序列号。即最后被成功接收的数据字节序号加1。这个字段之后再ACK位被启动的情况才有效。

    • 当建立一个连接时,从客户端发送至服务器的第一个报文段中的SYN位字段被启用。这样的报文段简称为SYN;并且序列号字段包含了在这个方向上要是用的第一个序列号后续的序列号和返回的ACK都在这个方向上

      • 注意:这个初始的序列号不是0或1,而是随机生成的一个数值,成为初始序列号(Inital Sequence Number, 简称ISN), ISN不是0/1,是为了提高安全性,防止被黑客攻击利用。

      • 客户端发送的第一个报文时,第一个字节的序列号为ISN+1, 这意味着SYN报文消耗一个序列号,而消耗一个序列号意味着可以使用重传机制进行可靠传输。因此SYN、以及FIN报文是可以可靠传输的,而ACK报文不消耗序列号,因此无法保证ACK报文的可靠传输

    • TCP可以被描述为“一种带积累正向确认的滑动窗口协议”。ACK确认号字段被用于构建知名在接收方已经顺序收到的最大字节(确认号 -1 = 成功接收的字节)。然而现代的TCP有一个选择确认(Selective Acknowledgment, SACK)选项,可以允许接收方告诉发送方它正确的接收到的次序杂乱的数据。 当它与一个具有选择重发(selective repeat)能力的TCP进行通信时,可以显著的提高通讯效率。

    12.3.3 头部长度

    ​ 头部长度用来指出TCP头部的长度,以32比特为单位,由于存在选项字段,因此它是必须的。它的长度为4比特,因此TCP头部的长度限定为20~60字节(15*4=60),如果不带选项字段,即标准头部长度为20字节。

    12.3.4 相关控制位

    ​ 当前,为TCP头部定义了8位的字段,尽管有些老的实现只能理解最后的6位。

    • CWR : 拥塞窗口减(发送方减低它的发送速率)
    • ECE : ECN回显(发送方接收到了一个更早的拥塞通告)
    • URG : 紧急(紧急指针字段有效,很少被用到)
    • ACK : 确认 (确认号字段有效,连接建立后一般都处于启用状态)
    • PSH : 推送 (接收方应尽快给应用程序发送这个数据,目前没有可靠地实现或者用到)
    • RST : 重置连接 (当前连接关闭,重新建立新的连接)
    • SYN : 用于初始化一个连接的同步序列号
    • FIN : 该报文的发送方已经没有数据要发送,请求对方关闭当前连接。

    12.3.5 窗口大小

    ​ TCP的流量控制是通过通告窗口大小来控制实现的。这个窗口大小是指字节数,从确认号指定的,也就是从接收方想要接收的那个数据开始计算的。它是一个16比特的字段,因此限定了TCP的窗口大小最大为65535字节,从而限制了TCP的吞吐量性能。这个值可以通过窗口缩放手段进行修改。

    12.3.6 校验和

    ​ TCP的校验和字段覆盖了TCP头部和TCP数据,还包括一个伪头部。这个字段是强制性的,必须由发送方计算和保存、接收方进行验证。它与计算UDP的校验和方式相同。

    12.3.7 选项字段

    选项字段最最重要的就是MSS字段(又称为最大段大小)。连接的每一个端点一般都在它的第一个SYN报文上指定MSS的值,用来标明自己希望接收的最大段的消息。

    展开全文
  • TCP头部结构详解

    千次阅读 2018-10-15 15:06:45
    tcp头部信息出现在每个tcp报文段中,用于指定通信的源端端口,目的端口,管理tcp连接等。tcp头部结构如下图所示:   tcp头部结构 1、16位端口号:告知主机该报文段来自哪里(源端口)以及传给哪个上层协议或应用...

    tcp头部信息出现在每个tcp报文段中,用于指定通信的源端端口,目的端口,管理tcp连接等。tcp头部结构如下图所示:
     

    tcp头部结构

    1、16位端口号:告知主机该报文段来自哪里(源端口)以及传给哪个上层协议或应用程序(目的端口)的。进行tcp通信时,客户端通常使用系统自动选择的临时端口号,而服务器则使用知名服务端口号。

    2、32位序号:一次tcp通信过程中某一个传输方向上的字节流的每个字节的编号。假设主机A和主机B进行tcp通信,A发送给B的第一个tcp报文段中,序号值被系统初始化为某个随机值ISN。那么在该传输方向上(从A到B),后续的tcp报文段中序号值将被系统设置成ISN加上该报文段所携带数据的第一个在整个字节流中的偏移。例如,某个tcp报文段传送的数据时字节流中的第1025~2048字节,那么该报文段的序号值就是ISN+1025。另一个传输方向(从B到A)的tcp报文段的序号值也具有相同的含义。

    3、32位确认号:用作对另一方发送来的tcp报文段的相应。其值是收到的tcp报文段的序号值加1。假设主机A和主机B进行tcp通信,那么A发送出的tcp报文段不仅携带自己的序号,而且包含对B发送来的tcp报文段的确认号。反之,B发送出的tcp报文段也同时携带自己的序号和对A发送来的报文的确认号。

    4、4位头部长度:标识该tcp头部有多少个32bit字(4字节)因为4位最大能表示15,所以tcp头部最长是60字节。

    5、6位标志位(即图中的保留6位):标志位有如下几项

    • URG标志,表示紧急指针是否有效
    • ACK标志,表示确认号是否有效。称携带ACK标志的tcp报文段位确认报文段
    • PSH标志,提示接收端应用程序应该立即从tcp接受缓冲区中读走数据,为接受后续数据腾出空间(如果应用程序不将接收的数据读走,它们就会一直停留在tcp缓冲区中)
    • RST标志,表示要求对方重新建立连接。携带RST标志的tcp报文段为复位报文段。
    • SYN标志,表示请求建立一个连接。携带SYN标志的tcp报文段为同步报文段。
    • FIN标志,表示通知对方本端要关闭连接了。携带FIN标志的tcp报文段为结束报文段。

    6、16位窗口大小:是tcp流量控制的一个手段。这里说的窗口,指的是接收通告窗口。它告诉对方本端的tcp接收缓冲区还能容纳多少字节的数据,这样对方就可以控制发送数据的速度。

    7、16位校验和:由发送端填充,接收端对tcp报文段执行CRC算法以校验tcp报文段在传输过程中是否损坏。注意,这个校验不仅包括tcp头部,也包括数据部分。这也是tcp可靠传输的一个重要保障。

    8、16位紧急指针:是一个正的偏移量。它和序号字段的值相加表示最后一个紧急数据的下一个字节的序号。因此,确切的说,这个字段是紧急指针相对当前序列号的偏移,称为紧急偏移。tcp的紧急指针是发送端向接收端发送紧急数据的方法。

    9、16位选项:

           TCP头部的最后一个选项字段是可变长的可选信息。这部分最多包含40字节,因为TCP头部最长是60字节(其中还包含前面讨论的20字节的固定部分)。典型的TCP头部选项结构如图3-4所示。

           选项的第一个字段kind说明选项的类型。有的TCP选项没有后面两个字段,仅包含1字节的kind字段。第二个字段length(如果有的话)指定该选项的总长度,该长度包括kind字段和length字段占据的2字节。第三个字段info(如果有的话)是选项的具体信息。常见的TCP选项有7种,如图3-5所示。

           kind=0是选项表结束选项。
           kind=1是空操作(nop)选项,没有特殊含义,一般用于将TCP选项的总长度填充为4字节的整数倍。
           kind=2是最大报文段长度选项。TCP连接初始化时,通信双方使用该选项来协商最大报文段长度(Max Segment Size,MSS)。TCP模块通常将MSS设置为(MTU-40)字节(减掉的这40字节包括20字节的TCP头部和20字节的IP头部)。这样携带TCP报文段的IP数据报的长度就不会超过MTU(假设TCP头部和IP头部都不包含选项字段,并且这也是一般情况),从而避免本机发生IP分片。对以太网而言,MSS值是1460(1500-40)字节。
           kind=3是窗口扩大因子选项。TCP连接初始化时,通信双方使用该选项来协商接收通告窗口的扩大因子。在TCP的头部中,接收通告窗口大小是用16位表示的,故最大为65?535字节,但实际上TCP模块允许的接收通告窗口大小远不止这个数(为了提高TCP通信的吞吐量)。窗口扩大因子解决了这个问题。假设TCP头部中的接收通告窗口大小是N,窗口扩大因子(移位数)是M,那么TCP报文段的实际接收通告窗口大小是N乘2M,或者说N左移M位。注意,M的取值范围是0~14。我们可以通过修改/proc/sys/net/ipv4/tcp_window_scaling内核变量来启用或关闭窗口扩大因子选项。
    和MSS选项一样,窗口扩大因子选项只能出现在同步报文段中,否则将被忽略。但同步报文段本身不执行窗口扩大操作,即同步报文段头部的接收通告窗口大小就是该TCP报文段的实际接收通告窗口大小。当连接建立好之后,每个数据传输方向的窗口扩大因子就固定不变了。关于窗口扩大因子选项的细节,可参考标准文档RFC 1323。
           kind=4是选择性确认(Selective Acknowledgment,SACK)选项。TCP通信时,如果某个TCP报文段丢失,则TCP模块会重传最后被确认的TCP报文段后续的所有报文段,这样原先已经正确传输的TCP报文段也可能重复发送,从而降低了TCP性能。SACK技术正是为改善这种情况而产生的,它使TCP模块只重新发送丢失的TCP报文段,不用发送所有未被确认的TCP报文段。选择性确认选项用在连接初始化时,表示是否支持SACK技术。我们可以通过修改/proc/sys/net/ipv4/tcp_sack内核变量来启用或关闭选择性确认选项。
           kind=5是SACK实际工作的选项。该选项的参数告诉发送方本端已经收到并缓存的不连续的数据块,从而让发送端可以据此检查并重发丢失的数据块。每个块边沿(edge of block)参数包含一个4字节的序号。其中块左边沿表示不连续块的第一个数据的序号,而块右边沿则表示不连续块的最后一个数据的序号的下一个序号。这样一对参数(块左边沿和块右边沿)之间的数据是没有收到的。因为一个块信息占用8字节,所以TCP头部选项中实际上最多可以包含4个这样的不连续数据块(考虑选项类型和长度占用的2字节)。
           kind=8是时间戳选项。该选项提供了较为准确的计算通信双方之间的回路时间(Round Trip Time,RTT)的方法,从而为TCP流量控制提供重要信息。我们可以通过修改/proc/sys/net/ipv4/tcp_timestamps内核变量来启用或关闭时间戳选项。

    展开全文
  • TCP协议--TCP头部

    千次阅读 2017-11-25 17:19:10
    TCP协议的概念  TCP和UDP是传输层的两个主要协议。TCP相对于UDP来说,是面向连接、字节流和可靠传输。  (1) 面向连接   使用TCP通信的双方必须先建立起连接,然后才能开始数据的读写。建立连接后双方的系统...

    《Linux高性能服务器编程》阅读笔记:

    1. TCP协议的概念

      TCP和UDP是传输层的两个主要协议。TCP相对于UDP来说,是面向连接字节流可靠传输

      (1) 面向连接
      使用TCP通信的双方必须先建立起连接,然后才能开始数据的读写。建立连接后双方的系统内核会为该连接分配必要的系统资源,用来管理连接的状态和传输在连接上的数据。TCP连接是全双工的,即双方的读写操作可以在同一连接上执行。数据交换完成后,通信双方都需要关闭该连接以释放系统资源。TCP的连接是一对一的,所以需要广播或多播(目标是多个主机)的应用程序不能使用TCP服务,而是使用无连接的UDP服务。

      (2) 字节流服务
      跟字节流服务经常放在一起的还有数据报服务,它们的区别在形式上体现为通信双方是否需要指向相同次数的读/写操作。对于使用字节流服务的TCP的通信双方来讲,当发送端应用程序连续执行多次写操作时,(系统内核空间的)TCP模块会先将这些数据放入(内核空间的)TCP发送缓冲区中。当TCP模块需要真正发出数据时,发送缓冲区中待发送的数据会被封装成一个或者多个TCP报文段发出。由此可见,TCP模块发送出的TCP报文段的个数跟与应用程序执行写操作的次数之间没有固定的数量关系
      同理,TCP接收端具有接收缓冲区,当接收端接收到一个或者多个TCP报文段之后,TCP模块将报文携带的发送端应用程序数据按照TCP报文段的序号放入该缓冲区,并通知应用程序来读取数据。接收端应用程序可以一次性将接收缓冲区的内容读出,也可以分多次读取,这取决于用户指定的应用程序读缓冲区的大小。由此可见,TCP模块接收到的TCP报文段的个数与应用程序执行读操作的次数之间没有固定的数量关系
    综上所述,发送端的写操作和接收端的读操作之间没有固定的数量关系,这就是字节流服务,应用程序对数据的发送和接收是没有边界限制的
      UDP则不然,它是属于数据报服务,发送端应用程序每执行一次写操作,UDP模块就会将之封装成一个UDP数据报并发送出去,接收端必须及时针对每一个UDP数据报执行读操作,否则就会出现丢包现象,另外,如果接收端没有足够的应用程序来读取数据,UDP数据就会被截断。

      (3) 可靠传输
      a. TCP采用发送应答机制,即发送端发送的每个TCP报文段都必须得到接收方的应答后才认为TCP报文段传输成功。
      b. TCP具有超时重传机制,发送端在发出一个TCP报文段之后启动定时器,若在超时时间范围后还没收到接收端的应答信号,它将重发该数据报文。
      c. TCP报文段最终是以IP数据报发送的,IP数据报到达接收端可能是重复/乱序的,所以TCP模块还会对接收到的TCP报文段重排、整理,再交付应用程序
      UDP协议与IP协议一致,提供的是不可靠服务,数据确认和超时重传都需要在上层应用实现

    2. TCP报文段的头部信息

      TCP的头部结构为:
    这里写图片描述

      (1) 16位的源端口号/目的端口号
      告知目的机器报文段来自哪里(源端口号)以及传给传递给哪个上层协议或者应用程序(目的端口号)。进行TCP通讯时,客户端通常使用系统自动选择的临时端口号,而服务器则使用知名端口号。在Linux系统中,一些知名服务使用的端口号定义在/etc/services中。

      (2) 32位序号
      一次TCP通讯(从TCP连接的建立到断开)整个过程中,一个传输方向上的字节流的每一个报文的编号。例如主机A和主机B进行TCP通讯,A发送给B的第一个TCP报文中,序号值就被系统设置为某个随机值(ISN, Initial Sequence Number),在该传输方向(A->B)的后续TCP报文的序号子将被系统设置为ISN加上该报文所携带的第一个字节在整个字节流的偏移。假设某个TCP报文段传输的数据是整个字节流中的第1024~2048字节,那么该报文的序号值为ISN+1025,下一个报文为ISN+2049。

      (3) 32位的确认号
      用于对对方发来的TCP报文段的响应,其值为收到的TCP报文段的序号值加1。

      (4) 4位头部长度
      标志该TCP头部具有多长,单位为字(4字节),可见TCP头部最长为60字节。

      (5) 6位保留

      (6) 6个标志位
      ① URG: 表示紧急指针是否有效
      ② ACK: 表示确认号是否有效(携带ACK标志的TCP报文段称为确认报文段)
      ③ PSH: 提示接收端应用程序要立即从TCP接收缓冲区读走数据,以腾出空间接收后续的数据。(若应用程序不读走数据,数据会一直留在TCP模块的接收缓冲区)
      ④ RST: 表示要求对方重新建立连接(携带RST标志的TCP报文段为复位报文段)
      ⑤ SYN: 表示请求建立一个连接(携带SYN标志的TCP报文段称为同步报文段)
      ⑥ FIN: 表示通知对方要关闭连接(携带FIN标志的TCP报文段为结束报文段)

      (7) 16位窗口大小
      这是TCP流量控制的一个手段。此处的窗口指的是接收通告窗口,用于告诉对方本端的TCP接收缓冲区还能容纳多少字节的数据,这样对方就可以控制发送数据的速度。

      (8) 16位校验和
      由发送端填充,接收端对TCP报文段执行CRC算法以检验TCP报文段在传输过程中是否损坏。作为TCP可靠传输的重要保障,这个校验不仅包括TCP头部,也包括数据部分

      (9) 16位紧急指针
    存放着一个正的偏移值,该值加上当前报文的序号将得到紧急指针,紧急指针处存放的是紧急数据,是发送端向接收端发送紧急数据的方法。

      (10) TCP头部选项
      TCP头部选项存放着至多40字节的可变长的可选信息(因为TCP头部结构最长为60字节,除去前面的固定部分)。典型的TCP头部选项结构结构如下:
    这里写图片描述

      (1) Kind: 说明选项类型
      (2) Length: (如果有的话)指定该选项的总长度
      (3) Info: (如果有的话)选项的具体信息

      可选项信息有如下情况:
    这里写图片描述

      (1) Kind=0
      选项表结束选项
      (2) Kind=1
      空操作选项,无特殊意义,一般用于将TCP选项的总长度填充为4字节的整数倍
      (3) Kind=2
      最大报文段长度选项,TCP连接初始化时,通信双方使用此选项来协商最大报文长度(Max Segment Size, MMS)。
      (4) Kind=3
       窗口扩大因子。TCP连接初始化时,通信双方使用该选项来协商接收通告窗口的扩大因子。在TCP头部中,接收通告窗口大小用16位表示,故最大为65535字节。实际上TCP模块允许的接收通告窗口大小远不止这个数,窗口扩大因子解决了此问题。假设接收通告窗口大小为N,扩大因子为M,那么TCP报文段的实际接收通告窗口大小为N乘2^M,即N左移M位。M的取值范围是0~14,/proc/sys/net/ipv4/tcp_window_scaling
    内核变量用来启用或关闭窗口扩大因子选项。

      MSS选项与窗口扩大因子选项只能出现在同步报文段中,否则将被忽略。但是同步报文段不执行窗口的扩大操作,即同步报文段的接收通告窗口大小就是该TCP报文段的实际接收通告窗口大小。当连接建立完毕后,每个数据传输方向的窗口扩大因子就固定不变了。

      (5) Kind=4
      选择性确认(Selective Acknowledgment, SACK)选项。TCP通信时若某个TCP报文段丢失则TCP模块会重传最后被确认的TCP报文段后续的所有报文段,这样原先已经正确传输的TCP报文段可能会被重复发送,从而降低TCP性能。SACK技术使TCP模块只重新发送丢失的TCP报文段,不用发送所有未被确认的TCP报文段。选择性确认用于连接初始化时表示是否支持SACK技术。/proc/sys/net/ipv4/tcp_sack内核变量用于启动/关闭选择性确认选项。
      (6) Kind=5
      SACK实际工作的选项,该选项的参数部分用于告诉发送方本端已收到并缓存的不连续的数据块,从而让发送端可以据此检查并重发丢失的数据块。
      (7) Kind=8
      时间戳选项,该选项提供了较为准确的计算通信双方之间的回路时间(Round Trip Time, RTT)的方法,从而为TCP流量控制提供重要信息。/proc/sys/net/ipv4/tcp_timestamps内核变量用于启动/关闭时间戳选项

    3. 利用tcpdump观察TCP头部信息

      在 IP协议协议–IP头部信息中利用tcpdump观察了基于TCP的telnet服务的数据包的IP头部数据,该数据同样适用于观察TCP数据报:

    tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
    listening on lo, link-type EN10MB (Ethernet), capture size 65535 bytes
    IP 127.0.0.1.44626 > 127.0.0.1.23: Flags [S], seq 3041640326, win 43690, options [mss 65495,sackOK,TS val 4701824 ecr 0,nop,wscale 7], length 0
        0x0000:  4510 003c 0106 4000 4006 3ba4 7f00 0001
        0x0010:  7f00 0001 ae52 0017 b54b bf86 0000 0000
        0x0020:  a002 aaaa fe30 0000 0204 ffd7 0402 080a
        0x0030:  0047 be80 0000 0000 0103 0307

      (1) Flags[S]表示该TCP报文段含SYN标志,即它是一个同步报文段。若TCP报文段包含其他标志,标志的首字母也显示在Flags后的方括号内。
      (2) seq是序号值,该报文段是从127.0.0.1.44626到127.0.0.1.23的传输方向上的第一个TCP报文段,所以序号值seq也就是此次通信过程中该传输方向的ISN值,且它没有针对对方送来的TCP报文段的确认值(因为尚未接收到任何对方发送来的TCP报文段)。
      (3) win是接收通告窗口的大小,因为这是一个同步报文段,所以win值指的是实际接收通告窗口的大小(不是窗口扩大因子参与计算后的结果)
      (4) options是TCP头部的可选项信息,其具体内容在方括号中,mss是发送端(客户端)通告的最大报文长度。ifconfig可查看回路接口的MTU为146字节,即TCP报文段的MSS为16336-40=16396字节。因为这是一次TCP通信的第一个TCP报文段,所以针对对方的时间戳的应答为0;紧接着是nop是一个空操作;wscale指出发送端使用的窗口扩大因子为6。

      下来呈现的十六进制的格式,共60字节: 前20字节是IP头部,后40字节是TCP头部,即从21字节看起:

    0xae52          源端口号
    0x0017          目的端口号
    0xb54bbf86      序号
    0x00000000      确认号
    0xa             TCP头部长度为1032位,即40字节
    0x002           设置了SYN标志
    0xaaaa          接收通告窗口的大小
    0xfe30          头部校验和
    0x0000          没设置DRG标志,即紧急指针值无意义
    0x0204          最大报文段长度选项的Kind值和length0xffd7          最大报文段长度
    0x0402          允许SACK选项
    0x080a          时间戳选项的kind值和length0x0047be80      时间戳
    0x00000000      应答时间戳
    0x01            空操作选项
    0x0303          窗口扩大因子选项的kind值和length0x07            窗口扩大因子
    展开全文
  • #TCP/IP# TCP头部选项功能详解

    万次阅读 2019-10-26 14:16:40
    3)TCP首部总长度:由TCP头中的“数据偏移”字段决定。该字段占4bit,取最大的1111时,也就是十进制的15,TCP首部的偏移单位为4byte,那么TCP首部长度最长为15*4=60字节。 4)选项和填充 的长度:=TCP...

    简单回顾下TCP报文格式

    • 1)TCP报文:由 TCP首部 和 TCP数据 组成。
    • 2)TCP首部:由 20字节的固定长度 和 可变长字段(选项和填充)组成。
    • 3)TCP首部总长度:由TCP头中的“数据偏移”字段决定。该字段占4bit,取最大的1111时,也就是十进制的15,TCP首部的偏移单位为4byte,那么TCP首部长度最长为15*4=60字节。
    • 4)选项和填充 的长度:= TCP首部总长度 - 20字节的固定长度。由3)的计算可知,TCP首部总长度最大为60字节,那么“选项和填充”字段的长度最大为40字节。填充是为了使TCP首部为4byte的整数倍。
       

    可选项字段的格式

    每个选项的开始是1字节的kind字段,说明选项的类型。一个TCP包可以包含多个可选项。

    详细参考:#TCP/IP# 基于TCP/IP的四层协议的信息报文段格式

    TCP头部选项功能

    TCP头部的选项部分是TCP为了适应复杂的网络环境和更好的服务应用层而进行设计 的。TCP选项部分最长可以达到40byte ,再加上TCP选项外的固定的20byte字节部分, TCP的最长头部可达60byteo TCP头部长度可以通过TCP头部中的"数据偏移"位来查看。(值得注意的是TCP偏移量的单位是32位,也就是4byteo而TCP偏移量共占4bit位, 取最大的1111计算也就是十进制的15。15*4byte=60byte #这个也是TCP的首部不超 过60byte的原因。)

    大多数的TCP选项部分出现在TCP连接建立阶段,也就是TCP的三次握手数据包中。 当然有些选项也会出现在已经建立连接的session中,不过此种情况较少出现。

    TCP选项部分占有的位数必须是8bit的倍数,这也就是说,即使出现我们应用的选项 部分为4bit M旦也必须使用4bit的垫片。这样才符合RFC的要求

    TCP选项部分实际运用的有以下几种:

    1. 最大报文传输段(Maximum Segment Size —MSS )
    2. 窗口扩大选项(window scaling )
    3. 选择确认选项(Selective Acknowledgements —SACK )
    4. 时间戳选项(timestamps )
    5. NOP

    下面是一个实际网络中选项部分使用齐全的一个数据包,如图解码部分:

    使用wireshark做出解码的解释:

    我们详细看下每个选项的功能,和其主要用法等:

     

    最大报文传输段(Maximum Segment Size —MSS )

    MSS是TCP选项中最经常出现,也是最早岀现的选项。MSS选项占4byte。MSS是每一个TCP报文段中数据字段的最大长度,注意:只是数据部分的字段,不包括TCP的头 部。TCP在三次握手中,每一方都会通告其期望收到的MSS ( MSS只出现在SYN数据包中)如果一方不接受另一方的MSS值则定位默认值536byte

    MSS值太小或太大都是不合适。太小例如MSS值只有lbyte那么为了传输这lbyte 数据,至少要消耗20字节IP头部+20字节TCP头部二40byte ,这还不包括其二层头部所 需要的开销,显然这种数据传输效率是很低的。MSS过大,导致数据包可以封装很大,那 么在IP传输中分片的可能性就会增大,接受方在处理分片包所消耗的资源和处理时间都会 增大,如果分片在传输中还发生了重传,那么其网络开销也会增大。因此合理的MSS是至 关重要的。MSS的合理值应为保证数据包不分片的最大值。对于以太网MSS可以达到 1460byte.

    与MSS相似的在IP层也有f 类似的概念…MTU ( Maximum Transfer Unit )下 图可以清晰翻译MSS与MTU的关系:

    窗口扩大选项(window scaling )

    我们知道TCP最大的窗口大小为64Kb ,在早期网络这是够用的,但随着各种复杂 网络的产生,特别是类似卫星通信这种时延和带宽都也交大的通信而产生,需要更大窗口来满足性能和高吞吐率”于是窗口扩大选项便产生了。

    我们用下图一些图来说明为什么需要这个选项,和其主要功能:

    我们假设Host A—B是一条高速的WAN链路。通信距离较远,延时也由于距离的原因变大。A向B发送大量数据,由于有足够带宽,那么A在很短时间内就可以发送完64Kb 的数据,而由于窗口过小,A只能停止发送,直到B对A发送的数据进行ACK确认。上面我们可以推算,在time 2-3和后面的time 5-6之间A-B是没有实际数据发送的。而大量的时间被浪费在了等待对方回应上。

    如果我们改进我们的窗口大小,使之变的更大,如下图:

    现在我们把窗口扩大到256kb ,我们看到,由于窗口足够大,A可以发送大量的数据 报,在其还在忙着发送报文的时间内,对A数据的ACK就已经可以返回了。(黄色的部分可以想象成一个个数据包,大量的数据包排长队在网络中传输L这样,A-B的通信就避免 了消耗大量的等待时间。对TCP的性能改善是巨大的。

    Windows scaling占3个byte ,其中的f 字节表示移位值So新的窗口值等于TCP 首部的窗口位数从16增大到(16+S L这相当于把窗口值向左移动S位后获得实际的窗口 大小。移位值准许使用的最大值是14相当于窗口最大值增大到65535*2^14也就是1GB。

    窗口扩大选项在TCP建立之初进行协商,如果已经实现了窗口扩大,当不再需要其扩大窗口时,发送S=0选项就可以恢复到窗口大小16。

    选择确认选项(Selective Acknowledgements —SACK )

    我们假设TCP传输中有这种情况岀现:收到的报文无差错,只是未按序列号,中间还缺 少一些序列号,那么能能否只传输缺少的数据,而不重传已经正确到达的数据?这就是选择确认的技术。用下列例子来说明一下:

    要传输的数据共5个,分别编号为1,234,5。A-B Host。B作为接受者,发现数据接 收是这样的1 3 5。而中间的2和4没有到达其他都是正确的数据报。那么如果选用SACK , A将只会重传2和4,而不是所有的报文都重传。

    SACK选项在TCP建立连接时由SYN数据包中加上〃允许SACK"的置为1来实现。SACK 对原来TCP首部的确认号字段不会产生影响,只是在发生不连续传输中才会使用。

    我们知道TCP的数据报文是有字块边界的”例如上面例子,怎么形容丢失的数据包2 呢,我们会以之间的数据包说明,也就是说丢失的数据是有左右边界的。而此边界在 传输中是用TCP序列号来表示的。由于TCP首部选项部分最多只有40字节,而指明一个 边界要用掉4字节(因为TCP序列号是32位,也就是4字节),因此在选项中最多只能指 明4个字节块的边界信息。这是因为4个字块要有8个边界(前后边界\另外还需要2 个功能字节,一个字节用来指明使用SACK选项,另一字节指明这个选项要占多少字节。4* ( 4*2 ) +2=34byte。所以最多只能指出4个字节块边界信息。

    这里写图片描述

    一般来说,计算机都是默认支持选择确认的。上面这张图是刚才通过wireshark工具抓取到的接收方给发送方发送的一个tcp确认包,在这个tcp选择确认(SACK)包中,在图1的tcp选项的SACK选项是选择确认(SACK)能保障可靠传输最为重要的依据。所以,这里我们重点关注tcp选项部分,在tcp首部中可以看到确认号为:2336611189,首部长度是32字节,Window size valaue字段是接收方的接收窗口,同于通知发送方将发送窗口大小设置为65520字节。

    从该tcp数据包的tcp选项来看这是一个选择确认(SACK)包,也就是说这个确认包只有tcp首部,没有数据部分,Kind:SACK(5)用来表示这是选择确认(SACK),该字段占用一个字节。Length表示tcp选项长度,占用一个字节,左边界和右边界各占用4字节,也就是说这里总共用掉了10字节。其中left edge表示接收方接收到的数据块中的左边界位置(起始字节),而right edge可以理解为接收方接收到的数据块中的结束位置(右边界),为了方便学习,我们暂时这么理解吧。也就是说,通过左边界和右边界我们可以指明一个数据块的位置。

      那么我们可以根据捕获的数据报中的确认号丢失的数据块中的起始字节,也就是要重传的起始字节,再结合接收窗口,左边界和右边界。我们可以推出接收窗口中的已经接收到的数据块,和未接收到的数据块,如下图所示:

     

      从上图中我们可以清晰的看到滑动窗口中的数据分布如上图所示,其中未接收到的字节数据块表示需要重传的数据,那么发送方在进行选择性重传时,会从2336611189字节的位置开始重传。注意:对于已经接收到的字节数据块(2336631881 - 2336693150)是不会被重传的。

    另外,在前面学习tcp数据报格式的时候说过,tcp首部中的选项部分最大是40字节,左边界和右边界在指明一个数据块时就用掉了8字节,那么指明4个数据块就用掉了32字节,再加上Kind:SACK(5)和Length两个字段占用的2字节,最终只剩下了6字节,换句话说,tcp选项的选择确认选项最多也就只能指明4个数据块

    这里写图片描述

    如上图所示,现有10个分组数据,第1个分组为1-100,第2个分组为101-200,其他以此类推… 假设发送方发送了这10个分组,然后接收方接收到数据后给发送方发送了一个选择确认(SACK)数据报,其中tcp首部中给出确认号为201,同时tcp选项中携带了8个左右边界

      发送方接收到选择确认数据包后,会根据数据包中的tcp首部中的确认号201,从201字节位置开始重传,再根据tcp首部的tcp选项中的选择确认(SACK)选项指明的已经收到的数据块的8个边界,进行选择性重传(201-300),(401-500),(601-700),(801-900)分组(对于已经收到的数据块(301-400),(501-600),(701-800),(901-1000)是不会重传的,因为选择确认(SACK)选项中给出的边界是指明已经接收到的数据块和未接收到的数据块。换句话说,边界就是接收方用来告诉发送方:“哪些数据已经收到,哪些数据没收到”。然后发送方再选择对未收到的数据进行重传)。
     

    时间戳选项(timestamps )

    时间戳选项占10个字节,其中最主要的字段时间戳字段(4字节)和时间戳回送回答字段(4字节)

    时间戳选项主要的功能有两个:

    • 1    .用来计算往返时间RTT(Round-Trip Time往返时延)。发送方在发送报文段时把当前时钟的时间值放入时间戳字段,接收方在确认该报文段时把时间戳字段值复制到时间戳回送回答字段。因此,发送方在 收到确认报文后,可以准确计算出RTT。时间戳是一个单调增长的值,接收方只需要回 显收到的内容,因此是不需要关注时间戳的单元是什么,也不需要连接双发的时钟同步。
    • 2    . PAWS:防止回绕的序号。我们知道序列号只有32位,而每增加2^32个序列号后就会重复使用原来用过的序列号。假设我们有F高速网络,通信的主机双方有足够大的带 宽用来快速的传输数据。例如lGb/s的速率发送报文段,则不到35秒钟数据字节的序 列号就会重复。这样对TCP传输带来混乱的情况。这种情况之出现在高速链路上。而采 用时间戳选项”可以很容易的分辨出相同序列号的数据报,哪个是最近发送,哪个是以前发送的。

    NOP

    NOP ( no operation ),从字面意思也看出来了,这个字段实际上是没有但可意义的字 段。设计该字段主要是用来提供填充垫片。TCP的头部必须是4byte的倍数,但是大多数 的TCP选项不是4byte的倍数。假如出现了整个TCP选项部分不是4byte的倍数,那么就 需要使用1或多个字节无意义的nop来填充,使之符合TCP的头部构造的规定。例如,选 项部分只有6byte , 2个字节的nop就会用来做垫片。

    NOP也会做为分割不同的选项数据,例如我们的TCP会话中同时使用了窗口扩大选项和 SACK那么TCP头部中的SACK的表示部分与窗口扩大选项中的参数之间使用nop隔离。 明确不同的选项之间的分割点,因此在一个数据包中出现多个nop是不奇怪的。

     

    总结

    TCP协议是一个设计可靠的,优越的协议,通过TCP的选项部分也可以看到其设计之 精妙。TCP的选项部分做为TCP头部的补充满足了对复杂网络和苛刻传输条件的要求。TCP 选项在给网络带来性能提升和高可靠的同时”也会被黑客所利用。

    例如,每个操作系统都有自己独特的处理TCP选项部分的特点和排序规则。利用这种 系统的特殊性结合其他手段可以很容易的识别出是明哪种操作系统对了解和分析主机漏洞提 供了更多的参数。

    展开全文
  • TCP包头详解

    千次阅读 2019-07-14 08:57:12
    TCP(Transmission Control Protocol 传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议。当应用层向TCP层发送用于网间传输的、用8位字节表示的数据流,TCP则把数据流分割成适当长度的报文段,...
  • TCP协议详解(一):TCP头部结构

    万次阅读 多人点赞 2018-05-02 20:13:46
    TCP字节流服务 网络传输层中,TCP是面向连接、可靠的、字节流传输。 TCP协议通信双方必须先建立连接,通信双方必须为该连接分配必要的内核资源,以管理连接的状态和连接上数据的传输。TCP是全双工的,即双方的数据...
  • IP头、TCP头、UDP头详解以及定义

    万次阅读 2018-09-06 19:24:14
    转自:...   一、MAC帧定义 /*数据帧定义,14个字节,尾4个字节*/ typedef struct _MAC_FRAME_HEADER {  char m_cDstMacAddress[6]; //目的mac地址  char m_cSrcMacAddress[6]; ...
  • 1 TCP头 TCP是一种可靠的、面向连接的字节流服务,头部定义如下。 /*TCP头定义,共20个字节*/ typedef struct _TCP_HEADER { short m_sSourPort; // 源端口号16bit short m_sDestPort; // 目的端口号16bit ...
  • TCP头部信息与UDP头部信息

    千次阅读 2019-05-20 14:52:30
    TCP头部信息 源端口号以及目的端口号: 各占2个字节,端口是传输层和应用层的服务接口,用于寻找发送端和接收端的进程,通过这两个端口号和IP头部的ip发送和接收号,可以唯一的确定一个连接。 一般来讲,通过端口号...
  • ip包头,TCP包头

    千次阅读 2019-07-27 14:05:09
    ip包头 封装流程 TCP包头 UDP包头 二层vlan数据包
  • Wireshark抓包TCP包头分析

    千次阅读 2019-10-07 14:19:44
    TCP包头分析 注释:    端口号范围:0-65535    源端口号:是客户端进程随机生成的,一般是从50000开始的    目标端口号:一般是服务器固定的。如:mysql:3306 ...
  • 一、MAC帧定义 /*数据帧定义,14个字节,尾4个字节*/ typedef struct _MAC_FRAME_HEADER {  char m_cDstMacAddress[6]; //目的mac地址  char m_cSrcMacAddress[6]; //源mac地址  short m_cType; //上一层...
  • TCP头部格式的了解

    千次阅读 2017-05-02 13:41:43
    tcp头部格式如下图所示:   1.源端口号,16位,发送方的端口号。 2.目标端口号,16位,发送方的目标端口号。 3. 32为序列号,sequence number,保证网络传输数据的顺序性。 4. 32位确认号,acknowledgment ...
  • 利用sniffer工具,分析TCP头的结构,并分析TCP的三次握手过程 1.分析TCP头的结构 (1)重新设置过滤器 步骤:点击菜单栏Capture→Define Filter,再选择Advance,勾选IP选项,在勾选IP项的时候,先将其展开,下拉,...
  • TCP头部和封装

    千次阅读 2019-02-25 09:56:40
    TCP在IP数据报中的封装   IP头部   TCP头部 可看到,IP数据报即 = P头部协议 + TCP报文段,这也称为TCP在IP数据报中的封装。有趣的是,TCP报文段中的数据部分并不是必须的,当一个连接被建立和终止时...
  • TCP 包头结构

    千次阅读 2016-09-01 17:00:54
    TCP协议最少20个字节,包括以下的区域 TCP源端口(Source Port):16位的源端口其中包含初始化通信的端口。源端口和源IP地址的作用是 标示报问的返回地址。  TCP目的端口(Destination port):16位的目的端口域...
  • TCP包头格式详解

    万次阅读 2015-08-18 09:28:53
    TCP协议的,所以IP包裹还要从用户数据中扣除20字节的TCP包头,这里已经是40字节,加上其他程序的连接,状态确认等等包裹,因 而算出来要比理论值要小。 另外网络环境(包括稳定因素和传输节点的转发率)也...
  • 我自己整理出来的汇编版本 ;;IP数据包头部结构定义 ip_head struct  h_lenver db ? ;4位IP版本号+4位首部长度 ...16位TCP数据包总长度  ident dw ? ;16位标识  frag_and_flags dw ? ;3位分片标志+13位分片偏移
  • TCP协议的学习 (二)TCP头部信息

    千次阅读 2016-04-06 12:12:44
    TCP头部信息 头部结构
  • TCP头部的ACK与SEQ

    千次阅读 2017-01-23 12:00:17
    TCP头部的ACK与SEQ这几天临近过年了,很多人都回去了,趁着闲着,把TCP/IP协议详解大概过了一过,有些以前似懂非懂的,现在貌似还是似懂非懂,不过至少比以前理解的好一点儿了,不过对于TCP的发包与回应之间的确认...
  • 首先咱们弄清楚,TCP协议和UCP协议与TCP/IP协议的联系,很多人犯糊涂了,一直都是说TCP/IP协议与UDP协议的区别,我觉得这是没有从本质上弄清楚网络通信! TCP/IP协议是一个协议簇。里面包括很多协议的。UDP只是...
  • TCP头部解析

    千次阅读 2015-06-13 13:24:28
    一一解析 SourcePort(源端口)和DestinationPort(目的端口):各占2个字节,端口是运输层与应用...SequenceNumber(序号):占4个字节,TCP连接中传送的数据流中的每一个字节都编上一个序号。序号字段的值则指的是
  • TCP报文头部

    千次阅读 2019-08-18 16:27:42
    TCP包头详解 主要学习端口号、三次握手、四次挥手 TCP包头 TCP报文固定长度20字节+可变长度 TCP包头如下图所示: 源端口、目标端口:计算机上的进程要和其他进程通信是要通过计算机端口的,而一个计算机端口...
  • 先让我们看看IP,TCP,UDP的头部结构1. IPv4 头部2. TCP和UDP头部 可以看到IP的头部包换数据的长度,TCP的头部不包含数据长度,UDP的头部则包含。从信息冗余的角度来看,UDP的长度信息是不需要的。因为IPv4的头部...
  • TCP头部标记位笔记

    千次阅读 2018-04-22 22:00:52
    ACK: 用来确认(通过TCP连接)收到的数据 RST:用来表示立刻拆除连接 PSH: 用来表示应将数据提交给末端应用程序(进程)处理 URG:(紧急数据)位(表示紧急指针字段有效,一般不用) tcp[13] & 0x00 = 0: 用来...
  • tcp头部没有数据长度信息

    千次阅读 2017-08-07 01:42:54
    tcp头部没有长度信息,而udp有长度信息
  • 发生TCP粘包或拆包有很多原因,现列出常见的几点,可能不全面,欢迎补充, 1、要发送的数据大于TCP发送缓冲区剩余空间大小,将会发生拆包。 2、待发送数据大于MSS(最大报文长度),TCP在传输前将进行拆包。 3、...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 253,692
精华内容 101,476
关键字:

tcp头