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

    2012-05-08 21:20:44
    IP首部
  • java ip首部效验和

    2020-12-07 20:31:32
    大学生网络实验课 (1)在界面上,用户能够输入或编辑IP协议包各字段数据,例如,“协议”字段应该是下拉选择 ...例如,以下是发出ping命令之后,捕获ICMP包的IP首部信息,可用用来 检验“首部校验和”字段的计算结果:
  • IP首部各种经

    2012-05-08 21:08:46
    IP首部各种经
  • IP首部、TCP首部

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

    1.数据的封装过程

    2.IP首部

    3. TCP首部

    • URG 紧急指针(urgent pointer)
    • ACK 确认序号有效
    • PSH 接收方应尽快把这个报文段交给应用层
    • RST 重建连接
    • SYN 同步序号,用来发起一个连接
    • FIN 结束一个连接

    4.UDP首部

     

    展开全文
  • IP首部分析

    2013-01-10 15:31:55
    计算机网络课程设计IP首部解析的代码,有兴趣的下下看看
  • 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

    展开全文
  • ip首部解析

    2016-12-06 15:36:41
    最近在看 tcp/ip 卷1 ,其中 ip首部 涵盖的信息 比较多,为了 作为备忘录,特做一些笔记。 其中比较难理解的有  1.4位的首部长度,这个 表示 ip首部长度,其中 它 隐含了 它的单位是 32bit,即 4字节,...

    最近在看 tcp/ip 卷1 ,其中 ip首部 涵盖的信息 比较多,为了 作为备忘录,特做一些笔记。



    其中比较难理解的有 

    1.4位的首部长度,这个 表示 ip首部长度,其中 它 隐含了 它的单位是 32bit,即 4字节,所以 4位,最大可以表示15,所以ip首部最大是15*4 = 60字节

    2. 16位的总长度,这个长度的 单位是 1字节,所以最大可以表示65356个字节。(这是网络MTU的最大值。)

    3.16位标识,3位标志,13位偏移 ,这是由于 不同网络有 不同的 MTU,所以 ip地址需要 分片 和 重组。 

      讲 这三个标志 比较好的 网址: http://www.cnblogs.com/fly1988happy/archive/2012/11/05/2755346.html

    4.首部校验和,是最难理解的,我到现在 还 是一知半解。下面 这个网址 讲解了 IP 首部校验和。

     http://blog.chinaunix.net/uid-26739173-id-3260903.html


    展开全文
  • ip首部检验和代码

    2013-12-31 21:36:42
    IP首部检验和的一些源代码,适合做课设的大学同学们
  • TCP IP首部详解

    2016-04-18 17:10:33
    IP报文首部: 版本号 占4位,标识目前采用的IP协议的版本号。一般的值为0100(IPv4),0110(IPv6) ...当ip首部的度不是4字节的倍数时,必须要用最后的填充字段填充。所以数据部分的长度要从4字节的

    IP报文首部:


    版本号

    占4位,标识目前采用的IP协议的版本号。一般的值为0100(IPv4),0110(IPv6)

    首部长度

      占4 位,用来表示IP报首部的长度。范围是0000--1111,只是在这里,我们的单位是32位字,即4个字节。所以IP首部大小范围是20—60(4*15)。当ip首部的度不是4字节的倍数时,必须要用最后的填充字段填充。所以数据部分的长度要从4字节的整数倍数开始。

     

    区分服务

    占8位,一般不使用。

     

    总长度

    占16位,表示的是数据和首部之和的长度。单位为字节,最大长度为2^16-1=65535个字节。

     

    标识

    占16位,当数据报的长度超过网络的MTU而必须分片时,这个标识就被复制到所有的数据报片的标识中。具有相同的标识字段的值使分片后的各数据报能正确的重装成原来的数据报。

     

    标志

    占3位,目前只有后两位有意义

    MF=1时,表示后面还有分片,当MF=0时,表示这已是数据报中的最后一个。

    DF=1时 表示不能有分片。当DF=0时,允许分片。

     

    片偏移

    占13位,表示当前片在原分组中相对于用户数据字段起点的相对位置。片偏移以8个字节为偏移单位。也就是说每个分片的长度一定是8字节的整数倍。

     

    生存时间TTL

    占8位表示数据报在网络中的寿命

    TTL的意义是指明数据报在因特网中至多可以经过多少路由器。显然数据报能在因特网中经过的路由器的最大数值是255。

    当TTL初始值设为1时,表明这个数据报只能在本局域网中传送。

    协议

    占8位。表示上层所使用的协议。
    以下是比较常用的协议号:

    首部检验和

    占16位 这个字段只检验数据报的首部,不会检验数据部分。数据报每经过一个路由器,路由器都要重新计算一下首部校验和。

    32位源地址

    32位目的地址

    IP报文首部结构体

        struct iphdr { 

        #ifdefined(__LITTLE_ENDIAN_BITFIELD) 

            __u8    ihl:4, 

                version:4; 

        #elif defined(__BIG_ENDIAN_BITFIELD) 

            __u8    version:4, 

                ihl:4; 

        #else 

        #error  "Please fix<asm/byteorder.h>" 

        #endif 

            __u8    tos; 

            __u16   tot_len; 

            __u16   id; 

            __u16   frag_off; 

            __u8    ttl; 

            __u8    protocol; 

            __u16   check; 

            __u32   saddr; 

            __u32   daddr; 

            /*The options start here.*/ 

        }; 

     

     

    TCP报文格式

    源端口和目的端口

    各占2个字节。TCP的分用功能也是通过端口实现的。

    序号

    TCP是面向字节流的,在TCP连接中传送的每一个字节都是按顺序编号。整个要传送的字节流的起始序号必须在连接建立时设置。

    占4个字节,表示的是本报文段中所发送的数据的第一个字节的序号。序号使用mod(2^32)运算。

    确认号

    占4个字节,是期望收到对方下一个报文段的第一个数据字节的序号。

    若确认号是N,表明到序号N-1为止的所有数据都已经正确接收。

    数据偏移:

    占4位,表示TCP数据报数据的起始处到数据报开头的偏移量,表示了TCP数据报头部的大小,单位是32位字。也就是说TCP数据报首部的最大长度是60字节。

    保留

    占6位待他日使用

    URG

    当URG=1时,表示紧急指针有效,应该尽快传送。

    ACK当ACK=1时,确认字段有效,在连接建立后的所有报文段都必须把ACK置为1。

    PSH

    当两个应用程序进行通信时,当PSH=1时,表示尽快地用“推送”给应用程序,而不用等到缓冲区满了再向上交付。

    RST

    复位,当TCP连接中出现了严重差错,必须释放连接。

    SYN

    同步当SYN=1时,表示这是一个连接请求或连接接受报文。

    FIN

    用来释放一个连接。当FIN=1时表示要求释放连接。

    窗口

    占2字节,窗口字段明确地指出了现在允许对方发送的数据量。窗口值是动态变化的。

    检验和

    占2个字节,检验和检验的范围包括首部和数据这两部分。

    紧急指针

    当URG=1时有效,它指出了紧急数据的字节数,当所有的紧急数据处理完时,TCP就告诉应用程序恢复到正常的操作中。

    TCP头部结构体


       struct tcphdr { 

           __u16   source; 

           __u16   dest; 

           __u32   seq; 

           __u32   ack_seq; 

       #if defined(__LITTLE_ENDIAN_BITFIELD) 

           __u16   res1:4,  

               doff:4, 

               fin:1, 

               syn:1, 

               rst:1, 

               psh:1, 

               ack:1, 

               urg:1, 

               ece:1, 

               cwr:1; 

       #elif defined(__BIG_ENDIAN_BITFIELD) 

           __u16   doff:4, 

               res1:4, 

               cwr:1, 

               ece:1, 

               urg:1, 

               ack:1, 

               psh:1, 

               rst:1, 

               syn:1, 

               fin:1; 

       #else 

       #error  "Adjust your <asm/byteorder.h>defines" 

       #endif   

           __u16   window; 

           __u16   check; 

           __u16   urg_ptr; 

    }; 

     

    typedef unsigned char __u8;  

    typedef unsigned short __u16;  

    typedef unsigned int __u32; 

    展开全文
  • IP首部校验和的计算

    万次阅读 2015-09-12 18:31:08
    IP首部校验和的计算
  • 1--ip首部

    2016-04-16 10:59:51
    2. Hdr len:IP首部的长度,IP首部的长度是可变的,因为有一些选项(options)选项填与不填可能使得IP首部变化; 3. Type of Service:服务类型,虽然都是发送报文,但是对报文的要求是可靠到达、优先到达还是快
  • IP首部数据报格式大解析

    千次阅读 2016-11-23 16:18:33
    IP首部数据报格式大解析
  • IP首部  4个字节的32 bit值以下面的次序传输:首先是0~7 bit,其次8~15 bit,然后1 6~23 bit,最后是24~31 bit。这种传输次序称作big endian字节序。由于T C P / I P首部中所有的二进制整数在网络中传输时都...
  • IP首部有16bit的校验和,因此,IP首部以16bit为单位计算校验和,IP首部的长度一定是16bit的整倍数,这是由于首部长字段是以32bit为单位计算的,不足的补0。 发送方计算方法: 1.首先把校验和的16bit置0。 2.将首部以...
  • TCP/IP详解之IP首部

    2015-10-27 23:45:44
    当然,这里除开某些带有选项的首部外,普通的IP首部长度的为5,即20个字节。 8位服务类型(TOS):3位的优先权子字段(现在已被忽略),4位的TOS字字段和1位未用但必须置0。4位的TOS分别代表:最小延时,最大吞吐量
  • IP首部分析-借助wireshark

    千次阅读 2016-03-04 11:20:35
    Wireshark(前称Ethereal)是一个网络封包分析软件。网络封包分析软件的功能是撷取网络封包,并尽可能显示出最为详细的网络封包资料。...版本:由4比特构成,表示标识IP首部版本号。 首部长度(IHL: Interne
  • IP首部、TCP首部、UDP首部

    万次阅读 2012-09-09 11:13:41
    IP首部 版本:L3协议版本号,IPv4或IPv6 首部长度:单位为4字节 协议:L4协议类型 TTL生存时间字段设置了数据报可以经过的最多路由器数。一旦经过一个处理它的路由器,它的值就减1。当该字段值为0时,数据报...
  • IP首部的校验和相对简单,在不是特殊类型包的情况下,IP首部长度为20字节,IP校验和就是计算这20位的校验和;TCP校验和,TCP校验和不仅要校验20位的TCP首部与TCP首部后面的数据,还要在TCP首部前加上两个IP(每个IP...
  • IP首部校验和算法

    2016-07-04 14:51:47
    IP首部校验和采用 的时反码求和算法。就是把首部看成16位的整数序列。然后反码求和。把 得到的值放入首部校验和位置。反码求和算法如下: 0和0相加是0但要产生一个进位1,0和1相加是1,1和1相加是0.若最高位相加...
  • 目录 ip首部校验和的计算方法(c语言实现)1. IP首部校验和的计算方法(C语言实现)2. 校验和计算方法3. 对校验和进行校验 ip首部校验和的计算方法(c语言实现) 1. IP首部校验和的计算方法(C语言实现) 关联博客:...
  • IP首部详解

    千次阅读 2014-11-30 17:11:12
    4位首部 长度 8位服务类型(TOS) 16位总长度 16位标识符 3位标志 13位片偏移 8位生存时间 8位协议 16位首部检验和 32位源IP地址 32位目的IP地址 32位选项(若有) 数据
  • ip首部校验和计算

    2014-03-15 12:00:16
    原文地址http://blog.csdn.net/clangke/article/details/6216610 IP首部校验和的计算方法: 1.把校验和字段清零。 2.然后对每16位(2字节)进行二进制反码求和,反码求和的意思是先对每16位求和,再将得到的和转为...
  • IP首部检验和计算

    千次阅读 2016-11-20 10:05:02
    计算IP首部检验和: 如上图,计算????是多少? 计算: 从08 00之后开始计算到后面的08 00即(两个字节的相加)45 00+00 20+D5 56+00 00+80 01+DE B7+45 5D+C0 A8+00 DC 等于 3800F 然后溢出的再次加到后面即 ...
  • IP协议 & IP首部

    2018-11-11 20:20:58
    在同一台机器上,使用telnet 127.0.0.1登陆本机,并用tcpdump抓取这个过程中telnet客户端和telnet服务器程序之间交换的IP数据报,操作见下图所示: tcpdump的-x选项,输出数据包的二进制码。 [3]IP分片 IP数据...
  • 计算IP首部检验和

    千次阅读 2014-02-17 16:02:36
    以前在学谢希仁教授主编的《计算机网络》时,一直没弄懂IP首部的校验和是如何计算的。今天在看《TCP/IP详解 卷一》时,看到了一段关于首部校验和的描述。如下: 为了计算一份数据报的IP校验和,首先把检验和的字段...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 61,538
精华内容 24,615
关键字:

ip首部