MAC首部 IP首部 TCP首部介绍

21 篇文章 9 订阅
订阅专栏
21 篇文章 0 订阅
订阅专栏

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

ryan4yin#knowledge#IP TCP UDP 的首部字段对比1
07-25
(实际就是ip包的数据长度)只有一个长度字段:指UDP包的总长度(实际上该数据是冗余的,它也同 tcp 的第二点一样,可用 ip 包信息推算出来)因为这个字段为
网络中TCPIPMAC、UDP的头部格式信息
mocas_wang的博客
11-03 3897
编辑 版权 本文非原创,图片等资源都来自原博,仅供学习之用。原博见脚注。 缩略语 英文名称 解释 AES Advanced Encryption Standard 高级加密标准 CA Certificate Authority 证书机构 DES Data Encryption Standard 数据加密标准 HTTPS Hypertext Transfer Protocol Secure 安全超文本传输协议 MAC Message Authentication Code 消息验...
HTTP、TCP/IP小结
weixin_42679286的博客
06-11 306
超文本传输协议: HTTP 通信传输(互联网中传输细节是不可控的) 客户 -->HTTP数据(HTTPb报文) -->TCP首部[HTTP数据](TCP报文段) -->IP首部[TCP首部[HTTP数据]](IP数据包) -->以太网首部[IP首部[TCP首部[HTTP数据]]](网络架构) -->服务器 服务器 -->以太网首部[IP首部[TCP首部[HTTP数据]]](网络架构) -->IP首部[TCP首部[HTTP数据]](IP数据包) -->TC
传输层协议-TCP首部结构
10-26
传输层协议-TCP首部结构传输层协议-TCP首部结构传输层协议-TCP首部结构
行业资料ip首部校验和算法.doc
05-30
行业资料ip首部校验和算法.doc
以太网的MAC帧(一)
热门推荐
bob的博客
08-02 2万+
以太网MAC帧格式有两种标准:DIX Ethernet V2标准和IEEE 802.3标准。DIX以太网V2标准的帧格式如图: 前导码: 使接收端与发送端时钟同步,在帧的前面插入的8字节,可再分为两字段:第一个字段共7字节,是前同步码,用来迅速实现MAC帧的比特同步;第二个字段是帧开始定界符,表示后面的信息就是MAC帧。 注意: MAC帧并不需要帧结束符, 因为以太网在传送帧时,各帧之间必须有一定的间隙。因此,接收端只要找到帧开始定界符,其后面连续到达的比特流就都属于同一个MAC帧,所以上图只有帧开始定
计算机网络9 无线网络和移动网络
whitefish520的博客
01-07 3633
无线局域网WLAN 无线局域网WLAN(wireless local area network)提供了移动接入的功能,由于手机普及率高,通过无线局域网接入互联网成为当今最常用的上网方式 便携站:便于移动的,但是便携站工作时位置固定不变 移动站:不仅能移动,而且可以在移动的过程中通信, 移动站一般使用电池供电 无线局域网的组成 无线局域网可以分为两类 有固定基础设施的:有预先建立起来的、能够覆盖一定地理范围的一批固定基站 无固定基础设施的 IEEE 802.11 对于有固定基础设施的无线局域网,IEE
MAC/IP/TCP/UDP头结构分析
u010783226的专栏
07-24 1771
目录 一、MAC帧头定义 二、IP头结构的定义 三、TCP头结构定义 四、UDP头结构的定义 一、MAC帧头定义 MAC帧是数据帧的一种。而所谓数据帧,就是数据链路层的协议数据单元,它包括三部分:帧头,数据部分,帧尾。其中,帧头和帧尾包含一些必要的控制信息,比如同步信息、地址信息、差错控制信息等;数据部分则包含网络层传下来的数据,比如ip数据包。 目前,有四种不同格式的以太网帧在使用,它们分别是: Ethernet II即DIX 2.0:Xerox与DEC、Intel在1982年制定的以太网标
计算机网络(八):从输入网址到网页显示发生了什么?
weixin_48922154的博客
08-08 1213
文章目录1. URL 解析2. DNS 解析3. TCP 连接4. 发送HTTPS请求5. IP 首部MAC 首部 1. URL 解析 首先浏览器做的第一步操作就是对URL进行解析。 以 https://blog.csdn.net/weixin_48922154 为例: 先通过该URL检查是否是合法的URL。通过URL检测使用的协议,请求的服务器以及请求的文件。 再检查缓存,如果有该内容的浏览器缓存,那么就不需要请求服务器而直接显示页面。 否则,就通过解析这些信息之后,使用这些信息生成HTTP请求消息
802.11 帧(MAC架构)
weixin_37778713的博客
04-26 4394
802.11帧封装及帧格式802.11帧封装数据链路层物理层802.11帧格式帧结构帧控制字段(1)协议版本(2)类型与子类型(3)到DS和从DS(4)更多分片(5)重传字段(6)功率管理(7)更多数据(8)受保护帧(9)排序时长/ID地址序列控制字段数据帧控制帧RTSCTSACKPS-Poll管理帧1、Beacon帧2、检测要求3、检测应答4、 IBSS的数据待传指示通知信息(ATIM)帧5、解...
关于TCP首部的CTL字段的理解.docx
05-01
TCP精髓
tcp首部
05-10
tcp首部
mac头和ip头部详解
hzj_001的博客
08-18 9009
报文封装整体结构 mac帧头定义 /*数据帧定义,头14个字节,尾4个字节*/ typedef struct _MAC_FRAME_HEADER { char m_cDstMacAddress[6]; //目的mac地址 char m_cSrcMacAddress[6]; //源mac地址 short m_cType;      //上一层协议类型,如0x0...
温故知新:IP头部
岁月留痕
10-31 3956
总是注重于应用层协议~冷不丁突然提起网络层、传输层的概念细节~真想不起了~嗯~温故知新吧~复习啦:(照例,网上转载的啦)1、IP报文格式    IP协议是TCP/IP协议族中最为核心的协议。它提供不可靠、无连接的服务,也即依赖其他层的协议进行差错控制。在局域网环境,IP协议往往被封装在以太网帧(见本章1.3节)中传送。而所有的TCP、UDP、ICMP、IGMP数据都被封装在IP数据报中传送
网络协议 — TCP协议与HTTP协议
qq_38658567的博客
07-26 7251
HTTP HTTP协议是超文本传输协议(默认端口80),服务器传输超文本到本地浏览器的传送协议,HTTP是一个基于TCP/IP通信协议来传送数据的,HTTP就是客户端→服务端的数据传输。 大致工作流程: (1)客户与服务器建立连接; (2)客户向服务器提出请求; (3)服务器接受请求,并根据请求返回相应的文件作为应答; (4)客户与服务器关闭连接。 HTTP协议的主要特点可概括如下: 支持客户/服务器模式。 简单快速:客户向服务器请求服务时,只需传送请求方法和路径。请求方法常用的有GET、HEAD、POS
添加MAC首部的过程
zhang1806618的博客
02-24 769
因为要用到MAC首部,细细研究了仿真中帧首部的添加及使用环节。只写出结果,找到这个结果耗费了很长时间,过程就不写了。 一、添加环节 1.https://blog.csdn.net/zhang1806618/article/details/107753611中写到了调用QueueUpIpFragmentForMacLayer发送数据。在该函数中调用NetworkIpOutputQueueInsert()函数,将一个消息插入输出队列,然后调用MAC_NetworkLayerHasPacketToSend.
autoconf介绍2
大草的博客
03-25 1479
了解autoconf中更多的宏
docker入门
大草的博客
12-18 544
分析dockerfile文件,理解dokcer qq的构建过程:deepin --> wine --> qq。 简单地了解Namespace和Cgroup的使用,构建一个程序。该程序首先对环境进行隔离:使用自己的hostname、进行IPC|PID隔离、通过chroot使用自己的/proc,完成运行程序的用户和容器内用户的映射。在资源隔离方面,限制该程序最多只能使用10%的CPU。 缺点是,用户组映射没有成功、内存限制没有成功、没有对其进行网络隔离和磁盘I/O限制、没有使用联合文件系统。
tcp首部紧急urg
最新发布
04-09
TCP(传输控制协议)是一种常用的网络传输协议,它在数据传输过程中使用TCP首部来管理和控制数据的传输。其中,TCP首部中的紧急(URG)字段用于指示数据包中是否包含紧急数据。 当TCP首部中的URG字段被设置为1时,表示该数据包中包含紧急数据。紧急数据通常用于在数据流中插入一些重要的信息,以便接收方能够及时处理。URG字段的设置可以通过TCP首部中的紧急指针字段来指定紧急数据的结束位置。 需要注意的是,TCP的紧急数据机制并不是经常被使用的特性,它在现实应用中并不常见。大多数情况下,TCP协议主要关注数据的可靠传输和流量控制等方面。

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

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
写文章

热门文章

  • latex12-LaTeX数学公式的多行公式(一) 115149
  • 51单片机的串口通信(一) 75228
  • python画图 68816
  • latex中自定义的命令———\newcommand 57299
  • 51单片机LED点阵实验(74HC595) 24456

分类专栏

  • 玩具代码
  • 从头实现一个代理工具 11篇
  • 将wrk2移植到windnows上 3篇
  • 从头实现一个网络阻断工具 10篇
  • 从头实现一个web留言板 9篇
  • 杂项知识点 23篇
  • 软件安装 19篇
  • C/C++ 3篇
  • c/c++编程 18篇
  • 网络编程 21篇
  • 环境编程 17篇
  • boost 4篇
  • Linux系统与操作 24篇
  • 读书笔记 1篇
  • 计算机安全 21篇
  • 数据结构与算法 45篇
  • 模糊测试 14篇
  • 容器与虚拟机 9篇
  • 设计模式 27篇
  • openssl 7篇
  • 客户端开发 8篇
  • bpf 13篇
  • 计算机图形学 6篇
  • web 8篇
  • 编译工具 9篇
  • 静态分析 11篇
  • lua 4篇
  • python 6篇
  • Java编程 6篇
  • 数据库-必知必会 12篇
  • 汇编语言 19篇
  • 单片机 11篇
  • Latex 11篇
  • 论文 7篇
  • 机器学习 5篇
  • leetcode
  • 数组 5篇
  • 链表 7篇
  • 哈希表 9篇
  • 字符串 4篇
  • 栈与队列 7篇
  • 二叉树 21篇
  • 回溯 14篇
  • 贪心 18篇
  • 动态规划 35篇
  • 图论 12篇
  • 排序 1篇

最新评论

  • librdkafka的简单使用

    2401_83974412: 支持一下!我也写了一篇获取【大厂面试真题解析、核心开发学习笔记、最新全套讲解视频、实战项目源码讲义、学习路线简历模板】的文章

  • gRPC C++ 入门教程

    csu_cangkui: 你的无语我很懂啊,安装grpc就花了好几天才弄明白,我项目是cpp11的只能手动编译安装,弄坏了好几个环境还好用的docker。直接make安装也会导致.cmake找不到,样例都过不了。好不容易安装好了还得写一堆链接的配置,恶心人

  • C语言-使用setrlimit限制进程的内存大小

    da1234cao: 把有问题的源码列出来,我看下

  • C语言-使用setrlimit限制进程的内存大小

    nof_uck: 在虚拟机centos7中运行,为什么会提示”open /proc/14453/status fail“,是因为进程运行时间过短了吗?加了个sleep之后,能在/proc/<pid>找到进程

  • C++发起https请求

    何以解忧_唯有RMB: 有空整一波支持HTTPS的VC6.0的curl库,VS20XX的也支持一波,这方面的资源太乱太杂ƪ(˘⌣˘)ʃ优雅

您愿意向朋友推荐“博客详情页”吗?

  • 强烈不推荐
  • 不推荐
  • 一般般
  • 推荐
  • 强烈推荐
提交

最新文章

  • cmocka入门教程
  • librdkafka的简单使用
  • DPDK-RCU的简明使用
2024年11篇
2023年43篇
2022年73篇
2021年257篇
2020年56篇
2019年31篇
2018年61篇
2017年3篇

目录

目录

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

da1234cao

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或 充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值

聚圣源网络起名免费网姓金的女人宝宝起名起名中间字友田真希拖泥带水的意思8笔画画的字起名傅起姓名大全起个公司的名字非主流爱情图片罗马数字5保卫延安读后感给姓林是什么男孩起名向日葵视频下载app下载安卓免费第二处女catti二级烧纸店起名我的拿手好戏智能公司起名网免费进口商品商标注册起名拶刑龙珠z粤语带睿字的起名字农夫电影网址室内装潢设计软件兄弟双胞胎起名唯一进化者廉政谈话记录晋小二刀削面加盟核聚变风云网上起名可靠不淀粉肠小王子日销售额涨超10倍罗斯否认插足凯特王妃婚姻让美丽中国“从细节出发”清明节放假3天调休1天男孩疑遭霸凌 家长讨说法被踢出群国产伟哥去年销售近13亿网友建议重庆地铁不准乘客携带菜筐雅江山火三名扑火人员牺牲系谣言代拍被何赛飞拿着魔杖追着打月嫂回应掌掴婴儿是在赶虫子山西高速一大巴发生事故 已致13死高中生被打伤下体休学 邯郸通报李梦为奥运任务婉拒WNBA邀请19岁小伙救下5人后溺亡 多方发声王树国3次鞠躬告别西交大师生单亲妈妈陷入热恋 14岁儿子报警315晚会后胖东来又人满为患了倪萍分享减重40斤方法王楚钦登顶三项第一今日春分两大学生合买彩票中奖一人不认账张家界的山上“长”满了韩国人?周杰伦一审败诉网易房客欠租失踪 房东直发愁男子持台球杆殴打2名女店员被抓男子被猫抓伤后确诊“猫抓病”“重生之我在北大当嫡校长”槽头肉企业被曝光前生意红火男孩8年未见母亲被告知被遗忘恒大被罚41.75亿到底怎么缴网友洛杉矶偶遇贾玲杨倩无缘巴黎奥运张立群任西安交通大学校长黑马情侣提车了西双版纳热带植物园回应蜉蝣大爆发妈妈回应孩子在校撞护栏坠楼考生莫言也上北大硕士复试名单了韩国首次吊销离岗医生执照奥巴马现身唐宁街 黑色着装引猜测沈阳一轿车冲入人行道致3死2伤阿根廷将发行1万与2万面值的纸币外国人感慨凌晨的中国很安全男子被流浪猫绊倒 投喂者赔24万手机成瘾是影响睡眠质量重要因素春分“立蛋”成功率更高?胖东来员工每周单休无小长假“开封王婆”爆火:促成四五十对专家建议不必谈骨泥色变浙江一高校内汽车冲撞行人 多人受伤许家印被限制高消费

聚圣源 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化