精华内容
下载资源
问答
  • TCP首部

    千次阅读 2019-03-17 17:56:23
    TCP (Transmission Control Protocol ) 传输控制协议 首部格式 wireshark抓包分析 源端口和目的端口 各占2个字节,分别写入源端口和目的端口。 序号 占4字节。序号范围是【0,2^32 - 1】,共232(即4294967296...

    TCP (Transmission Control Protocol ) 传输控制协议

    首部格式
    在这里插入图片描述wireshark抓包分析
    在这里插入图片描述

    源端口和目的端口 各占2个字节,分别写入源端口和目的端口。

    序号 占4字节。序号范围是【0,2^32 - 1】,共2^32 (即4294967296)个序号。序号增加到2^32-1后,下一个序号就又回到0。也就是说,序号使用mod 2^32运算。TCP是面向字节流的。在一个TCP连接中传送的字节流中的每一个字节都按顺序编号。整个要传送的字节流的起始序号必须在连接建立时设置。首部中的序号字段值则是指的是本报文段所发送的数据的第一个字节的序号。例如,一报文段的序号是301,而接待的数据共有100字节。这就表明:本报文段的数据的第一个字节的序号是301,最后一个字节的序号是400。显然,下一个报文段(如果还有的话)的数据序号应当从401开始,即下一个报文段的序号字段值应为401。这个字段的序号也叫“报文段序号”。

    确认号 占4字节,是期望收到对方下一个报文段的第一个数据字节的序号。例如,B正确收到了A发送过来的一个报文段,其序号字段值是501,而数据长度是200字节(序号501~700),这表明B正确收到了A发送的到序号700为止的数据。因此,B期望收到A的下一个数据序号是701,于是B在发送给A的确认报文段中把确认号置为701。注意,现在确认号不是501,也不是700,而是701。

    总之:若确认号为= N,则表明:到序号N-1为止的所有数据都已正确收到。

    数据偏移 占4位,它指出TCP报文段的数据起始处距离TCP报文段的起始处有多远。这个字段实际上是指出TCP报文段的首部长度。由于首部中还有长度不确定的选项字段,因此数据偏移字段是必要的,但应注意,“数据偏移”的单位是32位字(即以4字节的字为计算单位)。由于4位二进制数能表示的最大十进制数字是15,因此数据偏移的最大值是60字节,这也是TCP首部的最大字节(即选项长度不能超过40字节)。

    保留 占6位,保留为今后使用,但目前应置为0 。
    下面有6个控制位,用来说明本报文段的性质。

    紧急URG(URGent) 当URG=1时,表明紧急指针字段有效。它告诉系统此报文段中有紧急数据,应尽快发送(相当于高优先级的数据),而不要按原来的排队顺序来传送。例如,已经发送了很长的一个程序要在远地的主机上运行。但后来发现了一些问题,需要取消该程序的运行,因此用户从键盘发出中断命令。如果不使用紧急数据,那么这两个字符将存储在接收TCP的缓存末尾。只有在所有的数据被处理完毕后这两个字符才被交付接收方的应用进程。这样做就浪费了很多时间。

    当URG置为1时,发送应用进程就告诉发送方的TCP有紧急数据要传送。于是发送方TCP就把紧急数据插入到本报文段数据的最前面,而在紧急数据后面的数据仍然是普通数据。这时要与首部中紧急指针(Urgent Pointer)字段配合使用。

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

    推送 PSH(PuSH) 当两个应用进程进行交互式的通信时,有时在一端的应用进程希望在键入一个命令后立即就能收到对方的响应。在这种情况下,TCP就可以使用推送(push)操作。这时,发送方TCP把PSH置为1,并立即创建一个报文段发送出去。接收方TCP收到PSH=1的报文段,就尽快地(即“推送”向前)交付接收应用进程。而不用再等到整个缓存都填满了后再向上交付。

    复位RST(ReSeT) 当RST=1时,表名TCP连接中出现了严重错误(如由于主机崩溃或其他原因),必须释放连接,然后再重新建立传输连接。RST置为1还用来拒绝一个非法的报文段或拒绝打开一个连接。

    同步SYN(SYNchronization) 在连接建立时用来同步序号。当SYN=1而ACK=0时,表明这是一个连接请求报文段。对方若同意建立连接,则应在响应的报文段中使SYN=1和ACK=1,因此SYN置为1就表示这是一个连接请求或连接接受报文。

    终止FIN(FINis,意思是“完”“终”) 用来释放一个连接。当FIN=1时,表明此报文段的发送发的数据已发送完毕,并要求释放运输连接。

    窗口 占2字节。窗口值是【0,2^16-1】之间的整数。窗口指的是发送本报文段的一方的接受窗口(而不是自己的发送窗口)。窗口值告诉对方:从本报文段首部中的确认号算起,接收方目前允许对方发送的数据量(以字节为单位)。之所以要有这个限制,是因为接收方的数据缓存空间是有限的。总之,窗口值作为接收方让发送方设置其发送窗口的依据。

    例如,发送了一个报文段,其确认号是701,窗口字段是1000.这就是告诉对方:“从701算起,我(即发送方报文段的一方)的接收缓存空间还可接受1000个字节数据(字节序号是701~1700),你在给我发数据时,必须考虑到这一点。”

    总之:窗口字段明确指出了现在允许对方发送的数据量。窗口值经常在动态变化。

    检验和 占2字节。检验和字段检验的范围包括首部和数据这两部分。和UDP用户数据报一样,在计算检验和时,要在TCP报文段的前面加上12字节的伪首部。伪首部的格式和UDP用户数据报的伪首部一样。但应把伪首部第4个字段中的17改为6(TCP的协议号是6);把第5字段中的UDP中的长度改为TCP长度。接收方收到此报文段后,仍要加上这个伪首部来计算检验和。若使用TPv6,则相应的伪首部也要改变。

    紧急指针 占2字节。紧急指针仅在URG=1时才有意义,它指出本报文段中的紧急数据的字节数(紧急数据结束后就是普通数据) 。因此,在紧急指针指出了紧急数据的末尾在报文段中的位置。当所有紧急数据都处理完时,TCP就告诉应用程序恢复到正常操作。值得注意的是,即使窗口为0时也可以发送紧急数据。

    选项 长度可变,最长可达4字节。当没有使用“选项”时,TCP的首部长度是20字节。

    TCP最初只规定了一种选项,即最大报文段长度MSS(Maximum Segment Szie)。注意MSS这个名词含义。MSS是每一个TCP报文段中的数据字段的最大长度。数据字段加上TCP首部才等于整个的TCP报文段。所以MSS并不是整个TCP报文段的最大长度,而是“TCP报文段长度减去TCP首部长度”。

    为什么要规定一个最大报文长度MSS呢?这并不是考虑接受方的接收缓存可能存放不下TCP报文段中的数据。实际上,MSS与接收窗口值没有关系。我们知道,TCP报文段的数据部分,至少要加上40字节的首部(TCP首部20字节和IP首部20字节,这里还没有考虑首部中的可选部分)才能组装成一个IP数据报。若选择较小的MSS长度,网络的利用率就降低。设想在极端情况下,当TCP报文段只含有1字节的数据时,在IP层传输的数据报的开销至少有40字节(包括TCP报文段的首部和IP数据报的首部)。这样,对网络的利用率就不会超过1/41。到了数据链路层还要加上一些开销。但反过来,若TCP报文段非常长,那么在IP层传输时就有可能要分解成多个短数据报片。在终点要把收到的各个短数据报片组成成原来的TCP报文段,当传输出错时还要进行重传,这些也都会使开销增大。

    因此,MSS应尽可能大些,只要在IP层传输时不需要分片就行。由于IP数据报所经历的路径是动态变化的,因此在这条路径上确定的不需要的分片的MSS,如果改走另一条路径就可能需要进行分片。因此最佳的MSS是很难确定的。在连接过程中,双方都把自己能够支持的MSS写入这一字段,以后就按照这个数值传输数据,两个传送方向可以有不同的MSS值。若主机未填写这一项,则MSS的默认值是536字节长。因此,所有在互联网上的主机都应该接受的报文段长度是536+20(固定首部长度)=556字节。

    后来又增加了几个选项如窗口扩大选项、时间戳选项等。

    窗口扩大选项是为了扩大窗口。我们知道,TCP首部中窗口字段长度是16位,因此最大的窗口大小为64K字节。虽然这对早期的网络是足够用的,但对于包含卫星信道的网络,传播时延和宽带都很大,要获得高吞吐量需要更大的窗口大小。

    窗口扩大选项占3字节,其中有一个字节表示移位值S。新的窗口值等于TCP首部中的窗口位数从16增大到(16+S)。移位值允许使用的最大值是14,相当于窗口最大值增大到2(16+14)-1=230-1。

    窗口扩大选项可以在双方初始建立TCP连接时进行协商。如果连接的某一端实现了窗口扩大,当它不再需要扩大其窗口时,可发送S=0选项,使窗口大小回到16。

    时间戳选项占10字节,其中最主要的字段是时间戳字段(4字节)和时间戳回送回答字段(4字节)。时间戳选项有以下两个概念:

    第一、 用来计算往返时间RTT。发送方在发送报文段时把当前时钟的时间值放入时间戳字段,接收方在确认该报文段时把时间戳字段复制到时间戳回送回答字段。因此,发送方在收到确认报文后,可以准确地计算出RTT来。

    第二、 用于处理TCP序号超过2^32 的情况,这又称为防止序号绕回PAWS。我们知道,TCP报文段的序号只有32位,而每增加2 ^32 个序号就会重复使用原来用过的序号。当使用高速网络时,在一次TCP连接的数据传送中序号很可能被重复使用。例如,当使用1.5Mbit/s的速度发送报文段时,序号重复要6小时以上。但若用2.5Gbit/s的速率发送报文段,则不到14秒钟序号就会重复。为了使接收方能够把新的报文段和迟到很久的报文段区分开,则可以在报文段中加上这种时间戳。

    展开全文
  • tcp首部

    2012-05-10 17:45:14
    tcp首部
  • TCP首部详解

    2021-04-29 17:01:05
    笔者认为在了解了TCP协议的特点及原理之后,再回过头来看TCP的首部,追根溯源更为有趣,如果在你还不知道它怎么建立连接,怎么传输数据,怎么保证它的可靠性的时候,就开始看TCP首部格式,就会一脸懵圈,不知所云,...

    导语:TCP协议是一个传输控制协议,顾名思义是用来控制网络数据传输的协议,位于传输层。笔者认为在了解了TCP协议的特点及原理之后,再回过头来看TCP的首部,追根溯源更为有趣,如果在你还不知道它怎么建立连接,怎么传输数据,怎么保证它的可靠性的时候,就开始看TCP首部格式,就会一脸懵圈,不知所云,不知道首部这么多字段到底是什么鬼,有什么卵用,相反在你了解它的特点和用途之后,再回过头看它的首部定义,就会恍然大悟,有种醍醐灌顶的感觉。

    废话不多说,言归正传,一起看一下TCP首部是什么样的。

    TCP协议传输的数据单元是报文段,一个报文段分为首部和数据两个部分,TCP首部的固定长度是20B,最大长度是60B,可变选项长度为40B,组成如下图

     首部字段详解:

    1. 源端口和目的端口:占2个字节,和IP地址不同,端口号只具有本地意义,是为了标志本地计算机应用层中的不同服务进程在和传输层交互时的层间接口。在互联网中,在不同的计算机中相同的端口号没有任何关联,互不干扰。
    2. 序号(seq):seq占4个字节,在TCP的三次握手、四次挥手和数据传输过程都有用到,用来标记字节流的序号,因为数据传输过程中并不总是有序到达,为了保证数据的无差错传输,必须把每个报文段标记一个序号,这个序号表示一个报文段开始的位置,如果一个报文段序列号为1,报文段长100字节,那么下一个报文段就为101。
    3. 确认号(ack): ack占4个字节,接收方在收到数据后需要给发送方一个确认,告诉接收方收到了某一个报文。而接收方收到的报文段很多,为了让接收方知道是哪一个报文段的确认,TCP协议规定了确认号为期待收到的下一个报文段的序列号。假设接收方收到了一个报文段seq=1,报文长100字节,那么确认号为101,表明1~100的数据都已经收到。
    4. 数据偏移:数据偏移占4bit,表示TCP首部长度,之所以叫数据偏移而没有称为首部长度,大概是为了强调正真的数据部分距离该报文段的起始处的距离。TCP的固定首部长度为20个字节,可变长度为40个字节,因此,首部最大长度为60个字节
    5. 保留: 占6位,目前置为0,保留下来为以后扩展使用。

      以下6个字段为可控制位,用来控制报文段的属性


       

    6. 紧急URG:当URG=1时,表明紧急指针有效。它告诉系统此报文段中有紧急数据,应尽快发送(相当于高优先级的数据),而不要按原来的排队顺序来传送。例如,已经发送了很长的一个程序要在远地的主机上运行。但后来发现了一些问题,需要取消该程序的运行,因此用户从键盘发出中断命令。如果不使用紧急数据,那么这两个字符将存储在接收TCP的缓存末尾。只有在所有的数据被处理完毕后这两个字符才被交付接收方的应用进程。这样做就浪费了很多时间
    7. 确认ACK: 仅当ACK = 1时确认号字段才有效,当ACK = 0时确认号无效。TCP规定,在连接建立后所有的传送的报文段都必须把ACK置为1。
    8. 推送PSH: 当两个应用进程进行交互式的通信时,有时在一端的应用进程希望在键入一个命令后立即就能收到对方的响应。在这种情况下,TCP就可以使用推送(push)操作。这时,发送方TCP把PSH置为1,并立即创建一个报文段发送出去。接收方TCP收到PSH=1的报文段,就尽快地(即“推送”向前)交付接收应用进程。而不用再等到整个缓存都填满了后再向上交付。
    9.  复位RST(ReSeT):当RST=1时,表名TCP连接中出现了严重错误(如由于主机崩溃或其他原因),必须释放连接,然后再重新建立传输连接。RST置为1还用来拒绝一个非法的报文段或拒绝打开一个连接。
    10.  同步SYN(SYNchronization):  在三次握手建立连接时使用。当SYN=1而ACK=0时,表明这是一个连接请求报文段。对方若同意建立连接,则应在响应的报文段中使SYN=1和ACK=1,因此SYN置为1就表示这是一个连接请求或连接接受报文。
    11. 终止FIN(FINis):  用来释放一个连接。当FIN=1时,表明此报文段的发送发的数据已发送完毕,并要求释放运输连接。

       

    12.  窗口:   占2字节。窗口大小表示接收方允许发送方发送报文段的多少,以字节为单位,在数据传输过程中是动态变化的。之所以要有这个限制,是因为接收方的数据缓存空间是有限的。如果序号seq=1,窗口大小为1000,则表明接受方的缓存空间可以接受1000字节(序号为1~1000)的数据。
    13.  检验和:占2字节。检验和字段检验的范围包括首部和数据这两部分。在计算检验和时,不只是检验数据部分,把首部和数据部分一起检验。在发送方,将伪首部和首部以及数据部分连在一起,将其看成许多16位字串接起来的,如果数据部分不是偶数个字节,则要填充一个全零字节,然后按照二进制反码计算出这些16位字的和,高位超出进一,则进行地位叠加,最后将求得的和的反码即为发送方的检验和;在接收方,将收到的数据和伪首部一起,用二级制反码计算这些16位字的和,若结果全1,则表明无差错,否则丢弃错误报文段。简单来说,即在发送方,原码相加,高位叠加到低位,取反码,放入校验和;在接收端,将所有原码相加,高位叠加到地位, 如全为1,则正确。
    14.  紧急指针 : 占2字节。紧急指针仅在URG=1时才有意义,它指出本报文段中的紧急数据的字节数(紧急数据结束后就是普通数据) 。因此,在紧急指针指出了紧急数据的末尾在报文段中的位置。当所有紧急数据都处理完时,TCP就告诉应用程序恢复到正常操作。值得注意的是,即使窗口为0时也可以发送紧急数据。
    15.  选项 : 长度可变,最长可达4字节。当没有使用“选项”时,TCP的首部长度是20字节。选项包含最大报文段长度(MSS)、窗口扩大、时间戳、选择确认等。
    • 最大报文段长度: 指的是报文段中数据字段的最大长度,不包含首部长度。默认值为536字节,为了提高网络利用率,MSS要尽可能大一些,只要在IP层传输时不需要再分片就行。
    • 窗口扩大选项:占3个字节,其中一个字节表示移位值S,新的窗口值等于TCP首部中的窗口位数从16增大到(16+S),窗口值为2^(16+S)-1。
    • 时间戳:占10个字节,包含时间戳值和时间戳回送回答等字段。有两个用途,一是用来计算往返时间RTT,二是防止在高速传输速率下报文段序号重复,在报文段上加上时间戳,就可以区分开相同序号的不同报文段。
    • 选择确认: 用来指明窗口中不连续报文段的边界信息,有了边界信息,就可以减少不必要的重传。

     

     

     

     

    展开全文
  • MAC首部 IP首部 TCP首部介绍

    千次阅读 2020-07-24 12:12:46
    了解数据传输过程中的MAC帧首部,IP数据包首部,TCP首部。了解结构是基本,为了直观显示,本文采用抓包的方式逐层验证这些首部结构。同时,列出这些首部结构在系统中C语言结构体的实现。

    0. 前言

    因为原生套接字编程,需要了解数据传输过程中的MAC帧首部,IP数据包首部,TCP首部。了解结构是基本,为了直观显示,本文采用抓包的方式逐层验证这些首部结构。同时,列出这些首部结构在系统中C语言结构体的实现。

    抓包工具采用:tcpdump + wireshark

    工具使用方法:超详细的网络抓包神器 tcpdump 使用指南实战!我用 Wireshark 让你“看见“ TCP

    (“实战!我用 Wireshark 让你“看见TCP” 是一篇很好的文章,介绍了TCP的三次握手;握手过程中包丢失的几种情况等)

    1. 使用tcpdump抓取数据包

      # 数据准备
      sudo tcpdump -nn tcp and host www.baidu.com -w http.pcap
      curl www.baidu.com
      
    2. 使用wireshark展示数据包内容
      在这里插入图片描述


    1. 背景介绍

    了解主机之间的数据传输过程

    在这里插入图片描述

    了解数据封装和解封装过程,下面图片传输层使用TCP进行举例。

    在这里插入图片描述

    这里值得特别注意的是,在每一层,有不同的英文术语来对应包的概念,比如在 TCP 层的包叫做 Segment,在 IP 层的叫做 Packet,在链路层的叫做 Frame,另外和 TCP 位于同一层的 UDP 包我们一般叫做 Datagram


    3. MAC首部

    以太帧有很多种类型。不同类型的帧具有不同的格式和MTU值。

    如何选择使用哪种格式的帧我不知道。下面仅仅看Ethernet_II 帧格式

    在这里插入图片描述

    字段含义
    目的地址接收帧的网络适配器的物理地址(MAC 地址),为 6 个字节(48 比特)。作用是当网卡接收到一个数据帧时,首先会检查该帧的目的地址,是否与当前适配器的物理地址相同,如果相同,就会进一步处理;如果不同,则直接丢弃。
    源地址发送帧的网络适配器的物理地址(MAC 地址),为 6 个字节(48 比特)。
    类型上层协议的类型。由于上层协议众多,所以在处理数据的时候必须设置该字段,标识数据交付哪个协议处理。例如,字段为 0x0800 时,表示将数据交付给 IP 协议。
    数据也称为效载荷,表示交付给上层的数据。以太网帧数据长度最小为 46 字节,最大为 1500 字节。如果不足 46 字节时,会填充到最小长度。最大值也叫最大传输单元(MTU)。 在 Linux 中,使用 ifconfig 命令可以查看该值,通常为 1500。
    帧检验序列 FCS检测该帧是否出现差错,占 4 个字节(32 比特)。发送方计算帧的循环冗余码校验(CRC)值,把这个值写到帧里。接收方计算机重新计算 CRC,与 FCS 字段的值进行比较。如果两个值不相同,则表示传输过程中发生了数据丢失或改变。这时,就需要重新传输这一帧。

    在这里插入图片描述

    // 结构体位置:/usr/include/net/ethernet.h
    struct ether_header
    {
      uint8_t  ether_dhost[ETH_ALEN];	/* destination eth addr	*/
      uint8_t  ether_shost[ETH_ALEN];	/* source ether addr	*/
      uint16_t ether_type;		        /* packet type ID field	*/
    } __attribute__ ((__packed__));
    

    4. IP首部

    IP首部分为IPv4首部和IPv6首部,下面仅仅列出IPv4首部。

    IPv4 数据报头字段如图所示。
    在这里插入图片描述

    IP 报头的最小长度为 20 字节,上图中每个字段的含义如下:

    1) 版本(version)

    占 4 位,表示 IP 协议的版本。通信双方使用的 IP 协议版本必须一致。

    2) 首部长度(网际报头长度IHL)

    占 4 位,可表示的最大十进制数值是 15。这个字段所表示数的单位是 32 位字长(1 个 32 位字长是 4 字节)。因此,当 IP 的首部长度为 1111 时(即十进制的 15),首部长度就达到 60 字节。当 IP 分组的首部长度不是 4 字节的整数倍时,必须利用最后的填充字段加以填充。

    数据部分永远在 4 字节的整数倍开始,这样在实现 IP 协议时较为方便。首部长度限制为 60 字节的缺点是,长度有时可能不够用,之所以限制长度为 60 字节,是希望用户尽量减少开销。最常用的首部长度就是 20 字节(即首部长度为 0101),这时不使用任何选项。

    3) 区分服务(tos)

    也被称为服务类型,占 8 位,用来获得更好的服务。这个字段在旧标准中叫做服务类型,但实际上一直没有被使用过。1998 年 IETF 把这个字段改名为区分服务(Differentiated Services,DS)。只有在使用区分服务时,这个字段才起作用。

    4) 总长度(totlen)

    首部和数据之和,单位为字节。总长度字段为 16 位,因此数据报的最大长度为 2^16-1=65535 字节。

    5) 标识(identification)

    用来标识数据报,占 16 位。IP 协议在存储器中维持一个计数器。每产生一个数据,计数器就加 1,并将此值赋给标识字段。当数据报的长度超过网络的 MTU,而必须分片时,这个标识字段的值就被复制到所有的数据报的标识字段中。具有相同的标识字段值的分片报文会被重组成原来的数据报

    6) 标志(flag)

    占 3 位。第一位未使用,其值为 0。第二位称为 DF(不分片),表示是否允许分片。取值为 0 时,表示允许分片;取值为 1 时,表示不允许分片。第三位称为 MF(更多分片),表示是否还有分片正在传输,设置为 0 时,表示没有更多分片需要发送,或数据报没有分片。

    7) 片偏移(offsetfrag)

    占 13 位。**当报文被分片后,该字段标记该分片在原报文中的相对位置。**片偏移以 8 个字节为偏移单位。所以,除了最后一个分片,其他分片的偏移值都是 8 字节(64 位)的整数倍。

    8) 生存时间(TTL)

    表示数据报在网络中的寿命,占 8 位。该字段由发出数据报的源主机设置。其目的是防止无法交付的数据报无限制地在网络中传输,从而消耗网络资源。

    路由器在转发数据报之前,先把 TTL 值减 1。若 TTL 值减少到 0,则丢弃这个数据报,不再转发。因此,TTL 指明数据报在网络中最多可经过多少个路由器。TTL 的最大数值为 255。若把 TTL 的初始值设为 1,则表示这个数据报只能在本局域网中传送。

    9) 协议

    表示该数据报文所携带的数据所使用的协议类型,占 8 位。该字段可以方便目的主机的 IP 层知道按照什么协议来处理数据部分。不同的协议有专门不同的协议号。

    例如,TCP 的协议号为 6,UDP 的协议号为 17,ICMP 的协议号为 1。

    10) 首部检验和(checksum)

    用于校验数据报的首部,占 16 位。数据报每经过一个路由器,首部的字段都可能发生变化(如TTL),所以需要重新校验。而数据部分不发生变化,所以不用重新生成校验值。

    11) 源地址

    表示数据报的源 IP 地址,占 32 位。

    12) 目的地址

    表示数据报的目的 IP 地址,占 32 位。该字段用于校验发送是否正确。

    13) 可选字段

    该字段用于一些可选的报头设置,主要用于测试、调试和安全的目的。这些选项包括严格源路由(数据报必须经过指定的路由)、网际时间戳(经过每个路由器时的时间戳记录)和安全限制。

    14) 填充

    由于可选字段中的长度不是固定的,使用若干个 0 填充该字段,可以保证整个报头的长度是 32 位的整数倍。

    15) 数据部分

    表示传输层的数据,如保存 TCP、UDP、ICMP 或 IGMP 的数据。数据部分的长度不固定。

    我不进行标注了,标注比较麻烦,可自行对比数据,我从网上找了张图。

    在这里插入图片描述

    IP头部结构体实现有两种定义方式,如下所示。这两种有什么区别?分别在什么场合下使用?

    我目前仅仅看到这一篇:Difference between struct ip and struct iphdr

    struct ip and struct iphdr are two different definitions of the same underlying structure, brought in from different places.

    struct ip is defined in <netinet/ip.h>, which is a reasonably standard header on UNIX systems.

    struct iphdr is defined in <linux/ip.h>. This header (and structure) are Linux-specific, and will not be present in other operating systems.

    If you’re not sure which one to use, use struct ip; code which uses this structure is more likely to be portable to non-Linux systems.

    // 结构体位置 /usr/include/netinet/ip.h
    struct iphdr
      {
    #if __BYTE_ORDER == __LITTLE_ENDIAN
        unsigned int ihl:4;
        unsigned int version:4;
    #elif __BYTE_ORDER == __BIG_ENDIAN
        unsigned int version:4;
        unsigned int ihl:4;
    #else
    # error	"Please fix <bits/endian.h>"
    #endif
        uint8_t tos;
        uint16_t tot_len;
        uint16_t id;
        uint16_t frag_off;
        uint8_t ttl;
        uint8_t protocol;
        uint16_t check;
        uint32_t saddr;
        uint32_t daddr;
        /*The options start here. */
      };
    
    struct ip
      {
    #if __BYTE_ORDER == __LITTLE_ENDIAN
        unsigned int ip_hl:4;		/* header length */
        unsigned int ip_v:4;		/* version */
    #endif
    #if __BYTE_ORDER == __BIG_ENDIAN
        unsigned int ip_v:4;		/* version */
        unsigned int ip_hl:4;		/* header length */
    #endif
        uint8_t ip_tos;			/* type of service */
        unsigned short ip_len;		/* total length */
        unsigned short ip_id;		/* identification */
        unsigned short ip_off;		/* fragment offset field */
    #define	IP_RF 0x8000			/* reserved fragment flag */
    #define	IP_DF 0x4000			/* dont fragment flag */
    #define	IP_MF 0x2000			/* more fragments flag */
    #define	IP_OFFMASK 0x1fff		/* mask for fragmenting bits */
        uint8_t ip_ttl;			/* time to live */
        uint8_t ip_p;			/* protocol */
        unsigned short ip_sum;		/* checksum */
        struct in_addr ip_src, ip_dst;	/* source and dest address */
      };
    

    5. TCP首部

    在这里插入图片描述

    1. 源端口和目的端口:各占2个字节.端口是传输层和应用层的服务接口。传输层的复用和分用功能都有要通过端口才能实现。

    2. 序号:占4个字节,序号范围是(0,2^32 - 1),共2^32 (即4294967296)个序号。序号增加到2^32-1后,下一个序号就又回到0。也就是说,序号使用mod 2^32运算。TCP是面向字节流的。在一个TCP连接中传送的字节流中的每一个字节都按顺序编号。整个要传送的字节流的起始序号必须在连接建立时设置。首部中的序号字段值则是指的是本报文段所发送的数据的第一个字节的序号。例如,一报文段的序号是301,而接待的数据共有100字节。这就表明:本报文段的数据的第一个字节的序号是301,最后一个字节的序号是400。显然,下一个报文段(如果还有的话)的数据序号应当从401开始,即下一个报文段的序号字段值应为401。这个字段的序号也叫“报文段序号”。

    3. 确认号:占4字节,是期望收到对方下一个报文段的第一个数据字节的序号。例如,B正确收到了A发送过来的一个报文段,其序号字段值是501,而数据长度是200字节(序号501~700),这表明B正确收到了A发送的到序号700为止的数据。因此,B期望收到A的下一个数据序号是701,于是B在发送给A的确认报文段中把确认号置为701。注意,现在确认号不是501,也不是700,而是701。

      若确认号为N,则表明,起始序号到序号N-1为止的所有数据都已正确收到,期望的序号是N。

    4. 数据偏移(即首部长度):占4位,它指出TCP报文段的数据起始处距离TCP报文段的起始处有多远。这个字段实际上是指出TCP报文段的首部长度。由于首部中还有长度不确定的选项字段,因此数据偏移字段是必要的,但应注意,“数据偏移”的单位是32位字(即以4字节的字为计算单位)。由于4位二进制数能表示的最大十进制数字是15,因此数据偏移的最大值是60字节,这也是TCP首部的最大字节(即选项长度不能超过40字节)。

    5. 保留:占6位,保留为今后使用,但目前应置为0。

    6. 紧急URG(URGent):占1位, 当URG=1时,表明紧急指针字段有效。它告诉系统此报文段中有紧急数据,应尽快发送(相当于高优先级的数据),而不要按原来的排队顺序来传送。例如,已经发送了很长的一个程序要在远地的主机上运行。但后来发现了一些问题,需要取消该程序的运行,因此用户从键盘发出中断命令。如果不使用紧急数据,那么这两个字符将存储在接收TCP的缓存末尾。只有在所有的数据被处理完毕后这两个字符才被交付接收方的应用进程。这样做就浪费了很多时间。当URG置为1时,发送应用进程就告诉发送方的TCP有紧急数据要传送。于是发送方TCP就把紧急数据插入到本报文段数据的最前面,而在紧急数据后面的数据仍然是普通数据。这时要与首部中紧急指针(Urgent Pointer)字段配合使用。

    7. 确认ACK(ACKnowledgment):占1位, 仅当ACK = 1时确认号字段才有效,当ACK = 0时确认号无效。TCP规定,在连接建立后所有的传送的报文段都必须把ACK置为1。

    8. 推送PSH(Push):占1位,当两个应用进程进行交互式的通信时,有时在一端的应用进程希望在键入一个命令后立即就能收到对方的响应。在这种情况下,TCP就可以使用推送(push)操作。这时,发送方TCP把PSH置为1,并立即创建一个报文段发送出去。接收方TCP收到PSH=1的报文段,就尽快地(即“推送”向前)交付接收应用进程。而不用再等到整个缓存都填满了后再向上交付。

    9. 复位RST(ReSet):占1位,当RST=1时,表名TCP连接中出现了严重错误(如由于主机崩溃或其他原因),必须释放连接,然后再重新建立传输连接。RST置为1还用来拒绝一个非法的报文段或拒绝打开一个连接。

    10. 同步SYN(SYNchronization):占1位,在连接建立时用来同步序号。当SYN=1而ACK=0时,表明这是一个连接请求报文段。对方若同意建立连接,则应在响应的报文段中使SYN=1和ACK=1,因此SYN置为1就表示这是一个连接请求或连接接受报文。

    11. 终止FIN(FINish):占1位,用来释放一个连接。当FIN=1时,表明此报文段的发送发的数据已发送完毕,并要求释放运输连接。

    12. 窗口:占2个字节,窗口值是(0,2^16-1)之间的整数。窗口指的是发送本报文段的一方的接受窗口(而不是自己的发送窗口)。窗口值告诉对方:从本报文段首部中的确认号算起,接收方目前允许对方发送的数据量(以字节为单位)。之所以要有这个限制,是因为接收方的数据缓存空间是有限的。总之,窗口值作为接收方让发送方设置其发送窗口的依据。

      例如,发送了一个报文段,其确认号是701,窗口字段是1000.这就是告诉对方:“从701算起,我(即发送方报文段的一方)的接收缓存空间还可接受1000个字节数据(字节序号是701~1700),你在给我发数据时,必须考虑到这一点。”

      窗口字段明确指出了现在允许对方发送的数据量。窗口值经常在动态变化。

    13. 检验和:占2个字节,检验和字段检验的范围包括首部和数据这两部分。和UDP用户数据报一样,在计算检验和时,要在TCP报文段的前面加上12字节的伪首部。伪首部的格式和UDP用户数据报的伪首部一样。但应把伪首部第4个字段中的17改为6(TCP的协议号是6);把第5字段中的UDP中的长度改为TCP长度。接收方收到此报文段后,仍要加上这个伪首部来计算检验和。若使用TPv6,则相应的伪首部也要改变。

    14. 紧急指针:占2个字节,紧急指针仅在URG=1时才有意义,它指出本报文段中的紧急数据的字节数(紧急数据结束后就是普通数据) 。因此,在紧急指针指出了紧急数据的末尾在报文段中的位置。当所有紧急数据都处理完时,TCP就告诉应用程序恢复到正常操作。值得注意的是,即使窗口为0时也可以发送紧急数据。

    15. 选项:长度可变,最长可达40字节。当没有使用“选项”时,TCP的首部长度是20字节。其最大长度可根据TCP首部长度进行推算。TCP首部长度用4位表示,那么选项部分最长为:(2^4-1)*4-20=40字节。

      • MSS最大报文段长度(Maxium Segment Size):TCP最初只规定了一种选项,即最大报文段长度MSS(Maximum Segment Szie)。注意MSS这个名词含义。MSS是每一个TCP报文段中的数据字段的最大长度。数据字段加上TCP首部才等于整个的TCP报文段。所以MSS并不是整个TCP报文段的最大长度,而是“TCP报文段长度减去TCP首部长度”。

      • 为什么要规定一个最大报文长度MSS呢?

        • 这并不是考虑接受方的接收缓存可能存放不下TCP报文段中的数据。实际上,MSS与接收窗口值没有关系。我们知道,TCP报文段的数据部分,至少要加上40字节的首部(TCP首部20字节和IP首部20字节,这里还没有考虑首部中的可选部分)才能组装成一个IP数据报。若选择较小的MSS长度,网络的利用率就降低。设想在极端情况下,当TCP报文段只含有1字节的数据时,在IP层传输的数据报的开销至少有40字节(包括TCP报文段的首部和IP数据报的首部)。这样,对网络的利用率就不会超过1/41。到了数据链路层还要加上一些开销。但反过来,若TCP报文段非常长,那么在IP层传输时就有可能要分解成多个短数据报片。在终点要把收到的各个短数据报片组成成原来的TCP报文段,当传输出错时还要进行重传,这些也都会使开销增大。
        • 因此,MSS应尽可能大些,只要在IP层传输时不需要分片就行。由于IP数据报所经历的路径是动态变化的,因此在这条路径上确定的不需要的分片的MSS,如果改走另一条路径就可能需要进行分片。因此最佳的MSS是很难确定的。在连接过程中,双方都把自己能够支持的MSS写入这一字段,以后就按照这个数值传输数据,两个传送方向可以有不同的MSS值。若主机未填写这一项,则MSS的默认值是536字节长。因此,所有在互联网上的主机都应该接受的报文段长度是536+20(固定首部长度)=556字节。
      • 其他选项:

        • 窗口扩大选项

          (Windows Scaling):是为了扩大窗口。我们知道,TCP首部中窗口字段长度是16位,因此最大的窗口大小为64K字节。虽然这对早期的网络是足够用的,但对于包含卫星信道的网络,传播时延和宽带都很大,要获得高吞吐量需要更大的窗口大小。

          • 窗口扩大选项占3字节,其中有一个字节表示移位值S。新的窗口值等于TCP首部中的窗口位数从16增大到(16+S)。移位值允许使用的最大值是14,相当于窗口最大值增大到2(16+14)-1=230-1。
          • 窗口扩大选项可以在双方初始建立TCP连接时进行协商。如果连接的某一端实现了窗口扩大,当它不再需要扩大其窗口时,可发送S=0选项,使窗口大小回到16。
        • 时间戳选项(Timestamps):占10字节,其中最主要的字段是时间戳字段(4字节)和时间戳回送回答字段(4字节)。时间戳选项有以下两个概念:

          • 用来计算往返时间RTT。发送方在发送报文段时把当前时钟的时间值放入时间戳字段,接收方在确认该报文段时把时间戳字段复制到时间戳回送回答字段。因此,发送方在收到确认报文后,可以准确地计算出RTT来。
          • 用于处理TCP序号超过232的情况,这又称为防止序号绕回PAWS。我们知道,TCP报文段的序号只有32位,而每增加232个序号就会重复使用原来用过的序号。当使用高速网络时,在一次TCP连接的数据传送中序号很可能被重复使用。例如,当使用1.5Mbit/s的速度发送报文段时,序号重复要6小时以上。但若用2.5Gbit/s的速率发送报文段,则不到14秒钟序号就会重复。为了使接收方能够把新的报文段和迟到很久的报文段区分开,则可以在报文段中加上这种时间戳。
        • SACK选择确认项(Selective Acknowledgements):用来确保只重传缺少的报文段,而不是重传所有报文段。比如主机A发送报文段1、2、3,而主机B仅收到报文段1、3。那么此时就需要使用SACK选项来告诉发送方只发送丢失的数据。那么又如何指明丢失了哪些报文段呢?使用SACK需要两个功能字节。一个表示要使用SACK选项,另一个指明这个选项占用多少字节。描述丢失的报文段2,是通过描述它的左右边界报文段1、3来完成的。而这个1、3实际上是表示序列号,所以描述一个丢失的报文段需要64位即8个字节的空间。那么可以推算整个选项字段最多描述(40-2)/8=4个丢失的报文段。

        • NOP(NO-Operation):它要求选项部分中的每种选项长度必须是4字节的倍数,不足的则用NOP填充。同时也可以用来分割不同的选项字段。如窗口扩大选项和SACK之间用NOP隔开。

    1. 填充:为了使整个首部长度是4字节的整数倍。

    在这里插入图片描述

    // 结构体位置:/usr/include/netinet/tcp.h
    // union中有两个结构体,给目标赋值的时候,可以采用两种方式
    // tcph->dest = htons (80); or tcph->th_dest = htons (80);
    // 这两个变量在同一位置
    // 应为过程中会有类型强制转换,便于取内容;所以对字节序用# if
    struct tcphdr
      {
        __extension__ union
        {
          struct
          {
    	uint16_t th_sport;	/* source port */
    	uint16_t th_dport;	/* destination port */
    	tcp_seq th_seq;		/* sequence number */
    	tcp_seq th_ack;		/* acknowledgement number */
    # if __BYTE_ORDER == __LITTLE_ENDIAN
    	uint8_t th_x2:4;	/* (unused) */
    	uint8_t th_off:4;	/* data offset */
    # endif
    # if __BYTE_ORDER == __BIG_ENDIAN
    	uint8_t th_off:4;	/* data offset */
    	uint8_t th_x2:4;	/* (unused) */
    # endif
    	uint8_t th_flags;
    # define TH_FIN	0x01
    # define TH_SYN	0x02
    # define TH_RST	0x04
    # define TH_PUSH	0x08
    # define TH_ACK	0x10
    # define TH_URG	0x20
    	uint16_t th_win;	/* window */
    	uint16_t th_sum;	/* checksum */
    	uint16_t th_urp;	/* urgent pointer */
          };
          struct
          {
    	uint16_t source;
    	uint16_t dest;
    	uint32_t seq;
    	uint32_t ack_seq;
    # if __BYTE_ORDER == __LITTLE_ENDIAN
    	uint16_t res1:4;
    	uint16_t doff:4;
    	uint16_t fin:1;
    	uint16_t syn:1;
    	uint16_t rst:1;
    	uint16_t psh:1;
    	uint16_t ack:1;
    	uint16_t urg:1;
    	uint16_t res2:2;
    # elif __BYTE_ORDER == __BIG_ENDIAN
    	uint16_t doff:4;
    	uint16_t res1:4;
    	uint16_t res2:2;
    	uint16_t urg:1;
    	uint16_t ack:1;
    	uint16_t psh:1;
    	uint16_t rst:1;
    	uint16_t syn:1;
    	uint16_t fin:1;
    # else
    #  error "Adjust your <bits/endian.h> defines"
    # endif
    	uint16_t window;
    	uint16_t check;
    	uint16_t urg_ptr;
          };
        };
    };
    

    附录

    涉及但未介绍内容

    • 从网上拼凑而来,皆是二手来源。

    • 所有的代码/文档见:github

    • 这些首部的应用,因为还需要更多的背景支持,这里暂不介绍。

    • 暂不介绍循环冗余码校验,首部校验和,字节序。

    参考文章

    超详细的网络抓包神器 tcpdump 使用指南

    实战!我用 Wireshark 让你“看见“ TCP

    展开全文
  • 而一般TCP首部和IP首部均为20字节的长度,故MSS=MTU-20(TCP首部长度)-20(IP首部长度)。 TCP首部: 1.源端口,16位;发送数据的源进程端口 2.目的端口,16位;接收数据的进程端口 3.序号,32位;代表当前TCP...

    MTU(Maximum Transmission Unit)最大传输单元,即物理接口(数据链路层)提供给其上层(IP层)的最大一次传输数据的大小,用来通知对方所能接受的数据服务单元的最大尺寸,是包或帧的最大长度,一般以字节为单位(8位为一个字节)。在以太网中,MTU为1500字节;在FDDI中,MTU为4352字节。以太网是最普遍的一种计算机网络,一般可分为两类:1.经典以太网 2.交换式以太网。经典以太网通过一根长电缆连接着所有的计算机。
    在这里插入图片描述
    然而交换式以太网的核心是一个交换机,它包含一块连接所有端口的高速背板。从外观上来看,交换机很像集线器,拥有很多端口,通过简单的插入或者拔出电缆就能完成或者删除一台主机。
    在这里插入图片描述
    FDDI(Fiber Distributed Data Interface)光纤分布式数据接口,是一种以光纤作为传输介质的高速主干网,它可以用来互连单个计算机与局域网。
    MSS(Maximum Segment Size)最大数据分段长度,是通过TCP协议提交给IP层的最大数据分段大小,不包含TCP首部和IP首部。而一般TCP首部和IP首部均为20字节的长度,故MSS=MTU-20(TCP首部长度)-20(IP首部长度)。
    TCP首部:
    在这里插入图片描述
    1.源端口,16位;发送数据的源进程端口
    2.目的端口,16位;接收数据的进程端口
    3.序号,32位;代表当前TCP数据段第一个字节占整个字节流的相对位置;
    4.确认号,32位;代表接收端希望接收的数据序号,为上次接收到数据报的序号+1,当ACK标志位为1时才有效。
    5.数据偏移,4位;实际代表TCP首部长度,单位为4个字节。
    6.保留位,6位。
    7.6个标志位,每个标志位1位;
    SYN,为同步标志,用于数据同步;
    ACK,为确认序号,ACK=1时确认号才有效;
    FIN,为结束序号,用于发送端提出断开连接;
    URG,为紧急序号,URG=1是紧急指针有效;
    PSH,指示接收方立即将数据提交给应用层,而不是等待缓冲区满;
    RST,重置连接。
    8.窗口值,16位;标识接收方可接受的数据字节数。
    9.校验和,16位;用于检验数据完整性。
    10.紧急指针,16位;只有当URG标识位为1时,紧急指针才有效。紧急指针的值与序号的相加值为紧急数据的最后一个字节位置。用于发送紧急数据。

    IP首部:
    在这里插入图片描述
    1.版本号,4位;用于标识IP协议版本,IPv4是0100,IPv6是0110,也就是二进制的4和6。
    2.首部长度,4位;用于标识首部的长度,单位为4字节,一般只推荐使用20字节的固定长度。
    3.服务类型,8位;用于标识IP包的优先级。
    4.总长度,16位;标识IP数据报的总长度。
    5.标识,16位;用于标识IP数据报(IP数据报组成:IP数据报=IP首部+TCP首部+TCP报文段的数据部分),当要求发送的IP数据报大于MTU时,IP数据报需要进行分片发送,则每个分片的IP数据报标识都是一致的。
    6.标识,3位,但目前只有2位有意义;最低位为MF,MF=1代表后面还有分片的数据报,MF=0代表当前数据报已是最后的数据报。次低位为DF,DF=1代表不能分片,DF=0代表可以分片。
    7.片偏移,13位;代表某个分片在原始数据中的相对位置。
    8.生存时间,8位;以前代表IP数据报最大的生存时间,现在标识IP数据报可以经过的路由器数。
    9.协议,8位;代表上层传输层协议的类型,1代表ICMP,2代表IGMP,6代表TCP,17代表UDP。
    10.校验和,16位;用于验证数据完整性,计算方法为,首先将校验和位置零,然后将每16位二进制反码求和即为校验和,最后写入校验和位置。
    11.源IP地址。
    12.目的IP地址。

    展开全文
  • TCP 首部详解

    千次阅读 2018-06-28 01:41:49
    TCP提供了一种可靠的面向连接的字节流运输层服务。 TCP将用户数据打包构成报文段;它发送数据后启动一个定时器;另一端对收到的数据进行确认,对失序的数据重新排序,丢弃重复数据;TCP提供端到端的流量控制,并计算...
  • IP首部、TCP首部

    2019-06-17 23:16:39
    3. TCP首部 URG 紧急指针(urgent pointer) ACK 确认序号有效 PSH 接收方应尽快把这个报文段交给应用层 RST 重建连接 SYN 同步序号,用来发起一个连接 FIN 结束一个连接 4.UDP首部 ...
  • TCP首部报文段格式

    千次阅读 2018-05-18 10:42:03
    最近《计算机网络》这本书看到了传输层的 TCP 协议,因为TCP 的全部功能都体现在它的首部中,因此觉得有必要将这些知识梳理一下。 首先TCP 是面向字节流的。这个流指的是流入到进程或从进程流出的字节序列。面向...
  • TCP首部解析

    千次阅读 2018-06-22 18:23:30
    TCP提供一种面向连接的、可靠的字节流服务。面向连接意味着两个使用TCP的应用(通常是一个客户和一个服务器)在彼此交换数据之前必须先建立一个TCP连接。...TCP首部的数据格式。如果不计任选字段,它...
  • TCP协议 & TCP首部

    千次阅读 2018-11-11 21:54:17
    说明:TCP协议十分复杂和重要,对于个人已经掌握的点在本文就不在详述。 常识:服务器和客户端判断对方是否已经关闭连接的方法:read函数返回0 [1]TCP头部结构、TCP头部选项结构 TCP选项详解: [2]使用...
  • TCP首部信息

    千次阅读 2017-12-03 10:29:46
    一、TCP的连接 TCP的连接端点叫做套接字或插口。根据TFC793的定义:端口号拼接到IP地址的端点构成了套接字。因此,套接字的表示方法是在点分十进制的IP地址之后写上端口号,中间用冒号或逗号隔开。例如,若IP地址是...
  • TCP校验和,TCP校验和不仅要校验20位的TCP首部TCP首部后面的数据,还要在TCP首部前加上两个IP(每个IP四个字节)、十六位的TCP协议(为0x0006)、TCP首部与数据部分的字节数(即TCP首部和数据加起来的长度)组成的...
  • 我们都知道每一个TCP连接都在内核中有接收缓冲区和发送缓冲区,但这些缓冲区的大小都是有限的,如果发送端发送数据太快,接收端来不及处理,接收...接收端将自己的接收缓冲区的大小放入TCP首部的窗口大小字段,通过...
  • TCP协议(1)--TCP首部

    千次阅读 2018-07-19 17:20:07
    TCP首部格式: TCP首部中没有表示包长度和数据长度的字段。可由IP层计算出TCP包长。 即IP首部的数据包长度-IP首部长度 由TCP包长可知数据的长度。 1.源端口号:表示发送端端口号,字段长度16位 2.目标端口号...
  • 16-tcp首部分析一

    2018-04-28 15:35:30
    1. tcp首部格式   在分析tcp首部之前,先来看一下tcp报文段格式,tcp协议能够实现数据分段传输,可靠传输,流量控制,网络拥塞避免等功能,tcp协议的首部比udp协议的首部字段多,因此tcp协议功能比udp协议要复杂...
  • 前言 TCP(Transmisson Control Protocol)又叫传输控制... TCP首部介绍(端口、序号、确认号、数据偏移)2. 抓包分析TCP首部3. TCP首部标记位介绍 1. TCP首部介绍(端口、序号、确认号、数据偏移) 先通过图看一下 2.
  • 1.URG:作用与发送端,当URG=1时,说明此数据段需要立即发送,此时发送端不考虑发送顺序问题,立刻将此数据包发送出去 ...5.SYN:只有建立请求和确认请求的两个数据包中,SYN=1,即TCP三次握手的前两次握手...
  • tcp首部数据偏移的问题

    千次阅读 2020-06-28 14:16:54
    占4比特,表示数据开始的地方离TCP段的起始处有多远。实际上就是TCP段首部的长度。...数据偏移以32位为长度单位,也就是4个字节,因此TCP首部的最大长度是60个字节。即偏移最大为15个长度单位=1532位=154字节 ...
  • 计算机网络(二十四)UDP及TCP首部的格式UDP首部的格式a.源端口号(Source Port)b.目标端口号(Destination Port)c.包长度(Length)d.校验和(Checksum)TCP首部格式1.源端口号 (Source Port)2.目标端口号 (Destination ...
  • TCP报文段首部 固定20字节,还有可变长度 1-2字节:源端口 3-4字节:目标端口 5-8字节:序号,第一个数据在文件中的第几个字节 9-12字节:确认序号,应该发第几个序号开始的字节 13字节:数据偏移+保留。指定从哪里...
  • 在大多数情况下,黑客将首先从主机受害者中抽取TCP ISN,在响应连接请求时查找TCP实现选择的初始序列号中的模式。一旦发现了一个模式,主机被连接发起的连接只需要几分钟的时间。   序列和确认号的例子 为了...
  • 文章目录一、TCP首部解析器的实现二、测试逻辑        上一节解析了IP首部报文后,本节继续解析TCP报文首部。TCP协议处于OSI七层模型的传输层,传输层的作用就是负责管理端到端...
  • TCP精髓
  • 关于tcp首部数据偏移的问题

    千次阅读 2020-03-30 20:06:02
    数据偏移以32位为长度单位,也就是4个字节,因此TCP首部的最大长度是60个字节。即偏移最大为15个长度单位=15*32位=15*4字节 参考文章:http://www.cnblogs.com/zhuyf87/archive/2012/12/29/2838937.h...
  • TCP首部格式要解析TCP报文,首先要了解它的首部格式: TCP协议的可靠性就体现在首部的序号和确认序号。可以保证数据的按序到达,和数据丢包后的重传机制。 (1)序号:TCP是面向字节流的,在一个TCP连接中传送的...
  • 平时我们谈到TCP/IP协议时总会自然的想到三次握手、四次挥手、面向字节流和可靠传输等等。但是我们要知道TCP/IP协议不仅仅是一个简单的协议,而是一个TCP/IP协议族,里面包括TCP、UDP、IP和ARP等等许多协议。但是...
  • ip/tcp 首部长度字段

    千次阅读 2014-02-26 23:25:39
    tcphdr->doff:TCP首部长度; iiphdr结构详解: include struct iphdr { #if defined(__LITTLE_ENDIAN_BITFIELD) __u8 ihl:4, version:4; #elif defined (__BIG_ENDIAN_BITFIELD) __u8 
  • TCP/IP详解--TCP首部选项字段的作用

    千次阅读 2014-12-30 12:22:57
    1、TCP首部选项字段多达40B,记下一些常用的东西: 2、选项结束字段(EOP,0x00),占1B,一个报文段仅用一次。放在末尾用于填充,用途是说明:首部已经没有更多的消息,应用数据在下一个32位字开始处 3、无...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 58,992
精华内容 23,596
关键字:

tcp首部