以太网HTTP数据包格式分析

以太网HTTP数据包格式分析。

一、ARP数据包结构

1、以太网头部

/* addr[6]表示6个字节的以太网地址。Representation of a 48-bit Ethernet address. */

struct uip_eth_addr {

u8_t addr[6];

};

//uip_eth_hdr型结构:以太网首部有14字节:接收方MAC地址(占6个字节),发送方MAC地址(占6个字节),以太网帧的类型(占2个字节)。

struct uip_eth_hdr {

struct uip_eth_addr dest; //uip_eth_addr结构成员是字节型数组addr[6],存放目的MAC地址

struct uip_eth_addr src; //uip_eth_addr结构成员是字节型数组addr[6],存放源MAC地址

u16_t type;

//太网帧的类型

//0x0800表示后面跟着的是IPV4数据包;

//0x0806表示后面跟着的是ARP数据包;

//0x86dd表示后面跟着的是IPV6数据包;

};

2、ARP数据包结构

struct arp_hdr

{

struct uip_eth_hdr ethhdr;

/*以太网首部有14字节:接收方MAC地址(占6个字节),发送方MAC地址(占6个字节),以太网帧的类型(占2个字节)。*/

u16_t hwtype; //硬件类型,若是以太网,值是0x0001

u16_t protocol;//协议类型,若是ipv4,值是0x0800

u8_t hwlen; //硬件长度,定义物理地址(MAC地址)的长度,若是mac地址就是6

u8_t protolen; //协议长度,定义逻辑地址(IP地址)的长度,若是ip地址就是4

u16_t opcode;

/*操作码:定义ARP分组是请求还是应答。ARP请求是1,ARP回复是2,RARP请求是3,RARP回复是4*/

struct uip_eth_addr shwaddr; //发送方的6字节mac地址

u16_t sipaddr[2]; //发送方的4字节ip地址

struct uip_eth_addr dhwaddr; //接收方的6字节mac地址

u16_t dipaddr[2]; //接收方的4字节ip地址

};

二、TCP数据包结构

TCP数据包是由"以太网首部,IP头部,TCP头部和用户数据"四部分组成。

1、以太网首部

以太网首部有14字节:接收方MAC地址(占6个字节),发送方MAC地址(占6个字节),以太网帧的类型(占2个字节)。

struct uip_eth_addr {

u8_t addr[6];

};

struct uip_eth_hdr {

struct uip_eth_addr dest; //uip_eth_addr结构成员是字节型数组addr[6],存放目的MAC地址

struct uip_eth_addr src; //uip_eth_addr结构成员是字节型数组addr[6],存放源MAC地址

u16_t type;

//报文类型

//0x0800表示后面跟着的是IPV4数据包;

//0x0806表示后面跟着的是ARP数据包;

//0x86dd表示后面跟着的是IPV6数据包;

};

2、TCP和IP头部

协议:

#define UIP_PROTO_ICMP 1 //ICMP协议编号定义为1

#define UIP_PROTO_TCP 6 //TCP协议编号定义为6

#define UIP_PROTO_UDP 17 //TCP协议编号定义为17

#define UIP_PROTO_ICMP6 58 //ICMP6协议编号定义为58

/* The TCP and IP headers. */

typedef u16_t uip_ip6addr_t[8];

//uip_ip6addr_t[]数组有8个元素,每个元素都是u16_t型。

//使用typedef修饰后,uip_ip6addr_t就变成了数据类型,可以用来声明u16型数组,且数组元素数量为8个

struct uip_tcpip_hdr {

#if UIP_CONF_IPV6

/* IPV6头部,IPv6 header. */

u8_t vtc;

u8 tcflow;

u16_t flow;

u8_t len[2];

u8_t proto;

u8_t ttl;

uip_ip6addr_t srcipaddr; //发送方IP地址占8个字节

uip_ip6addr_t destipaddr; //接收方IP地址占8个字节

#else

//IP头部/IPV4头部(IPv4 header),占20个字节

u8_t vhl; //IP版本和头部长度

u8_t tos; //服务类型

u8_t len[2]; //IP报文总长度2个字节

u8_t ipid[2]; //标识,2字节,用于分片重组

u8_t ipoffset[2]; //片偏移,2字节,包含DF/MF标志和偏移量

u8_t ttl; //生存时间

u8_t proto; //协议:1字节,6表示TCP

u16_t ipchksum; //检验和

u16_t srcipaddr[2];//发送方IP地址,4字节

u16_t destipaddr[2];//接收方IP地址,4字节

#endif

//TCP头部(TCP header)总共为20字节。

//但是,在某些场合,特别是在处理选项(Options)时,TCP头部的长度为24字节。

u16_t srcport; //发送方端口

u16_t destport; //接收方端口

u8_t seqno[4]; //序列号

u8_t ackno[4]; //确认号

u8_t tcpoffset;//数据偏移

u8_t flags; //标志位

u8_t wnd[2]; //窗口大小

u16_t tcpchksum; //校验和

u8_t urgp[2]; //紧急指针

u8_t optdata[4];

//最大段字节数1个字节,MSS选项的长度占1个字节,最大段高8数值,最大段低8数值

};

三、HTTP数据分析

1、计算机发送的ARP数据包(发送4次,采用4次握手):

0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xB4 0x2E 0x99 0x59 0xEC 0x1E 0x08 0x06 0x00 0x01 0x08 0x00 0x06 0x04 0x00 0x01 0xB4 0x2E 0x99 0x59 0xEC 0x1E 0xC0 0xA8 0x01 0xBE 0x00 0x00 0x00 0x00 0x00 0x00 0xC0 0xA8 0x01 0x11 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00

|------------------------------------|-------------------------------------------------------------------------------------------|
| 以太网首部"目的mac地址addr[6]" | 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF |
| 以太网首部"源MAC地址addr[6]" | 0xB4 0x2E 0x99 0x59 0xEC 0x1E |
| 以太网首部"以太网帧的类型type" | 0x08 0x06,表示ARP协议 |
| ARP头部"硬件类型hwtype" | 0x00 0x01 |
| ARP头部"协议类型protocol" | 0x08 0x00,表示协议类型为ipv4 |
| ARP头部"硬件长度hwlen" | 0x06,表示MAC地址长度为6个字节 |
| ARP头部"协议长度protolen" | 0x04,表示IP地址长度为4个字节 |
| ARP头部"操作码opcode" | 0x00 0x01,表示ARP请求 |
| ARP头部"发送方MAC地址addr[6]" | 0xB4 0x2E 0x99 0x59 0xEC 0x1E |
| ARP头部"发送方IP地址sipaddr[2]" | 0xC0 0xA8 0x01 0xBE,表示192.160.1.190 |
| ARP头部"接收方MAC地址addr[6]" | 0x00 0x00 0x00 0x00 0x00 0x00 |
| ARP头部"接收方IP地址dipaddr [2]" | 0xC0 0xA8 0x01 0x11,表示192.160.1.17 |
| 计算机发送数据,发现总字节数小于等于60个字节,则填充无用的填充数据 | 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 |

2、ENC28J60发送的ARP数据包(应答4次)

0xB4 0x2E 0x99 0x59 0xEC 0x1E 0x00 0x08 0xDC 0x11 0x11 0x02 0x08 0x06 0x00 0x01 0x08 0x00 0x06 0x04 0x00 0x02 0x00 0x08 0xDC 0x11 0x11 0x02 0xC0 0xA8 0x01 0x11 0xB4 0x2E 0x99 0x59 0xEC 0x1E 0xC0 0xA8 0x01 0xBE

|-----------------------------|-------------------------------------|
| 以太网首部"目的mac地址addr[6]" | 0xB4 0x2E 0x99 0x59 0xEC 0x1E |
| 以太网首部"源MAC地址addr[6]" | 0x00 0x08 0xDC 0x11 0x11 0x02 |
| 以太网首部"以太网帧的类型type" | 0x08 0x06,表示ARP协议 |
| ARP头部"硬件类型hwtype" | 0x00 0x01 |
| ARP头部"协议类型protocol" | 0x08 0x00,表示协议类型为ipv4 |
| ARP头部"硬件长度hwlen" | 0x06,表示MAC地址长度为6个字节 |
| ARP头部"协议长度protolen" | 0x04,表示IP地址长度为4个字节 |
| ARP头部"操作码opcode" | 0x00 0x02,表示ARP应答 |
| ARP头部"发送方MAC地址addr[6]" | 0x00 0x08 0xDC 0x11 0x11 0x02 |
| ARP头部"发送方IP地址sipaddr[2]" | 0xC0 0xA8 0x01 0x11,表示192.160.1.17 |
| ARP头部"接收方MAC地址addr[6]" | 0xB4 0x2E 0x99 0x59 0xEC 0x1E |
| ARP头部"接收方IP地址dipaddr [2]" | 0xC0 0xA8 0x01 0xBE,表示192.160.1.190 |

3、计算机发送的IPV4数据包(第1次握手,采用4次握手):

0x00 0x08 0xDC 0x11 0x11 0x02 0xB4 0x2E 0x99 0x59 0xEC 0x1E 0x08 0x00 0x45 0x00 0x00 0x30 0x86 0x6A 0x40 0x00 0x80 0x06 0xF0 0x3D 0xC0 0xA8 0x01 0xBE 0xC0 0xA8 0x01 0x11 0x0A 0x1F 0x00 0x50 0x4B 0xF8 0x27 0x37 0x00 0x00 0x00 0x00 0x70 0x02 0xFA 0xF0 0x86 0x70 0x00 0x00 0x02 0x04 0x05 0xB4 0x01 0x01 0x04 0x02

|-------------------------------------|------------------------------------------------|
| 以太网首部"目的mac地址addr[6]" | 0x00 0x08 0xDC 0x11 0x11 0x02 |
| 以太网首部"源MAC地址addr[6]" | 0xB4 0x2E 0x99 0x59 0xEC 0x1E |
| 以太网首部"以太网帧的类型type" | 0x08 0x00,表示IPV4数据包类型 |
| IPV4头部的IP版本和头部长度u8_t vhl | 0x45,表示IPV4头部有4*5=20个字节 |
| IPV4头部的服务类型u8_t tos | 0x00 |
| IPV4头部的IP报文总长度u8_t len[2] | 0x00 0x30,表示报文长度有48个字节 它是IP头,TCP头部和用户数据的长度。 |
| IPV4头部的标识u8_t ipid[2] | 0x86 0x6A,表示数据包唯一ID,分片时,所有分片段使用相同ID,表示属于同一包数据。 |
| IPV4头部的标志与片偏移u8_t ipoffset[2] | 0x40 0x00, 禁止对该数据包分片 |
| IPV4头部的生存时间u8_t ttl | 0x80 |
| IPV4头部的TCP协议u8_t proto | 0x06,表示协议是TCP |
| IPV4头部的检验和u16_t ipchksum | 0xF0 0x3D |
| IPV4头部的发送方IP地址u16_t srcipaddr[2] | 0xC0 0xA8 0x01 0xBE 表示192.160.1.190 |
| IPV4头部的接收方IP地址u16_t destipaddr[2] | 0xC0 0xA8 0x01 0x11 表示192.160.1.17 |
| TCP头部的发送方端口u16_t srcport | 0x0A 0x1F,表示发送方端口为2591 |
| TCP头部的接收方端口u16_t destport | 0x00 0x50,表示接收方端口为80 |
| TCP头部的序列号u8_t seqno[4] | 0x4B 0xF8 0x27 0x37 |
| TCP头部的确认号u8_t ackno[4] | 0x00 0x00 0x00 0x00 |
| TCP头部的数据偏移u8_t tcpoffset | 0x70 TCP头部总长度7*4=28字节 |
| TCP头部的标志位u8_t flags | 0x02 SYN=1,用于建立连接并设置"初始序列号" |
| TCP头部的窗口大小u8_t wnd[2] | 0xFA 0xF0 指示计算机接收的缓冲区大小为64240个字节 |
| TCP头部的校验和u16_t tcpchksum | 0x86 0x70 |
| TCP头部的紧急指针u8_t urgp[2] | 0x00 0x00 |
| 计算机发送数据,发现总字节数小于等于60个字节,则填充无用的填充数据 | 0x02 0x04 0x05 0xB4 0x01 0x01 0x04 0x02 |

IPV4头部的标志与片偏移u8_t ipoffset[2]:

1)、标志字段占3位:

标志字段第1位(保留位)始终为0;

标志字段第2位(DF位),DF=1禁止对该数据包分片;DF=0允许分片;

标志字段第3位(MF位),MF=1表示后续还有分片;MF=0表示当前是最后一个分片;

2)、片偏移字段占13位,表示"当前分片"在原始数据包中的起始位置。

计算方式:偏移值 = 起始字节数 / 8。如果偏移值为5,则表示分片在原始数据包中,是从第5*8=40字节开始。

TCP头部的标志位(flags)是一个8位字段,包含6个主要标志位:URG(紧急)、ACK(确认)、PSH(推送)、RST(重置)、SYN(同步)和FIN(结束)

标志位功能

‌URG‌:bit5紧急指针有效,表示数据需立即处理 。 ‌

‌ACK‌:bit4确认应答,用于确认数据已接收 。 ‌

‌PSH‌:bit3推送数据,要求接收方立即传递给应用层 。 ‌

‌RST‌:bit2重置连接,强制断开异常连接 。 ‌

‌SYN‌:bit1同步标志,用于建立连接并设置初始序列号

‌FIN‌:bit0结束标志,表示发送方完成数据传输

4、ENC28J60发送的IPV4数据包:

0xB4 0x2E 0x99 0x59 0xEC 0x1E 0x00 0x08 0xDC 0x11 0x11 0x02 0x08 0x00 0x45 0x00 0x00 0x2C 0x00 0x01 0x00 0x00 0x40 0x06 0xF6 0xAB 0xC0 0xA8 0x01 0x11 0xC0 0xA8 0x01 0xBE 0x00 0x50 0x0A 0x1F 0x00 0x00 0x00 0x00 0x4B 0xF8 0x27 0x38 0x60 0x12 0x05 0xA6 0x90 0xBF 0x00 0x00 0x02 0x04 0x05 0xA6

|-------------------------------------|------------------------------------------------------|
| 以太网首部"目的mac地址addr[6]" | 0xB4 0x2E 0x99 0x59 0xEC 0x1E |
| 以太网首部"源MAC地址addr[6]" | 0x00 0x08 0xDC 0x11 0x11 0x02 |
| 以太网首部"以太网帧的类型type" | 0x08 0x00,表示IPV4数据包类型 |
| IPV4头部的IP版本和头部长度u8_t vhl | 0x45,表示IPV4头部有4*5=20个字节 |
| IPV4头部的服务类型u8_t tos | 0x00 |
| IPV4头部的IP报文总长度u8_t len[2] | 0x00 0x2C,表示报文长度有44个字节 它是IP头,TCP头部和用户数据的长度。 |
| IPV4头部的标识u8_t ipid[2] | 0x00 0x01,表示数据包唯一ID,分片时,所有分片段使用相同ID,表示属于同一包数据。 |
| IPV4头部的标志与片偏移u8_t ipoffset[2] | 0x00 0x00 DF=0允许分片; MF=0表示当前是最后一个分片,也就是没有分片。 |
| IPV4头部的生存时间u8_t ttl | 0x40 |
| IPV4头部的TCP协议u8_t proto | 0x06,表示协议是TCP |
| IPV4头部的检验和u16_t ipchksum | 0xF6 0xAB |
| IPV4头部的发送方IP地址u16_t srcipaddr[2] | 0xC0 0xA8 0x01 0x11 表示192.160.1.17 |
| IPV4头部的接收方IP地址u16_t destipaddr[2] | 0xC0 0xA8 0x01 0xBE 表示192.160.1.190 |
| TCP头部的发送方端口u16_t srcport | 0x00 0x50,表示发送方端口为80 |
| TCP头部的接收方端口u16_t destport | 0x0A 0x1F,表示接收方端口为2591 |
| TCP头部的序列号u8_t seqno[4] | 0x00 0x00 0x00 0x00 是由发送的TCP头部的确认号得到的 |
| TCP头部的确认号u8_t ackno[4] | 0x4B 0xF8 0x27 0x38 是由"0x4B 0xF8 0x27 0x37"加1的到的 |
| TCP头部的数据偏移u8_t tcpoffset | 0x60 TCP头部总长度6*4=24字节 |
| TCP头部的标志位u8_t flags | 0x12 SYN=1,用于建立连接并设置"初始序列号"; ACK‌=1确认应答,用于确认数据已接收 。‌ |
| TCP头部的窗口大小u8_t wnd[2] | 0x05 0xA6 指示ENC28J60的接收缓冲区大小为1446个字节 |
| TCP头部的校验和u16_t tcpchksum | 0x90 0xBF |
| TCP头部的紧急指针u8_t urgp[2] | 0x00 0x00 |
| TCP头部中的数据 | 0x02 0x04 0x05 0xA6 |

5、计算机发送的IPV4数据包(第2次握手,采用4次握手):

0x00 0x08 0xDC 0x11 0x11 0x02 0xB4 0x2E 0x99 0x59 0xEC 0x1E 0x08 0x00 0x45 0x00 0x00 0x30 0x86 0x3l 0x40 0x00 0x80 0x06 0xF0 0x3B 0xC0 0xA8 0x01 0xBE 0xC0 0xA8 0x01 0x11 0x0A 0x1D 0x00 0x50 0xF5 0xA7 0xB7 0x0F 0x00 0x00 0x00 0x00 0x70 0x02 0xFA 0xF0 0x4C 0xEA 0x00 0x00 0x02 0x04 0x05 0xB4 0x01 0x01 0x04 0x02

|-------------------------------------|------------------------------------------------|
| 以太网首部"目的mac地址addr[6]" | 0x00 0x08 0xDC 0x11 0x11 0x02 |
| 以太网首部"源MAC地址addr[6]" | 0xB4 0x2E 0x99 0x59 0xEC 0x1E |
| 以太网首部"以太网帧的类型type" | 0x08 0x00,表示IPV4数据包类型 |
| IPV4头部的IP版本和头部长度u8_t vhl | 0x45,表示IPV4头部有4*5=20个字节 |
| IPV4头部的服务类型u8_t tos | 0x00 |
| IPV4头部的IP报文总长度u8_t len[2] | 0x00 0x30,表示报文长度有48个字节 它是IP头,TCP头部和用户数据的长度。 |
| IPV4头部的标识u8_t ipid[2] | 0x86 0x31,表示数据包唯一ID,分片时,所有分片段使用相同ID,表示属于同一包数据。 |
| IPV4头部的标志与片偏移u8_t ipoffset[2] | 0x40 0x00, 禁止对该数据包分片 |
| IPV4头部的生存时间u8_t ttl | 0x80 |
| IPV4头部的TCP协议u8_t proto | 0x06,表示协议是TCP |
| IPV4头部的检验和u16_t ipchksum | 0xF0 0x3B |
| IPV4头部的发送方IP地址u16_t srcipaddr[2] | 0xC0 0xA8 0x01 0xBE 表示192.160.1.190 |
| IPV4头部的接收方IP地址u16_t destipaddr[2] | 0xC0 0xA8 0x01 0x11 表示192.160.1.17 |
| TCP头部的发送方端口u16_t srcport | 0x0A 0x1D,表示发送方端口为2589 |
| TCP头部的接收方端口u16_t destport | 0x00 0x50,表示接收方端口为80 |
| TCP头部的序列号u8_t seqno[4] | 0xF5 0xA7 0xB7 0x0F |
| TCP头部的确认号u8_t ackno[4] | 0x00 0x00 0x00 0x00 |
| TCP头部的数据偏移u8_t tcpoffset | 0x70 TCP头部总长度7*4=28字节 |
| TCP头部的标志位u8_t flags | 0x02 SYN=1,用于建立连接并设置"初始序列号" |
| TCP头部的窗口大小u8_t wnd[2] | 0xFA 0xF0 指示计算机接收的缓冲区大小为64240个字节 |
| TCP头部的校验和u16_t tcpchksum | 0x4C 0xEA |
| TCP头部的紧急指针u8_t urgp[2] | 0x00 0x00 |
| 计算机发送数据,发现总字节数小于等于60个字节,则填充无用的填充数据 | 0x02 0x04 0x05 0xB4 0x01 0x01 0x04 0x02 |

6、ENC28J60发送的IPV4数据包:

0xB4 0x2E 0x99 0x59 0xEC 0x1E 0x00 0x08 0xDC 0x11 0x11 0x02 0x08 0x00 0x45 0x00 0x00 0x2C 0x00 0x02 0x00 0x00 0x40 0x06 0xF6 0xAA 0xC0 0xA8 0x01 0x11 0xC0 0xA8 0x01 0xBE 0x00 0x50 0x0A 0x1D 0x00 0x00 0x00 0x00 0xF5 0xA7 0xB7 0x10 0x60 0x12 0x05 0xA6 0x57 0x39 0x00 0x00 0x02 0x04 0x05 0xA6

|-------------------------------------|------------------------------------------------------|
| 以太网首部"目的mac地址addr[6]" | 0xB4 0x2E 0x99 0x59 0xEC 0x1E |
| 以太网首部"源MAC地址addr[6]" | 0x00 0x08 0xDC 0x11 0x11 0x02 |
| 以太网首部"以太网帧的类型type" | 0x08 0x00,表示IPV4数据包类型 |
| IPV4头部的IP版本和头部长度u8_t vhl | 0x45,表示IPV4头部有4*5=20个字节 |
| IPV4头部的服务类型u8_t tos | 0x00 |
| IPV4头部的IP报文总长度u8_t len[2] | 0x00 0x2C,表示报文长度有44个字节 它是IP头,TCP头部和用户数据的长度。 |
| IPV4头部的标识u8_t ipid[2] | 0x00 0x02,表示数据包唯一ID,分片时,所有分片段使用相同ID,表示属于同一包数据。 |
| IPV4头部的标志与片偏移u8_t ipoffset[2] | 0x00 0x00 DF=0允许分片; MF=0表示当前是最后一个分片,也就是没有分片。 |
| IPV4头部的生存时间u8_t ttl | 0x40 |
| IPV4头部的TCP协议u8_t proto | 0x06,表示协议是TCP |
| IPV4头部的检验和u16_t ipchksum | 0xF6 0xAA |
| IPV4头部的发送方IP地址u16_t srcipaddr[2] | 0xC0 0xA8 0x01 0x11 表示192.160.1.17 |
| IPV4头部的接收方IP地址u16_t destipaddr[2] | 0xC0 0xA8 0x01 0xBE 表示192.160.1.190 |
| TCP头部的发送方端口u16_t srcport | 0x00 0x50,表示发送方端口为80 |
| TCP头部的接收方端口u16_t destport | 0x0A 0x1D,表示接收方端口为2589 |
| TCP头部的序列号u8_t seqno[4] | 0x00 0x00 0x00 0x00 是由发送的TCP头部的确认号得到的 |
| TCP头部的确认号u8_t ackno[4] | 0xF5 0xA7 0xB7 0x10 是由"0xF5 0xA7 0xB7 0x0F"加1的到的 |
| TCP头部的数据偏移u8_t tcpoffset | 0x60 TCP头部总长度6*4=24字节 |
| TCP头部的标志位u8_t flags | 0x12 SYN=1,用于建立连接并设置"初始序列号"; ACK‌=1确认应答,用于确认数据已接收 。‌ |
| TCP头部的窗口大小u8_t wnd[2] | 0x05 0xA6 指示ENC28J60的接收缓冲区大小为1446个字节 |
| TCP头部的校验和u16_t tcpchksum | 0x57 0x39 |
| TCP头部的紧急指针u8_t urgp[2] | 0x00 0x00 |
| TCP头部中的数据 | 0x02 0x04 0x05 0xA6 |

7、计算机发送的IPV4数据包(第3次握手,采用4次握手):

0x00 0x08 0xDC 0x11 0x11 0x02 0xB4 0x2E 0x99 0x59 0xEC 0x1E 0x08 0x00 0x45 0x00 0x00 0x30 0x86 0x6B 0x40 0x00 0x80 0x06 0xF0 0x3C 0xC0 0xA8 0x01 0xBE 0xC0 0xA8 0x01 0x11 0x0A 0x1C 0x00 0x50 0x69 0x40 0x8A 0x97 0x00 0x00 0x00 0x00 0x70 0x02 0xFA 0xF0 0x05 0xCB 0x00 0x00 0x02 0x04 0x05 0xB4 0x01 0x01 0x04 0x02

|-------------------------------------|------------------------------------------------|
| 以太网首部"目的mac地址addr[6]" | 0x00 0x08 0xDC 0x11 0x11 0x02 |
| 以太网首部"源MAC地址addr[6]" | 0xB4 0x2E 0x99 0x59 0xEC 0x1E |
| 以太网首部"以太网帧的类型type" | 0x08 0x00,表示IPV4数据包类型 |
| IPV4头部的IP版本和头部长度u8_t vhl | 0x45,表示IPV4头部有4*5=20个字节 |
| IPV4头部的服务类型u8_t tos | 0x00 |
| IPV4头部的IP报文总长度u8_t len[2] | 0x00 0x30,表示报文长度有48个字节 它是IP头,TCP头部和用户数据的长度。 |
| IPV4头部的标识u8_t ipid[2] | 0x86 0x6B,表示数据包唯一ID,分片时,所有分片段使用相同ID,表示属于同一包数据。 |
| IPV4头部的标志与片偏移u8_t ipoffset[2] | 0x40 0x00, 禁止对该数据包分片 |
| IPV4头部的生存时间u8_t ttl | 0x80 |
| IPV4头部的TCP协议u8_t proto | 0x06,表示协议是TCP |
| IPV4头部的检验和u16_t ipchksum | 0xF0 0x3C |
| IPV4头部的发送方IP地址u16_t srcipaddr[2] | 0xC0 0xA8 0x01 0xBE 表示192.160.1.190 |
| IPV4头部的接收方IP地址u16_t destipaddr[2] | 0xC0 0xA8 0x01 0x11 表示192.160.1.17 |
| TCP头部的发送方端口u16_t srcport | 0x0A 0x1C,表示发送方端口为2588 |
| TCP头部的接收方端口u16_t destport | 0x00 0x50,表示接收方端口为80 |
| TCP头部的序列号u8_t seqno[4] | 0x69 0x40 0x8A 0x97 |
| TCP头部的确认号u8_t ackno[4] | 0x00 0x00 0x00 0x00 |
| TCP头部的数据偏移u8_t tcpoffset | 0x70 TCP头部总长度7*4=28字节 |
| TCP头部的标志位u8_t flags | 0x02 SYN=1,用于建立连接并设置"初始序列号" |
| TCP头部的窗口大小u8_t wnd[2] | 0xFA 0xF0 指示计算机接收的缓冲区大小为64240个字节 |
| TCP头部的校验和u16_t tcpchksum | 0x05 0xCB |
| TCP头部的紧急指针u8_t urgp[2] | 0x00 0x00 |
| 计算机发送数据,发现总字节数小于等于60个字节,则填充无用的填充数据 | 0x02 0x04 0x05 0xB4 0x01 0x01 0x04 0x02 |

8、ENC28J60发送的IPV4数据包:

0xB4 0x2E 0x99 0x59 0xEC 0x1E 0x00 0x08 0xDC 0x11 0x11 0x02 0x08 0x00 0x45 0x00 0x00 0x2C 0x00 0x03 0x00 0x00 0x40 0x06 0xF6 0xA9 0xC0 0xA8 0x01 0x11 0xC0 0xA8 0x01 0xBE 0x00 0x50 0x0A 0x1C 0x00 0x00 0x00 0x00 0x69 0x40 0x8A 0x98 0x60 0x12 0x05 0xA6 0x10 0x1A 0x00 0x00 0x02 0x04 0x05 0xA6

|-------------------------------------|------------------------------------------------------|
| 以太网首部"目的mac地址addr[6]" | 0xB4 0x2E 0x99 0x59 0xEC 0x1E |
| 以太网首部"源MAC地址addr[6]" | 0x00 0x08 0xDC 0x11 0x11 0x02 |
| 以太网首部"以太网帧的类型type" | 0x08 0x00,表示IPV4数据包类型 |
| IPV4头部的IP版本和头部长度u8_t vhl | 0x45,表示IPV4头部有4*5=20个字节 |
| IPV4头部的服务类型u8_t tos | 0x00 |
| IPV4头部的IP报文总长度u8_t len[2] | 0x00 0x2C,表示报文长度有44个字节 它是IP头,TCP头部和用户数据的长度。 |
| IPV4头部的标识u8_t ipid[2] | 0x00 0x03,表示数据包唯一ID,分片时,所有分片段使用相同ID,表示属于同一包数据。 |
| IPV4头部的标志与片偏移u8_t ipoffset[2] | 0x00 0x00 DF=0允许分片; MF=0表示当前是最后一个分片,也就是没有分片。 |
| IPV4头部的生存时间u8_t ttl | 0x40 |
| IPV4头部的TCP协议u8_t proto | 0x06,表示协议是TCP |
| IPV4头部的检验和u16_t ipchksum | 0xF6 0xA9 |
| IPV4头部的发送方IP地址u16_t srcipaddr[2] | 0xC0 0xA8 0x01 0x11 表示192.160.1.17 |
| IPV4头部的接收方IP地址u16_t destipaddr[2] | 0xC0 0xA8 0x01 0xBE 表示192.160.1.190 |
| TCP头部的发送方端口u16_t srcport | 0x00 0x50,表示发送方端口为80 |
| TCP头部的接收方端口u16_t destport | 0x0A 0x1C,表示接收方端口为2588 |
| TCP头部的序列号u8_t seqno[4] | 0x00 0x00 0x00 0x00 是由发送的TCP头部的确认号得到的 |
| TCP头部的确认号u8_t ackno[4] | 0x69 0x40 0x8A 0x98 是由"0x69 0x40 0x8A 0x97"加1的到的 |
| TCP头部的数据偏移u8_t tcpoffset | 0x60 TCP头部总长度6*4=24字节 |
| TCP头部的标志位u8_t flags | 0x12 SYN=1,用于建立连接并设置"初始序列号"; ACK‌=1确认应答,用于确认数据已接收 。‌ |
| TCP头部的窗口大小u8_t wnd[2] | 0x05 0xA6 指示ENC28J60的接收缓冲区大小为1446个字节 |
| TCP头部的校验和u16_t tcpchksum | 0x10 0x1A |
| TCP头部的紧急指针u8_t urgp[2] | 0x00 0x00 |
| TCP头部中的数据 | 0x02 0x04 0x05 0xA6 |

9、计算机发送的IPV4数据包(第4次握手,采用4次握手):

0x00 0x08 0xDC 0x11 0x11 0x02 0xB4 0x2E 0x99 0x59 0xEC 0x1E 0x08 0x00 0x45 0x00 0x00 0x30 0x86 0x6D 0x40 0x00 0x80 0x06 0xF0 0x3A 0xC0 0xA8 0x01 0xBE 0xC0 0xA8 0x01 0x11 0x0A 0x1F 0x00 0x50 0x4B 0xF8 0x27 0x37 0x00 0x00 0x00 0x00 0x70 0x02 0xFA 0xF0 0x86 0x70 0x00 0x00 0x02 0x04 0x05 0xB4 0x01 0x01 0x04 0x02

|-------------------------------------|------------------------------------------------|
| 以太网首部"目的mac地址addr[6]" | 0x00 0x08 0xDC 0x11 0x11 0x02 |
| 以太网首部"源MAC地址addr[6]" | 0xB4 0x2E 0x99 0x59 0xEC 0x1E |
| 以太网首部"以太网帧的类型type" | 0x08 0x00,表示IPV4数据包类型 |
| IPV4头部的IP版本和头部长度u8_t vhl | 0x45,表示IPV4头部有4*5=20个字节 |
| IPV4头部的服务类型u8_t tos | 0x00 |
| IPV4头部的IP报文总长度u8_t len[2] | 0x00 0x30,表示报文长度有48个字节 它是IP头,TCP头部和用户数据的长度。 |
| IPV4头部的标识u8_t ipid[2] | 0x86 0x6D,表示数据包唯一ID,分片时,所有分片段使用相同ID,表示属于同一包数据。 |
| IPV4头部的标志与片偏移u8_t ipoffset[2] | 0x40 0x00, 禁止对该数据包分片 |
| IPV4头部的生存时间u8_t ttl | 0x80 |
| IPV4头部的TCP协议u8_t proto | 0x06,表示协议是TCP |
| IPV4头部的检验和u16_t ipchksum | 0xF0 0x3A |
| IPV4头部的发送方IP地址u16_t srcipaddr[2] | 0xC0 0xA8 0x01 0xBE 表示192.160.1.190 |
| IPV4头部的接收方IP地址u16_t destipaddr[2] | 0xC0 0xA8 0x01 0x11 表示192.160.1.17 |
| TCP头部的发送方端口u16_t srcport | 0x0A 0x1F,表示发送方端口为2591 |
| TCP头部的接收方端口u16_t destport | 0x00 0x50,表示接收方端口为80 |
| TCP头部的序列号u8_t seqno[4] | 0x4B 0xF8 0x27 0x37 |
| TCP头部的确认号u8_t ackno[4] | 0x00 0x00 0x00 0x00 |
| TCP头部的数据偏移u8_t tcpoffset | 0x70 TCP头部总长度7*4=28字节 |
| TCP头部的标志位u8_t flags | 0x02 SYN=1,用于建立连接并设置"初始序列号" |
| TCP头部的窗口大小u8_t wnd[2] | 0xFA 0xF0 指示计算机接收的缓冲区大小为64240个字节 |
| TCP头部的校验和u16_t tcpchksum | 0x86 0x70 |
| TCP头部的紧急指针u8_t urgp[2] | 0x00 0x00 |
| 计算机发送数据,发现总字节数小于等于60个字节,则填充无用的填充数据 | 0x02 0x04 0x05 0xB4 0x01 0x01 0x04 0x02 |

10、ENC28J60发送的IPV4数据包:

0xB4 0x2E 0x99 0x59 0xEC 0x1E 0x00 0x08 0xDC 0x11 0x11 0x02 0x08 0x00 0x45 0x00 0x00 0x28 0x00 0x04 0x00 0x00 0x40 0x06 0xF6 0xAC 0xC0 0xA8 0x01 0x11 0xC0 0xA8 0x01 0xBE 0x00 0x50 0x0A 0x1F 0x00 0x00 0x00 0x00 0x4B 0xF8 0x27 0x38 0x50 0x10 0x05 0xA6 0xA8 0x6F 0x00 0x00

|-------------------------------------|--------------------------------------------------|
| 以太网首部"目的mac地址addr[6]" | 0xB4 0x2E 0x99 0x59 0xEC 0x1E |
| 以太网首部"源MAC地址addr[6]" | 0x00 0x08 0xDC 0x11 0x11 0x02 |
| 以太网首部"以太网帧的类型type" | 0x08 0x00,表示IPV4数据包类型 |
| IPV4头部的IP版本和头部长度u8_t vhl | 0x45,表示IPV4头部有4*5=20个字节 |
| IPV4头部的服务类型u8_t tos | 0x00 |
| IPV4头部的IP报文总长度u8_t len[2] | 0x00 0x28,表示报文长度有40个字节 它是IP头,TCP头部和用户数据的长度。 |
| IPV4头部的标识u8_t ipid[2] | 0x00 0x04,表示数据包唯一ID,分片时,所有分片段使用相同ID,表示属于同一包数据。 |
| IPV4头部的标志与片偏移u8_t ipoffset[2] | 0x00 0x00 DF=0允许分片; MF=0表示当前是最后一个分片,也就是没有分片。 |
| IPV4头部的生存时间u8_t ttl | 0x40 |
| IPV4头部的TCP协议u8_t proto | 0x06,表示协议是TCP |
| IPV4头部的检验和u16_t ipchksum | 0xF6 0xAC |
| IPV4头部的发送方IP地址u16_t srcipaddr[2] | 0xC0 0xA8 0x01 0x11 表示192.160.1.17 |
| IPV4头部的接收方IP地址u16_t destipaddr[2] | 0xC0 0xA8 0x01 0xBE 表示192.160.1.190 |
| TCP头部的发送方端口u16_t srcport | 0x00 0x50,表示发送方端口为80 |
| TCP头部的接收方端口u16_t destport | 0x0A 0x1F,表示接收方端口为2591 |
| TCP头部的序列号u8_t seqno[4] | 0x00 0x00 0x00 0x00 是由发送的TCP头部的确认号得到的 |
| TCP头部的确认号u8_t ackno[4] | 0x4B 0xF8 0x27 0x38 是由"0x4B 0xF8 0x27 0x37"加1的到的 |
| TCP头部的数据偏移u8_t tcpoffset | 0x50 TCP头部总长度5*4=20字节 |
| TCP头部的标志位u8_t flags | 0x10 ACK‌=1确认应答,用于确认数据已接收 。‌ |
| TCP头部的窗口大小u8_t wnd[2] | 0x05 0xA6 指示ENC28J60的接收缓冲区大小为1446个字节 |
| TCP头部的校验和u16_t tcpchksum | 0xA8 0x6F |
| TCP头部的紧急指针u8_t urgp[2] | 0x00 0x00 |
| TCP头部中的数据 | 无 |

11、计算机发送的IPV4数据包:

0x00 0x08 0xDC 0x11 0x11 0x02 0xB4 0x2E 0x99 0x59 0xEC 0x1E 0x08 0x00 0x45 0x00 0x00 0x28 0x86 0x6E 0x40 0x00 0x80 0x06 0xF0 0x41 0xC0 0xA8 0x01 0xBE 0xC0 0xA8 0x01 0x11 0x0A 0x1F 0x00 0x50 0x4B 0xF8 0x27 0x38 0x00 0x00 0x00 0x01 0x50 0x10 0xFA 0xF0 0xB3 0x23 0x00 0x00

计算机发送数据,发现总字节数小于等于60个字节,则填充无用的填充数据0x00 0x00 0x00 0x00 0x00 0x00

|-------------------------------------|------------------------------------------------|
| 以太网首部"目的mac地址addr[6]" | 0x00 0x08 0xDC 0x11 0x11 0x02 |
| 以太网首部"源MAC地址addr[6]" | 0xB4 0x2E 0x99 0x59 0xEC 0x1E |
| 以太网首部"以太网帧的类型type" | 0x08 0x00,表示IPV4数据包类型 |
| IPV4头部的IP版本和头部长度u8_t vhl | 0x45,表示IPV4头部有4*5=20个字节 |
| IPV4头部的服务类型u8_t tos | 0x00 |
| IPV4头部的IP报文总长度u8_t len[2] | 0x00 0x28,表示报文长度有40个字节 它是IP头,TCP头部和用户数据的长度。 |
| IPV4头部的标识u8_t ipid[2] | 0x86 0x6E,表示数据包唯一ID,分片时,所有分片段使用相同ID,表示属于同一包数据。 |
| IPV4头部的标志与片偏移u8_t ipoffset[2] | 0x40 0x00, 禁止对该数据包分片 |
| IPV4头部的生存时间u8_t ttl | 0x80 |
| IPV4头部的TCP协议u8_t proto | 0x06,表示协议是TCP |
| IPV4头部的检验和u16_t ipchksum | 0xF0 0x41 |
| IPV4头部的发送方IP地址u16_t srcipaddr[2] | 0xC0 0xA8 0x01 0xBE 表示192.160.1.190 |
| IPV4头部的接收方IP地址u16_t destipaddr[2] | 0xC0 0xA8 0x01 0x11 表示192.160.1.17 |
| TCP头部的发送方端口u16_t srcport | 0x0A 0x1F,表示发送方端口为2591 |
| TCP头部的接收方端口u16_t destport | 0x00 0x50,表示接收方端口为80 |
| TCP头部的序列号u8_t seqno[4] | 0x4B 0xF8 0x27 0x38 |
| TCP头部的确认号u8_t ackno[4] | 0x00 0x00 0x00 0x01 |
| TCP头部的数据偏移u8_t tcpoffset | 0x50 TCP头部总长度5*4=20字节 |
| TCP头部的标志位u8_t flags | 0x10 ACK‌=1确认应答,用于确认数据已接收 。 |
| TCP头部的窗口大小u8_t wnd[2] | 0xFA 0xF0 指示计算机接收的缓冲区大小为64240个字节 |
| TCP头部的校验和u16_t tcpchksum | 0xB3 0x23 |
| TCP头部的紧急指针u8_t urgp[2] | 0x00 0x00 |
| 计算机发送数据,发现总字节数小于等于60个字节,则填充无用的填充数据 | 0x00 0x00 0x00 0x00 0x00 0x00 |

12、计算机发送的IPV4数据包:

0x00 0x08 0xDC 0x11 0x11 0x02 0xB4 0x2E 0x99 0x59 0xEC 0x1E 0x08 0x00 0x45 0x00 0x01 0xD2 0x86 0x6F 0x40 0x00 0x80 0x06 0xEE 0x96 0xC0 0xA8 0x01 0xBE 0xC0 0xA8 0x01 0x11 0x0A 0x1F 0x00 0x50 0x4B 0xF8 0x27 0x38 0x00 0x00 0x00 0x01 0x50 0x18 0xFA 0xF0 0xE2 0xB5 0x00 0x00

GET / HTTP/1.1含\r\n,合计16个字节

Host: 192.168.1.17含\r\n,合计20个字节

Connection: keep-alive含\r\n,合计24个字节

Upgrade-Insecure-Requests: 1含\r\n,合计30个字节

User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36含\r\n,合计124个字节

Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9含\r\n,合计145个字节

Accept-Encoding: gzip, deflate含\r\n,合计32个字节

Accept-Language: zh-CN,zh;q=0.9含\r\n\r\n,合计35个字节

得到TCP头部中的数据为426个字节,报文长度为426+40=466个字节

|-------------------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| 以太网首部"目的mac地址addr[6]" | 0x00 0x08 0xDC 0x11 0x11 0x02 |
| 以太网首部"源MAC地址addr[6]" | 0xB4 0x2E 0x99 0x59 0xEC 0x1E |
| 以太网首部"以太网帧的类型type" | 0x08 0x00,表示IPV4数据包类型 |
| IPV4头部的IP版本和头部长度u8_t vhl | 0x45,表示IPV4头部有4*5=20个字节 |
| IPV4头部的服务类型u8_t tos | 0x00 |
| IPV4头部的IP报文总长度u8_t len[2] | 0x01 0xD2,表示报文长度有466个字节 它是IP头,TCP头部和用户数据的长度。 |
| IPV4头部的标识u8_t ipid[2] | 0x86 0x6F,表示数据包唯一ID,分片时,所有分片段使用相同ID,表示属于同一包数据。 |
| IPV4头部的标志与片偏移u8_t ipoffset[2] | 0x40 0x00, 禁止对该数据包分片 |
| IPV4头部的生存时间u8_t ttl | 0x80 |
| IPV4头部的TCP协议u8_t proto | 0x06,表示协议是TCP |
| IPV4头部的检验和u16_t ipchksum | 0xEE 0x96 |
| IPV4头部的发送方IP地址u16_t srcipaddr[2] | 0xC0 0xA8 0x01 0xBE 表示192.160.1.190 |
| IPV4头部的接收方IP地址u16_t destipaddr[2] | 0xC0 0xA8 0x01 0x11 表示192.160.1.17 |
| TCP头部的发送方端口u16_t srcport | 0x0A 0x1F,表示发送方端口为2591 |
| TCP头部的接收方端口u16_t destport | 0x00 0x50,表示接收方端口为80 |
| TCP头部的序列号u8_t seqno[4] | 0x4B 0xF8 0x27 0x38 |
| TCP头部的确认号u8_t ackno[4] | 0x00 0x00 0x00 0x01 |
| TCP头部的数据偏移u8_t tcpoffset | 0x50 TCP头部总长度5*4=20字节 |
| TCP头部的标志位u8_t flags | 0x18 ACK‌=1确认应答,用于确认数据已接收 。 PSH‌=1推送数据,要求接收方立即传递给应用层‌ |
| TCP头部的窗口大小u8_t wnd[2] | 0xFA 0xF0 指示计算机接收的缓冲区大小为64240个字节 |
| TCP头部的校验和u16_t tcpchksum | 0xE2 0xB5 |
| TCP头部的紧急指针u8_t urgp[2] | 0x00 0x00 |
| TCP头部中的数据426个字节 | GET / HTTP/1.1\r\n Host: 192.168.1.17\r\n Connection: keep-alive \r\n Upgrade-Insecure-Requests: 1\r\n User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 0x20 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36\r\n Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9\r\n Accept-Encoding: gzip, deflate\r\n Accept-Language: zh-CN,zh;q=0.9\r\n\r\n |

13、ENC28J60发送的IPV4数据包:

0xB4 0x2E 0x99 0x59 0xEC 0x1E 0x00 0x08 0xDC 0x11 0x11 0x02 0x08 0x00 0x45 0x00 0x00 0x7B 0x00 0x05 0x00 0x00 0x40 0x06 0xF6 0x58 0xC0 0xA8 0x01 0x11 0xC0 0xA8 0x01 0xBE 0x00 0x50 0x0A 0x1F 0x00 0x00 0x00 0x01 0x4B 0xF8 0x28 0xE2 0x50 0x18 0x05 0xA6 0x89 0xF1 0x00 0x00

HTTP/1.0 200 OK含\r\n,合计17个字节

Server: uIP/1.0 http://www.sics.se/~adam/uip/含\r\n,合计47个字节

Connection: close含\r\n,合计19个字节

得到TCP头部中的数据为17+47+19=83个字节,报文长度为83+40=123个字节

|-------------------------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| 以太网首部"目的mac地址addr[6]" | 0xB4 0x2E 0x99 0x59 0xEC 0x1E |
| 以太网首部"源MAC地址addr[6]" | 0x00 0x08 0xDC 0x11 0x11 0x02 |
| 以太网首部"以太网帧的类型type" | 0x08 0x00,表示IPV4数据包类型 |
| IPV4头部的IP版本和头部长度u8_t vhl | 0x45,表示IPV4头部有4*5=20个字节 |
| IPV4头部的服务类型u8_t tos | 0x00 |
| IPV4头部的IP报文总长度u8_t len[2] | 0x00 0x7B,表示报文长度有123个字节 它是IP头,TCP头部和用户数据的长度。 |
| IPV4头部的标识u8_t ipid[2] | 0x00 0x05,表示数据包唯一ID,分片时,所有分片段使用相同ID,表示属于同一包数据。 |
| IPV4头部的标志与片偏移u8_t ipoffset[2] | 0x00 0x00, 禁止对该数据包分片 |
| IPV4头部的生存时间u8_t ttl | 0x40 |
| IPV4头部的TCP协议u8_t proto | 0x06,表示协议是TCP |
| IPV4头部的检验和u16_t ipchksum | 0xF6 0x58 |
| IPV4头部的发送方IP地址u16_t srcipaddr[2] | 0xC0 0xA8 0x01 0x11 表示192.160.1.17 |
| IPV4头部的接收方IP地址u16_t destipaddr[2] | 0xC0 0xA8 0x01 0xBE 表示192.160.1.190 |
| TCP头部的发送方端口u16_t srcport | 0x00 0x50,表示发送方端口为80 |
| TCP头部的接收方端口u16_t destport | 0x0A 0x1F,表示接收方端口为2591 |
| TCP头部的序列号u8_t seqno[4] | 0x00 0x00 0x00 0x01 是由发送的TCP头部的确认号得到的 |
| TCP头部的确认号u8_t ackno[4] | 0x4B 0xF8 0x28 0xE2 是由"0x4B 0xF8 0x27 0x38"加426个字节的到的 |
| TCP头部的数据偏移u8_t tcpoffset | 0x50 TCP头部总长度5*4=20字节 |
| TCP头部的标志位u8_t flags | 0x18 ACK‌=1确认应答,用于确认数据已接收 。 PSH‌=1推送数据,要求接收方立即传递给应用层‌ |
| TCP头部的窗口大小u8_t wnd[2] | 0x05 0xA6 指示ENC28J60的接收缓冲区大小为1446个字节 |
| TCP头部的校验和u16_t tcpchksum | 0x89 0xF1 |
| TCP头部的紧急指针u8_t urgp[2] | 0x00 0x00 |
| TCP头部中的数据 | HTTP/1.0 0x20 200 0x20 OK\r\n Server: uIP/1.0 http://www.sics.se/~adam/uip/\r\n Connection: close\r\n |

14、计算机发送的IPV4数据包:

0x00 0x08 0xDC 0x11 0x11 0x02 0xB4 0x2E 0x99 0x59 0xEC 0x1E 0x08 0x00 0x45 0x00 0x00 0x28 0x86 0x70 0x40 0x00 0x80 0x06 0xF0 0x3F 0xC0 0xA8 0x01 0xBE 0xC0 0xA8 0x01 0x11 0x0A 0x1D 0x00 0x50 0xF5 0xA7 0xB7 0x10 0x00 0x00 0x00 0x01 0x50 0x10 0xFA 0xF0 0x79 0x9D

计算机发送数据,发现总字节数小于等于60个字节,则填充无用的填充数据0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00

|-------------------------------------|------------------------------------------------|
| 以太网首部"目的mac地址addr[6]" | 0x00 0x08 0xDC 0x11 0x11 0x02 |
| 以太网首部"源MAC地址addr[6]" | 0xB4 0x2E 0x99 0x59 0xEC 0x1E |
| 以太网首部"以太网帧的类型type" | 0x08 0x00,表示IPV4数据包类型 |
| IPV4头部的IP版本和头部长度u8_t vhl | 0x45,表示IPV4头部有4*5=20个字节 |
| IPV4头部的服务类型u8_t tos | 0x00 |
| IPV4头部的IP报文总长度u8_t len[2] | 0x00 0x28,表示报文长度有40个字节 它是IP头,TCP头部和用户数据的长度。 |
| IPV4头部的标识u8_t ipid[2] | 0x86 0x70,表示数据包唯一ID,分片时,所有分片段使用相同ID,表示属于同一包数据。 |
| IPV4头部的标志与片偏移u8_t ipoffset[2] | 0x40 0x00, 禁止对该数据包分片 |
| IPV4头部的生存时间u8_t ttl | 0x80 |
| IPV4头部的TCP协议u8_t proto | 0x06,表示协议是TCP |
| IPV4头部的检验和u16_t ipchksum | 0xF0 0x3F |
| IPV4头部的发送方IP地址u16_t srcipaddr[2] | 0xC0 0xA8 0x01 0xBE 表示192.160.1.190 |
| IPV4头部的接收方IP地址u16_t destipaddr[2] | 0xC0 0xA8 0x01 0x11 表示192.160.1.17 |
| TCP头部的发送方端口u16_t srcport | 0x0A 0x1D,表示发送方端口为2589 |
| TCP头部的接收方端口u16_t destport | 0x00 0x50,表示接收方端口为80 |
| TCP头部的序列号u8_t seqno[4] | 0xF5 0xA7 0xB7 0x10 |
| TCP头部的确认号u8_t ackno[4] | 0x00 0x00 0x00 0x01 |
| TCP头部的数据偏移u8_t tcpoffset | 0x50 TCP头部总长度5*4=20字节 |
| TCP头部的标志位u8_t flags | 0x10 ACK‌=1确认应答,用于确认数据已接收 。 |
| TCP头部的窗口大小u8_t wnd[2] | 0xFA 0xF0 指示计算机接收的缓冲区大小为64240个字节 |
| TCP头部的校验和u16_t tcpchksum | 0x79 0x9D |
| TCP头部的紧急指针u8_t urgp[2] | 0x00 0x00 |
| 计算机发送数据,发现总字节数小于等于60个字节,则填充无用的填充数据 | 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 |

15、计算机发送的IPV4数据包:

0x00 0x08 0xDC 0x11 0x11 0x02 0xB4 0x2E 0x99 0x59 0xEC 0x1E 0x08 0x00 0x45 0x00 0x00 0x28 0x86 0x71 0x40 0x00 0x80 0x06 0xF0 0x3E 0xC0 0xA8 0x01 0xBE 0xC0 0xA8 0x01 0x11 0x0A 0x1C 0x00 0x50 0x69 0x40 0x8A 0x98 0x00 0x00 0x00 0x01 0x50 0x10 0xFA 0xF0 0x32 0x7E 0x00 0x00

计算机发送数据,发现总字节数小于等于60个字节,则填充无用的填充数据0x00 0x00 0x00 0x00 0x00 0x00

|-------------------------------------|------------------------------------------------|
| 以太网首部"目的mac地址addr[6]" | 0x00 0x08 0xDC 0x11 0x11 0x02 |
| 以太网首部"源MAC地址addr[6]" | 0xB4 0x2E 0x99 0x59 0xEC 0x1E |
| 以太网首部"以太网帧的类型type" | 0x08 0x00,表示IPV4数据包类型 |
| IPV4头部的IP版本和头部长度u8_t vhl | 0x45,表示IPV4头部有4*5=20个字节 |
| IPV4头部的服务类型u8_t tos | 0x00 |
| IPV4头部的IP报文总长度u8_t len[2] | 0x00 0x28,表示报文长度有40个字节 它是IP头,TCP头部和用户数据的长度。 |
| IPV4头部的标识u8_t ipid[2] | 0x86 0x71,表示数据包唯一ID,分片时,所有分片段使用相同ID,表示属于同一包数据。 |
| IPV4头部的标志与片偏移u8_t ipoffset[2] | 0x40 0x00, 禁止对该数据包分片 |
| IPV4头部的生存时间u8_t ttl | 0x80 |
| IPV4头部的TCP协议u8_t proto | 0x06,表示协议是TCP |
| IPV4头部的检验和u16_t ipchksum | 0xF0 0x3E |
| IPV4头部的发送方IP地址u16_t srcipaddr[2] | 0xC0 0xA8 0x01 0xBE 表示192.160.1.190 |
| IPV4头部的接收方IP地址u16_t destipaddr[2] | 0xC0 0xA8 0x01 0x11 表示192.160.1.17 |
| TCP头部的发送方端口u16_t srcport | 0x0A 0x1C,表示发送方端口为2588 |
| TCP头部的接收方端口u16_t destport | 0x00 0x50,表示接收方端口为80 |
| TCP头部的序列号u8_t seqno[4] | 0x69 0x40 0x8A 0x98 |
| TCP头部的确认号u8_t ackno[4] | 0x00 0x00 0x00 0x01 |
| TCP头部的数据偏移u8_t tcpoffset | 0x50 TCP头部总长度5*4=20字节 |
| TCP头部的标志位u8_t flags | 0x10 ACK‌=1确认应答,用于确认数据已接收 。 |
| TCP头部的窗口大小u8_t wnd[2] | 0xFA 0xF0 指示计算机接收的缓冲区大小为64240个字节 |
| TCP头部的校验和u16_t tcpchksum | 0x32 0x7E |
| TCP头部的紧急指针u8_t urgp[2] | 0x00 0x00 |
| 计算机发送数据,发现总字节数小于等于60个字节,则填充无用的填充数据 | 0x00 0x00 0x00 0x00 0x00 0x00 |

16、计算机发送的IPV4数据包:

0x00 0x08 0xDC 0x11 0x11 0x02 0xB4 0x2E 0x99 0x59 0xEC 0x1E 0x08 0x00 0x45 0x00 0x00 0x28 0x86 0x72 0x40 0x00 0x80 0x06 0xF0 0x3D 0xC0 0xA8 0x01 0xBE 0xC0 0xA8 0x01 0x11 0x0A 0x1F 0x00 0x50 0x4B 0xF8 0x28 0xE2 0x00 0x00 0x00 0x01 0x50 0x10 0xFA 0xF0 0xB1 0x79 0x00 0x00

计算机发送数据,发现总字节数小于等于60个字节,则填充无用的填充数据0x00 0x00 0x00 0x00 0x00 0x00

|-------------------------------------|------------------------------------------------|
| 以太网首部"目的mac地址addr[6]" | 0x00 0x08 0xDC 0x11 0x11 0x02 |
| 以太网首部"源MAC地址addr[6]" | 0xB4 0x2E 0x99 0x59 0xEC 0x1E |
| 以太网首部"以太网帧的类型type" | 0x08 0x00,表示IPV4数据包类型 |
| IPV4头部的IP版本和头部长度u8_t vhl | 0x45,表示IPV4头部有4*5=20个字节 |
| IPV4头部的服务类型u8_t tos | 0x00 |
| IPV4头部的IP报文总长度u8_t len[2] | 0x00 0x28,表示报文长度有40个字节 它是IP头,TCP头部和用户数据的长度。 |
| IPV4头部的标识u8_t ipid[2] | 0x86 0x72,表示数据包唯一ID,分片时,所有分片段使用相同ID,表示属于同一包数据。 |
| IPV4头部的标志与片偏移u8_t ipoffset[2] | 0x40 0x00, 禁止对该数据包分片 |
| IPV4头部的生存时间u8_t ttl | 0x80 |
| IPV4头部的TCP协议u8_t proto | 0x06,表示协议是TCP |
| IPV4头部的检验和u16_t ipchksum | 0xF0 0x3D |
| IPV4头部的发送方IP地址u16_t srcipaddr[2] | 0xC0 0xA8 0x01 0xBE 表示192.160.1.190 |
| IPV4头部的接收方IP地址u16_t destipaddr[2] | 0xC0 0xA8 0x01 0x11 表示192.160.1.17 |
| TCP头部的发送方端口u16_t srcport | 0x0A 0x1F,表示发送方端口为2591 |
| TCP头部的接收方端口u16_t destport | 0x00 0x50,表示接收方端口为80 |
| TCP头部的序列号u8_t seqno[4] | 0x4B 0xF8 0x28 0xE2 |
| TCP头部的确认号u8_t ackno[4] | 0x00 0x00 0x00 0x01 |
| TCP头部的数据偏移u8_t tcpoffset | 0x50 TCP头部总长度5*4=20字节 |
| TCP头部的标志位u8_t flags | 0x10 ACK‌=1确认应答,用于确认数据已接收 。 |
| TCP头部的窗口大小u8_t wnd[2] | 0xFA 0xF0 指示计算机接收的缓冲区大小为64240个字节 |
| TCP头部的校验和u16_t tcpchksum | 0xB1 0x79 |
| TCP头部的紧急指针u8_t urgp[2] | 0x00 0x00 |
| 计算机发送数据,发现总字节数小于等于60个字节,则填充无用的填充数据 | 0x00 0x00 0x00 0x00 0x00 0x00 |

17、计算机发送的IPV4数据包:

0x00 0x08 0xDC 0x11 0x11 0x02 0xB4 0x2E 0x99 0x59 0xEC 0x1E 0x08 0x00 0x45 0x00 0x01 0xD2 0x86 0x73 0x40 0x00 0x80 0x06 0xEE 0x92 0xC0 0xA8 0x01 0xBE 0xC0 0xA8 0x01 0x11 0x0A 0x1F 0x00 0x50 0x4B 0xF8 0x27 0x38 0x00 0x00 0x00 0x01 0x50 0x18 0xFA 0xF0 0xE2 0xB5 0x00 0x00

GET / HTTP/1.1含\r\n,合计16个字节

Host: 192.168.1.17含\r\n,合计20个字节

Connection: keep-alive含\r\n,合计24个字节

Upgrade-Insecure-Requests: 1含\r\n,合计30个字节

User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36含\r\n,合计124个字节

Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9含\r\n,合计145个字节

Accept-Encoding: gzip, deflate含\r\n,合计32个字节

Accept-Language: zh-CN,zh;q=0.9含\r\n\r\n,合计35个字节

得到TCP头部中的数据为426个字节,报文长度为426+40=466个字节

|-------------------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| 以太网首部"目的mac地址addr[6]" | 0x00 0x08 0xDC 0x11 0x11 0x02 |
| 以太网首部"源MAC地址addr[6]" | 0xB4 0x2E 0x99 0x59 0xEC 0x1E |
| 以太网首部"以太网帧的类型type" | 0x08 0x00,表示IPV4数据包类型 |
| IPV4头部的IP版本和头部长度u8_t vhl | 0x45,表示IPV4头部有4*5=20个字节 |
| IPV4头部的服务类型u8_t tos | 0x00 |
| IPV4头部的IP报文总长度u8_t len[2] | 0x01 0xD2,表示报文长度有466个字节 它是IP头,TCP头部和用户数据的长度。 |
| IPV4头部的标识u8_t ipid[2] | 0x86 0x73,表示数据包唯一ID,分片时,所有分片段使用相同ID,表示属于同一包数据。 |
| IPV4头部的标志与片偏移u8_t ipoffset[2] | 0x40 0x00, 禁止对该数据包分片 |
| IPV4头部的生存时间u8_t ttl | 0x80 |
| IPV4头部的TCP协议u8_t proto | 0x06,表示协议是TCP |
| IPV4头部的检验和u16_t ipchksum | 0xEE 0x92 |
| IPV4头部的发送方IP地址u16_t srcipaddr[2] | 0xC0 0xA8 0x01 0xBE 表示192.160.1.190 |
| IPV4头部的接收方IP地址u16_t destipaddr[2] | 0xC0 0xA8 0x01 0x11 表示192.160.1.17 |
| TCP头部的发送方端口u16_t srcport | 0x0A 0x1F,表示发送方端口为2591 |
| TCP头部的接收方端口u16_t destport | 0x00 0x50,表示接收方端口为80 |
| TCP头部的序列号u8_t seqno[4] | 0x4B 0xF8 0x27 0x38 |
| TCP头部的确认号u8_t ackno[4] | 0x00 0x00 0x00 0x01 |
| TCP头部的数据偏移u8_t tcpoffset | 0x50 TCP头部总长度5*4=20字节 |
| TCP头部的标志位u8_t flags | 0x18 ACK‌=1确认应答,用于确认数据已接收 。 PSH‌=1推送数据,要求接收方立即传递给应用层‌ |
| TCP头部的窗口大小u8_t wnd[2] | 0xFA 0xF0 指示计算机接收的缓冲区大小为64240个字节 |
| TCP头部的校验和u16_t tcpchksum | 0xE2 0xB5 |
| TCP头部的紧急指针u8_t urgp[2] | 0x00 0x00 |
| TCP头部中的数据 | GET / HTTP/1.1 Host: 192.168.1.17 Connection: keep-alive Upgrade-Insecure-Requests: 1 User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9 Accept-Encoding: gzip, deflate Accept-Language: zh-CN,zh;q=0.9 |

18、ENC28J60发送的IPV4数据包:

0xB4 0x2E 0x99 0x59 0xEC 0x1E 0x00 0x08 0xDC 0x11 0x11 0x02 0x08 0x00 0x45 0x00 0x00 0x28 0x00 0x06 0x00 0x00 0x40 0x06 0xF6 0xAA 0xC0 0xA8 0x01 0x11 0xC0 0xA8 0x01 0xBE 0x00 0x50 0x0A 0x1F 0x00 0x00 0x00 0x01 0x4B 0xF8 0x28 0xE2 0x50 0x10 0x05 0xA6 0xA6 0xC4 0x00 0x00

|-------------------------------------|-------------------------------------------------------|
| 以太网首部"目的mac地址addr[6]" | 0xB4 0x2E 0x99 0x59 0xEC 0x1E |
| 以太网首部"源MAC地址addr[6]" | 0x00 0x08 0xDC 0x11 0x11 0x02 |
| 以太网首部"以太网帧的类型type" | 0x08 0x00,表示IPV4数据包类型 |
| IPV4头部的IP版本和头部长度u8_t vhl | 0x45,表示IPV4头部有4*5=20个字节 |
| IPV4头部的服务类型u8_t tos | 0x00 |
| IPV4头部的IP报文总长度u8_t len[2] | 0x00 0x28,表示报文长度有40个字节 它是IP头,TCP头部和用户数据的长度。 |
| IPV4头部的标识u8_t ipid[2] | 0x00 0x06,表示数据包唯一ID,分片时,所有分片段使用相同ID,表示属于同一包数据。 |
| IPV4头部的标志与片偏移u8_t ipoffset[2] | 0x00 0x00, 禁止对该数据包分片 |
| IPV4头部的生存时间u8_t ttl | 0x40 |
| IPV4头部的TCP协议u8_t proto | 0x06,表示协议是TCP |
| IPV4头部的检验和u16_t ipchksum | 0xF6 0xAA |
| IPV4头部的发送方IP地址u16_t srcipaddr[2] | 0xC0 0xA8 0x01 0x11 表示192.160.1.17 |
| IPV4头部的接收方IP地址u16_t destipaddr[2] | 0xC0 0xA8 0x01 0xBE 表示192.160.1.190 |
| TCP头部的发送方端口u16_t srcport | 0x00 0x50,表示发送方端口为80 |
| TCP头部的接收方端口u16_t destport | 0x0A 0x1F,表示接收方端口为2591 |
| TCP头部的序列号u8_t seqno[4] | 0x00 0x00 0x00 0x01 是由发送的TCP头部的确认号得到的 |
| TCP头部的确认号u8_t ackno[4] | 0x4B 0xF8 0x28 0xE2 是由"0x4B 0xF8 0x27 0x38"加426个字节的到的 |
| TCP头部的数据偏移u8_t tcpoffset | 0x50 TCP头部总长度5*4=20字节 |
| TCP头部的标志位u8_t flags | 0x10 ACK‌=1确认应答,用于确认数据已接收 。 |
| TCP头部的窗口大小u8_t wnd[2] | 0x05 0xA6 指示ENC28J60的接收缓冲区大小为1446个字节 |
| TCP头部的校验和u16_t tcpchksum | 0xA6 0xC4 |
| TCP头部的紧急指针u8_t urgp[2] | 0x00 0x00 |
| TCP头部中的数据 | 无 |

19、计算机发送的IPV4数据包:

0x00 0x08 0xDC 0x11 0x11 0x02 0xB4 0x2E 0x99 0x59 0xEC 0x1E 0x08 0x00 0x45 0x00 0x00 0x28 0x86 0x74 0x40 0x00 0x80 0x06 0xF0 0x3B 0xC0 0xA8 0x01 0xBE 0xC0 0xA8 0x01 0x11 0x0A 0x1F 0x00 0x50 0x4B 0xF8 0x28 0xE2 0x00 0x00 0x00 0x54 0x50 0x10 0xFA 0x9D 0xB1 0x79 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00

|-------------------------------------|------------------------------------------------|
| 以太网首部"目的mac地址addr[6]" | 0x00 0x08 0xDC 0x11 0x11 0x02 |
| 以太网首部"源MAC地址addr[6]" | 0xB4 0x2E 0x99 0x59 0xEC 0x1E |
| 以太网首部"以太网帧的类型type" | 0x08 0x00,表示IPV4数据包类型 |
| IPV4头部的IP版本和头部长度u8_t vhl | 0x45,表示IPV4头部有4*5=20个字节 |
| IPV4头部的服务类型u8_t tos | 0x00 |
| IPV4头部的IP报文总长度u8_t len[2] | 0x00 0x28,表示报文长度有40个字节 它是IP头,TCP头部和用户数据的长度。 |
| IPV4头部的标识u8_t ipid[2] | 0x86 0x74,表示数据包唯一ID,分片时,所有分片段使用相同ID,表示属于同一包数据。 |
| IPV4头部的标志与片偏移u8_t ipoffset[2] | 0x40 0x00, 禁止对该数据包分片 |
| IPV4头部的生存时间u8_t ttl | 0x80 |
| IPV4头部的TCP协议u8_t proto | 0x06,表示协议是TCP |
| IPV4头部的检验和u16_t ipchksum | 0xF0 0x3B |
| IPV4头部的发送方IP地址u16_t srcipaddr[2] | 0xC0 0xA8 0x01 0xBE 表示192.160.1.190 |
| IPV4头部的接收方IP地址u16_t destipaddr[2] | 0xC0 0xA8 0x01 0x11 表示192.160.1.17 |
| TCP头部的发送方端口u16_t srcport | 0x0A 0x1F,表示发送方端口为2591 |
| TCP头部的接收方端口u16_t destport | 0x00 0x50,表示接收方端口为80 |
| TCP头部的序列号u8_t seqno[4] | 0x4B 0xF8 0x28 0xE2 |
| TCP头部的确认号u8_t ackno[4] | 0x00 0x00 0x00 0x54 |
| TCP头部的数据偏移u8_t tcpoffset | 0x50 TCP头部总长度5*4=20字节 |
| TCP头部的标志位u8_t flags | 0x10 ACK‌=1确认应答,用于确认数据已接收 。 |
| TCP头部的窗口大小u8_t wnd[2] | 0xFA 0x9D 指示计算机接收的缓冲区大小为64157个字节 |
| TCP头部的校验和u16_t tcpchksum | 0xB1 0x79 |
| TCP头部的紧急指针u8_t urgp[2] | 0x00 0x00 |
| 计算机发送数据,发现总字节数小于等于60个字节,则填充无用的填充数据 | 0x00 0x00 0x00 0x00 0x00 0x00 |

20、ENC28J60发送的IPV4数据包:

0xB4 0x2E 0x99 0x59 0xEC 0x1E 0x00 0x08 0xDC 0x11 0x11 0x02 0x08 0x00 0x45 0x00 0x00 0x43 0x00 0x07 0x00 0x00 0x40 0x06 0xF6 0x8E 0xC0 0xA8 0x01 0x11 0xC0 0xA8 0x01 0xBE 0x00 0x50 0x0A 0x1F 0x00 0x00 0x00 0x54 0x4B 0xF8 0x28 0xE2 0x50 0x18 0x05 0xA6 0xEB 0x05 0x00 0x00

Content-type: text/html 0x0D 0x0A 0x0D 0x0A

|-------------------------------------|-------------------------------------------------------|
| 以太网首部"目的mac地址addr[6]" | 0xB4 0x2E 0x99 0x59 0xEC 0x1E |
| 以太网首部"源MAC地址addr[6]" | 0x00 0x08 0xDC 0x11 0x11 0x02 |
| 以太网首部"以太网帧的类型type" | 0x08 0x00,表示IPV4数据包类型 |
| IPV4头部的IP版本和头部长度u8_t vhl | 0x45,表示IPV4头部有4*5=20个字节 |
| IPV4头部的服务类型u8_t tos | 0x00 |
| IPV4头部的IP报文总长度u8_t len[2] | 0x00 0x43,表示报文长度有67个字节 它是IP头,TCP头部和用户数据的长度。 |
| IPV4头部的标识u8_t ipid[2] | 0x00 0x07,表示数据包唯一ID,分片时,所有分片段使用相同ID,表示属于同一包数据。 |
| IPV4头部的标志与片偏移u8_t ipoffset[2] | 0x00 0x00, 禁止对该数据包分片 |
| IPV4头部的生存时间u8_t ttl | 0x40 |
| IPV4头部的TCP协议u8_t proto | 0x06,表示协议是TCP |
| IPV4头部的检验和u16_t ipchksum | 0xF6 0x8E |
| IPV4头部的发送方IP地址u16_t srcipaddr[2] | 0xC0 0xA8 0x01 0x11 表示192.160.1.17 |
| IPV4头部的接收方IP地址u16_t destipaddr[2] | 0xC0 0xA8 0x01 0xBE 表示192.160.1.190 |
| TCP头部的发送方端口u16_t srcport | 0x00 0x50,表示发送方端口为80 |
| TCP头部的接收方端口u16_t destport | 0x0A 0x1F,表示接收方端口为2591 |
| TCP头部的序列号u8_t seqno[4] | 0x00 0x00 0x00 0x54 是由发送的TCP头部的确认号得到的 |
| TCP头部的确认号u8_t ackno[4] | 0x4B 0xF8 0x28 0xE2 是由"0x4B 0xF8 0x27 0x38"加426个字节的到的 |
| TCP头部的数据偏移u8_t tcpoffset | 0x50 TCP头部总长度5*4=20字节 |
| TCP头部的标志位u8_t flags | 0x18 ACK‌=1确认应答,用于确认数据已接收 。 PSH‌=1推送数据,要求接收方立即传递给应用层‌ |
| TCP头部的窗口大小u8_t wnd[2] | 0x05 0xA6 指示ENC28J60的接收缓冲区大小为1446个字节 |
| TCP头部的校验和u16_t tcpchksum | 0xEB 0x05 |
| TCP头部的紧急指针u8_t urgp[2] | 0x00 0x00 |
| TCP头部中的数据 | Content-type: text/html\r\n\r\n |

21、计算机发送的IPV4数据包:

0x00 0x08 0xDC 0x11 0x11 0x02 0xB4 0x2E 0x99 0x59 0xEC 0x1E 0x08 0x00 0x45 0x00 0x00 0x28 0x86 0x75 0x40 0x00 0x80 0x06 0xF0 0x3A 0xC0 0xA8 0x01 0xBE 0xC0 0xA8 0x01 0x11 0x0A 0x1F 0x00 0x50 0x4B 0xF8 0x28 0xE2 0x00 0x00 0x00 0x54 0x50 0x10 0xFA 0x9D 0xB1 0x79 0x00 0x00

计算机发送数据,发现总字节数小于等于60个字节,则填充无用的填充数据0x00 0x00 0x00 0x00 0x00 0x00

|-------------------------------------|------------------------------------------------|
| 以太网首部"目的mac地址addr[6]" | 0x00 0x08 0xDC 0x11 0x11 0x02 |
| 以太网首部"源MAC地址addr[6]" | 0xB4 0x2E 0x99 0x59 0xEC 0x1E |
| 以太网首部"以太网帧的类型type" | 0x08 0x00,表示IPV4数据包类型 |
| IPV4头部的IP版本和头部长度u8_t vhl | 0x45,表示IPV4头部有4*5=20个字节 |
| IPV4头部的服务类型u8_t tos | 0x00 |
| IPV4头部的IP报文总长度u8_t len[2] | 0x00 0x28,表示报文长度有40个字节 它是IP头,TCP头部和用户数据的长度。 |
| IPV4头部的标识u8_t ipid[2] | 0x86 0x75,表示数据包唯一ID,分片时,所有分片段使用相同ID,表示属于同一包数据。 |
| IPV4头部的标志与片偏移u8_t ipoffset[2] | 0x40 0x00, 禁止对该数据包分片 |
| IPV4头部的生存时间u8_t ttl | 0x80 |
| IPV4头部的TCP协议u8_t proto | 0x06,表示协议是TCP |
| IPV4头部的检验和u16_t ipchksum | 0xF0 0x3A |
| IPV4头部的发送方IP地址u16_t srcipaddr[2] | 0xC0 0xA8 0x01 0xBE 表示192.160.1.190 |
| IPV4头部的接收方IP地址u16_t destipaddr[2] | 0xC0 0xA8 0x01 0x11 表示192.160.1.17 |
| TCP头部的发送方端口u16_t srcport | 0x0A 0x1F,表示发送方端口为2591 |
| TCP头部的接收方端口u16_t destport | 0x00 0x50,表示接收方端口为80 |
| TCP头部的序列号u8_t seqno[4] | 0x4B 0xF8 0x28 0xE2 |
| TCP头部的确认号u8_t ackno[4] | 0x00 0x00 0x00 0x54 |
| TCP头部的数据偏移u8_t tcpoffset | 0x50 TCP头部总长度5*4=20字节 |
| TCP头部的标志位u8_t flags | 0x10 ACK‌=1确认应答,用于确认数据已接收 。 |
| TCP头部的窗口大小u8_t wnd[2] | 0xFA 0x9D 指示计算机接收的缓冲区大小为64157个字节 |
| TCP头部的校验和u16_t tcpchksum | 0xB1 0x79 |
| TCP头部的紧急指针u8_t urgp[2] | 0x00 0x00 |
| 计算机发送数据,发现总字节数小于等于60个字节,则填充无用的填充数据 | 0x00 0x00 0x00 0x00 0x00 0x00 |

22、计算机发送的IPV4数据包:

0x00 0x08 0xDC 0x11 0x11 0x02 0xB4 0x2E 0x99 0x59 0xEC 0x1E 0x08 0x00 0x45 0x00 0x00 0x28 0x86 0x76 0x40 0x00 0x80 0x06 0xF0 0x39 0xC0 0xA8 0x01 0xBE 0xC0 0xA8 0x01 0x11 0x0A 0x1F 0x00 0x50 0x4B 0xF8 0x28 0xE2 0x00 0x00 0x00 0x6F 0x50 0x10 0xFA 0x82 0xB1 0x79 0x00 0x00

计算机发送数据,发现总字节数小于等于60个字节,则填充无用的填充数据0x00 0x00 0x00 0x00 0x00 0x00

|-------------------------------------|------------------------------------------------|
| 以太网首部"目的mac地址addr[6]" | 0x00 0x08 0xDC 0x11 0x11 0x02 |
| 以太网首部"源MAC地址addr[6]" | 0xB4 0x2E 0x99 0x59 0xEC 0x1E |
| 以太网首部"以太网帧的类型type" | 0x08 0x00,表示IPV4数据包类型 |
| IPV4头部的IP版本和头部长度u8_t vhl | 0x45,表示IPV4头部有4*5=20个字节 |
| IPV4头部的服务类型u8_t tos | 0x00 |
| IPV4头部的IP报文总长度u8_t len[2] | 0x00 0x28,表示报文长度有40个字节 它是IP头,TCP头部和用户数据的长度。 |
| IPV4头部的标识u8_t ipid[2] | 0x86 0x76,表示数据包唯一ID,分片时,所有分片段使用相同ID,表示属于同一包数据。 |
| IPV4头部的标志与片偏移u8_t ipoffset[2] | 0x40 0x00, 禁止对该数据包分片 |
| IPV4头部的生存时间u8_t ttl | 0x80 |
| IPV4头部的TCP协议u8_t proto | 0x06,表示协议是TCP |
| IPV4头部的检验和u16_t ipchksum | 0xF0 0x39 |
| IPV4头部的发送方IP地址u16_t srcipaddr[2] | 0xC0 0xA8 0x01 0xBE 表示192.160.1.190 |
| IPV4头部的接收方IP地址u16_t destipaddr[2] | 0xC0 0xA8 0x01 0x11 表示192.160.1.17 |
| TCP头部的发送方端口u16_t srcport | 0x0A 0x1F,表示发送方端口为2591 |
| TCP头部的接收方端口u16_t destport | 0x00 0x50,表示接收方端口为80 |
| TCP头部的序列号u8_t seqno[4] | 0x4B 0xF8 0x28 0xE2 |
| TCP头部的确认号u8_t ackno[4] | 0x00 0x00 0x00 0x6F |
| TCP头部的数据偏移u8_t tcpoffset | 0x50 TCP头部总长度5*4=20字节 |
| TCP头部的标志位u8_t flags | 0x10 ACK‌=1确认应答,用于确认数据已接收 。 |
| TCP头部的窗口大小u8_t wnd[2] | 0xFA 0x82 指示计算机接收的缓冲区大小为64157个字节 |
| TCP头部的校验和u16_t tcpchksum | 0xB1 0x79 |
| TCP头部的紧急指针u8_t urgp[2] | 0x00 0x00 |
| 计算机发送数据,发现总字节数小于等于60个字节,则填充无用的填充数据 | 0x00 0x00 0x00 0x00 0x00 0x00 |

23、ENC28J60发送的IPV4数据包:

0xB4 0x2E 0x99 0x59 0xEC 0x1E 0x00 0x08 0xDC 0x11 0x11 0x02 0x08 0x00 0x45 0x00 0x05 0x1C 0x00 0x08 0x00 0x00 0x40 0x06 0xF1 0xB4 0xC0 0xA8 0x01 0x11 0xC0 0xA8 0x01 0xBE 0x00 0x50 0x0A 0x1F 0x00 0x00 0x00 0x6F 0x4B 0xF8 0x28 0xE2 0x50 0x18 0x05 0xA6 0x35 0x7A 0x00 0x00

<html><head><title>我的服务器</title></head><body><div align=center><br><h2>以太网继电器控制页面</h2><small><a 0x20 href="http://192.168.1.17">[刷新]</a></small><br>继电器1状态:[<span style="color:#000000;">关</span>]<input type="button" value="继电器1反转" onclick="window.location.href='rel1';"><br>继电器2状态:[<span style="color:#000000;">关</span>]<input type="button" value="继电器2反转" onclick="window.location.href='rel2';"><br>继电器3状态:[<span style="color:#000000;">关</span>]<input type="button" value="继电器3反转" onclick="window.location.href='rel3';"><br>继电器4状态:[<span style="color:#000000;">关</span>]<input type="button" value="继电器4反转" onclick="window.location.href='rel4';"><br>继电器5状态:[<span style="color:#000000;">关</span>]<input type="button" value="继电器5反转" onclick="window.location.href='rel5';"><br>继电器6状态:[<span style="color:#000000;">关</span>]<input type="button" value="继电器6反转" onclick="window.location.href='rel6';"><br>继电器7状态:[<span style="color:#000000;">关</span>]<input type="button" value="继电器7反转" onclick="window.location.href='rel7';"><br>继电器8状态:[<span style="color:#000000;">关</span>]<input type="button" value="继电器8反转" onclick="window.location.href='rel8';"><br> </div></body></html>

|-------------------------------------|-------------------------------------------------------|
| 以太网首部"目的mac地址addr[6]" | 0xB4 0x2E 0x99 0x59 0xEC 0x1E |
| 以太网首部"源MAC地址addr[6]" | 0x00 0x08 0xDC 0x11 0x11 0x02 |
| 以太网首部"以太网帧的类型type" | 0x08 0x00,表示IPV4数据包类型 |
| IPV4头部的IP版本和头部长度u8_t vhl | 0x45,表示IPV4头部有4*5=20个字节 |
| IPV4头部的服务类型u8_t tos | 0x00 |
| IPV4头部的IP报文总长度u8_t len[2] | 0x05 0x1C,表示报文长度有1308个字节 它是IP头,TCP头部和用户数据的长度。 |
| IPV4头部的标识u8_t ipid[2] | 0x00 0x08,表示数据包唯一ID,分片时,所有分片段使用相同ID,表示属于同一包数据。 |
| IPV4头部的标志与片偏移u8_t ipoffset[2] | 0x00 0x00, 禁止对该数据包分片 |
| IPV4头部的生存时间u8_t ttl | 0x40 |
| IPV4头部的TCP协议u8_t proto | 0x06,表示协议是TCP |
| IPV4头部的检验和u16_t ipchksum | 0xF1 0xB4 |
| IPV4头部的发送方IP地址u16_t srcipaddr[2] | 0xC0 0xA8 0x01 0x11 表示192.160.1.17 |
| IPV4头部的接收方IP地址u16_t destipaddr[2] | 0xC0 0xA8 0x01 0xBE 表示192.160.1.190 |
| TCP头部的发送方端口u16_t srcport | 0x00 0x50,表示发送方端口为80 |
| TCP头部的接收方端口u16_t destport | 0x0A 0x1F,表示接收方端口为2591 |
| TCP头部的序列号u8_t seqno[4] | 0x00 0x00 0x00 0x6F 是由发送的TCP头部的确认号得到的 |
| TCP头部的确认号u8_t ackno[4] | 0x4B 0xF8 0x28 0xE2 是由"0x4B 0xF8 0x27 0x38"加426个字节的到的 |
| TCP头部的数据偏移u8_t tcpoffset | 0x50 TCP头部总长度5*4=20字节 |
| TCP头部的标志位u8_t flags | 0x18 ACK‌=1确认应答,用于确认数据已接收 。 PSH‌=1推送数据,要求接收方立即传递给应用层‌ |
| TCP头部的窗口大小u8_t wnd[2] | 0x05 0xA6 指示ENC28J60的接收缓冲区大小为1446个字节 |
| TCP头部的校验和u16_t tcpchksum | 0x35 0x7A |
| TCP头部的紧急指针u8_t urgp[2] | 0x00 0x00 |
| TCP头部中的数据1268个字节 | 略 |

24、计算机发送的IPV4数据包:

0x00 0x08 0xDC 0x11 0x11 0x02 0xB4 0x2E 0x99 0x59 0xEC 0x1E 0x08 0x00 0x45 0x00 0x00 0x28 0x86 0x77 0x40 0x00 0x80 0x06 0xF0 0x38 0xC0 0xA8 0x01 0xBE 0xC0 0xA8 0x01 0x11 0x0A 0x1F 0x00 0x50 0x4B 0xF8 0x28 0xE2 0x00 0x00 0x05 0x63 0x50 0x10 0xFE 0x2E 0xA8 0xD9 0x00 0x00

计算机发送数据,发现总字节数小于等于60个字节,则填充无用的填充数据0x00 0x00 0x00 0x00 0x00 0x00

|-------------------------------------|--------------------------------------------------------|
| 以太网首部"目的mac地址addr[6]" | 0x00 0x08 0xDC 0x11 0x11 0x02 |
| 以太网首部"源MAC地址addr[6]" | 0xB4 0x2E 0x99 0x59 0xEC 0x1E |
| 以太网首部"以太网帧的类型type" | 0x08 0x00,表示IPV4数据包类型 |
| IPV4头部的IP版本和头部长度u8_t vhl | 0x45,表示IPV4头部有4*5=20个字节 |
| IPV4头部的服务类型u8_t tos | 0x00 |
| IPV4头部的IP报文总长度u8_t len[2] | 0x00 0x28,表示报文长度有40个字节 它是IP头,TCP头部和用户数据的长度。 |
| IPV4头部的标识u8_t ipid[2] | 0x86 0x76,表示数据包唯一ID,分片时,所有分片段使用相同ID,表示属于同一包数据。 |
| IPV4头部的标志与片偏移u8_t ipoffset[2] | 0x40 0x00, 禁止对该数据包分片 |
| IPV4头部的生存时间u8_t ttl | 0x80 |
| IPV4头部的TCP协议u8_t proto | 0x06,表示协议是TCP |
| IPV4头部的检验和u16_t ipchksum | 0xF0 0x38 |
| IPV4头部的发送方IP地址u16_t srcipaddr[2] | 0xC0 0xA8 0x01 0xBE 表示192.160.1.190 |
| IPV4头部的接收方IP地址u16_t destipaddr[2] | 0xC0 0xA8 0x01 0x11 表示192.160.1.17 |
| TCP头部的发送方端口u16_t srcport | 0x0A 0x1F,表示发送方端口为2591 |
| TCP头部的接收方端口u16_t destport | 0x00 0x50,表示接收方端口为80 |
| TCP头部的序列号u8_t seqno[4] | 0x4B 0xF8 0x28 0xE2 |
| TCP头部的确认号u8_t ackno[4] | 0x00 0x00 0x05 0x63 是由"0x00 0x00 0x00 0x6F"加1268个字节得到的 |
| TCP头部的数据偏移u8_t tcpoffset | 0x50 TCP头部总长度5*4=20字节 |
| TCP头部的标志位u8_t flags | 0x10 ACK‌=1确认应答,用于确认数据已接收 。 |
| TCP头部的窗口大小u8_t wnd[2] | 0xFE 0x2E 指示计算机接收的缓冲区大小为65070个字节 |
| TCP头部的校验和u16_t tcpchksum | 0xA8 0xD9 |
| TCP头部的紧急指针u8_t urgp[2] | 0x00 0x00 |
| 计算机发送数据,发现总字节数小于等于60个字节,则填充无用的填充数据 | 0x00 0x00 0x00 0x00 0x00 0x00 |

23、ENC28J60发送的IPV4数据包:

0xB4 0x2E 0x99 0x59 0xEC 0x1E 0x00 0x08 0xDC 0x11 0x11 0x02 0x08 0x00 0x45 0x00 0x00 0x28 0x00 0x09 0x00 0x00 0x40 0x06 0xF6 0xA7 0xC0 0xA8 0x01 0x11 0xC0 0xA8 0x01 0xBE 0x00 0x50 0x0A 0x1F 0x00 0x00 0x05 0x63 0x4B 0xF8 0x28 0xE2 0x50 0x11 0x05 0xA6 0xA1 0x61 0x00 0x00

|-------------------------------------|-------------------------------------------------------|
| 以太网首部"目的mac地址addr[6]" | 0xB4 0x2E 0x99 0x59 0xEC 0x1E |
| 以太网首部"源MAC地址addr[6]" | 0x00 0x08 0xDC 0x11 0x11 0x02 |
| 以太网首部"以太网帧的类型type" | 0x08 0x00,表示IPV4数据包类型 |
| IPV4头部的IP版本和头部长度u8_t vhl | 0x45,表示IPV4头部有4*5=20个字节 |
| IPV4头部的服务类型u8_t tos | 0x00 |
| IPV4头部的IP报文总长度u8_t len[2] | 0x00 0x28,表示报文长度有40个字节 它是IP头,TCP头部和用户数据的长度。 |
| IPV4头部的标识u8_t ipid[2] | 0x00 0x09,表示数据包唯一ID,分片时,所有分片段使用相同ID,表示属于同一包数据。 |
| IPV4头部的标志与片偏移u8_t ipoffset[2] | 0x00 0x00, 禁止对该数据包分片 |
| IPV4头部的生存时间u8_t ttl | 0x40 |
| IPV4头部的TCP协议u8_t proto | 0x06,表示协议是TCP |
| IPV4头部的检验和u16_t ipchksum | 0xF6 0xA7 |
| IPV4头部的发送方IP地址u16_t srcipaddr[2] | 0xC0 0xA8 0x01 0x11 表示192.160.1.17 |
| IPV4头部的接收方IP地址u16_t destipaddr[2] | 0xC0 0xA8 0x01 0xBE 表示192.160.1.190 |
| TCP头部的发送方端口u16_t srcport | 0x00 0x50,表示发送方端口为80 |
| TCP头部的接收方端口u16_t destport | 0x0A 0x1F,表示接收方端口为2591 |
| TCP头部的序列号u8_t seqno[4] | 0x00 0x00 0x05 0x63 是由发送的TCP头部的确认号得到的 |
| TCP头部的确认号u8_t ackno[4] | 0x4B 0xF8 0x28 0xE2 是由"0x4B 0xF8 0x27 0x38"加426个字节的到的 |
| TCP头部的数据偏移u8_t tcpoffset | 0x50 TCP头部总长度5*4=20字节 |
| TCP头部的标志位u8_t flags | 0x11 ACK‌=1确认应答,用于确认数据已接收 。 FIN‌=1结束标志,表示发送方完成数据传输 |
| TCP头部的窗口大小u8_t wnd[2] | 0x05 0xA6 指示ENC28J60的接收缓冲区大小为1446个字节 |
| TCP头部的校验和u16_t tcpchksum | 0xA1 0x61 |
| TCP头部的紧急指针u8_t urgp[2] | 0x00 0x00 |
| TCP头部中的数据 | 无 |

25、计算机发送的IPV4数据包:

0x00 0x08 0xDC 0x11 0x11 0x02 0xB4 0x2E 0x99 0x59 0xEC 0x1E 0x08 0x00 0x45 0x00 0x00 0x28 0x86 0x78 0x40 0x00 0x80 0x06 0xF0 0x37 0xC0 0xA8 0x01 0xBE 0xC0 0xA8 0x01 0x11 0x0A 0x1F 0x00 0x50 0x4B 0xF8 0x28 0xE2 0x00 0x00 0x05 0x64 0x50 0x10 0xFE 0x2E 0xA8 0xD8 0x00 0x00

计算机发送数据,发现总字节数小于等于60个字节,则填充无用的填充数据0x00 0x00 0x00 0x00 0x00 0x00

|-------------------------------------|--------------------------------------------------------|
| 以太网首部"目的mac地址addr[6]" | 0x00 0x08 0xDC 0x11 0x11 0x02 |
| 以太网首部"源MAC地址addr[6]" | 0xB4 0x2E 0x99 0x59 0xEC 0x1E |
| 以太网首部"以太网帧的类型type" | 0x08 0x00,表示IPV4数据包类型 |
| IPV4头部的IP版本和头部长度u8_t vhl | 0x45,表示IPV4头部有4*5=20个字节 |
| IPV4头部的服务类型u8_t tos | 0x00 |
| IPV4头部的IP报文总长度u8_t len[2] | 0x00 0x28,表示报文长度有40个字节 它是IP头,TCP头部和用户数据的长度。 |
| IPV4头部的标识u8_t ipid[2] | 0x86 0x78,表示数据包唯一ID,分片时,所有分片段使用相同ID,表示属于同一包数据。 |
| IPV4头部的标志与片偏移u8_t ipoffset[2] | 0x40 0x00, 禁止对该数据包分片 |
| IPV4头部的生存时间u8_t ttl | 0x80 |
| IPV4头部的TCP协议u8_t proto | 0x06,表示协议是TCP |
| IPV4头部的检验和u16_t ipchksum | 0xF0 0x37 |
| IPV4头部的发送方IP地址u16_t srcipaddr[2] | 0xC0 0xA8 0x01 0xBE 表示192.160.1.190 |
| IPV4头部的接收方IP地址u16_t destipaddr[2] | 0xC0 0xA8 0x01 0x11 表示192.160.1.17 |
| TCP头部的发送方端口u16_t srcport | 0x0A 0x1F,表示发送方端口为2591 |
| TCP头部的接收方端口u16_t destport | 0x00 0x50,表示接收方端口为80 |
| TCP头部的序列号u8_t seqno[4] | 0x4B 0xF8 0x28 0xE2 |
| TCP头部的确认号u8_t ackno[4] | 0x00 0x00 0x05 0x64 是由"0x00 0x00 0x00 0x6F"加1268个字节得到的 |
| TCP头部的数据偏移u8_t tcpoffset | 0x50 TCP头部总长度5*4=20字节 |
| TCP头部的标志位u8_t flags | 0x10 ACK‌=1确认应答,用于确认数据已接收 。 |
| TCP头部的窗口大小u8_t wnd[2] | 0xFE 0x2E 指示计算机接收的缓冲区大小为65070个字节 |
| TCP头部的校验和u16_t tcpchksum | 0xA8 0Xd8 |
| TCP头部的紧急指针u8_t urgp[2] | 0x00 0x00 |
| 计算机发送数据,发现总字节数小于等于60个字节,则填充无用的填充数据 | 0x00 0x00 0x00 0x00 0x00 0x00 |

26、计算机发送的IPV4数据包:

0x00 0x08 0xDC 0x11 0x11 0x02 0xB4 0x2E 0x99 0x59 0xEC 0x1E 0x08 0x00 0x45 0x00 0x00 0x28 0x86 0x79 0x40 0x00 0x80 0x06 0xF0 0x36 0xC0 0xA8 0x01 0xBE 0xC0 0xA8 0x01 0x11 0x0A 0x1F 0x00 0x50 0x4B 0xF8 0x28 0xE2 0x00 0x00 0x05 0x64 0x50 0x11 0xFE 0x2E 0xA8 0xD7 0x00 0x00

0x00 0x00 0x00 0x00 0x00 0x00

|-------------------------------------|--------------------------------------------------------|
| 以太网首部"目的mac地址addr[6]" | 0x00 0x08 0xDC 0x11 0x11 0x02 |
| 以太网首部"源MAC地址addr[6]" | 0xB4 0x2E 0x99 0x59 0xEC 0x1E |
| 以太网首部"以太网帧的类型type" | 0x08 0x00,表示IPV4数据包类型 |
| IPV4头部的IP版本和头部长度u8_t vhl | 0x45,表示IPV4头部有4*5=20个字节 |
| IPV4头部的服务类型u8_t tos | 0x00 |
| IPV4头部的IP报文总长度u8_t len[2] | 0x00 0x28,表示报文长度有40个字节 它是IP头,TCP头部和用户数据的长度。 |
| IPV4头部的标识u8_t ipid[2] | 0x86 0x79,表示数据包唯一ID,分片时,所有分片段使用相同ID,表示属于同一包数据。 |
| IPV4头部的标志与片偏移u8_t ipoffset[2] | 0x40 0x00, 禁止对该数据包分片 |
| IPV4头部的生存时间u8_t ttl | 0x80 |
| IPV4头部的TCP协议u8_t proto | 0x06,表示协议是TCP |
| IPV4头部的检验和u16_t ipchksum | 0xF0 0x36 |
| IPV4头部的发送方IP地址u16_t srcipaddr[2] | 0xC0 0xA8 0x01 0xBE 表示192.160.1.190 |
| IPV4头部的接收方IP地址u16_t destipaddr[2] | 0xC0 0xA8 0x01 0x11 表示192.160.1.17 |
| TCP头部的发送方端口u16_t srcport | 0x0A 0x1F,表示发送方端口为2591 |
| TCP头部的接收方端口u16_t destport | 0x00 0x50,表示接收方端口为80 |
| TCP头部的序列号u8_t seqno[4] | 0x4B 0xF8 0x28 0xE2 |
| TCP头部的确认号u8_t ackno[4] | 0x00 0x00 0x05 0x64 是由"0x00 0x00 0x00 0x6F"加1268个字节得到的 |
| TCP头部的数据偏移u8_t tcpoffset | 0x50 TCP头部总长度5*4=20字节 |
| TCP头部的标志位u8_t flags | 0x11 ACK‌=1确认应答,用于确认数据已接收 。 FIN‌=1结束标志,表示发送方完成数据传输 |
| TCP头部的窗口大小u8_t wnd[2] | 0xFE 0x2E指示计算机接收的缓冲区大小为65070个字节 |
| TCP头部的校验和u16_t tcpchksum | 0xA8 0xD7 |
| TCP头部的紧急指针u8_t urgp[2] | 0x00 0x00 |
| 计算机发送数据,发现总字节数小于等于60个字节,则填充无用的填充数据 | 0x00 0x00 0x00 0x00 0x00 0x00 |

27、ENC28J60发送的IPV4数据包:

0xB4 0x2E 0x99 0x59 0xEC 0x1E 0x00 0x08 0xDC 0x11 0x11 0x02 0x08 0x00 0x45 0x00 0x00 0x28 0x00 0x0A 0x00 0x00 0x40 0x06 0xF6 0xA6 0xC0 0xA8 0x01 0x11 0xC0 0xA8 0x01 0xBE 0x00 0x50 0x0A 0x1F 0x00 0x00 0x05 0x64 0x4B 0xF8 0x28 0xE3 0x50 0x10 0x05 0xA6 0xA1 0x60 0x00 0x00

|-------------------------------------|-----------------------------------------------------|
| 以太网首部"目的mac地址addr[6]" | 0xB4 0x2E 0x99 0x59 0xEC 0x1E |
| 以太网首部"源MAC地址addr[6]" | 0x00 0x08 0xDC 0x11 0x11 0x02 |
| 以太网首部"以太网帧的类型type" | 0x08 0x00,表示IPV4数据包类型 |
| IPV4头部的IP版本和头部长度u8_t vhl | 0x45,表示IPV4头部有4*5=20个字节 |
| IPV4头部的服务类型u8_t tos | 0x00 |
| IPV4头部的IP报文总长度u8_t len[2] | 0x00 0x28,表示报文长度有40个字节 它是IP头,TCP头部和用户数据的长度。 |
| IPV4头部的标识u8_t ipid[2] | 0x00 0x0A,表示数据包唯一ID,分片时,所有分片段使用相同ID,表示属于同一包数据。 |
| IPV4头部的标志与片偏移u8_t ipoffset[2] | 0x00 0x00, 禁止对该数据包分片 |
| IPV4头部的生存时间u8_t ttl | 0x40 |
| IPV4头部的TCP协议u8_t proto | 0x06,表示协议是TCP |
| IPV4头部的检验和u16_t ipchksum | 0xF6 0Xa6 |
| IPV4头部的发送方IP地址u16_t srcipaddr[2] | 0xC0 0xA8 0x01 0x11 表示192.160.1.17 |
| IPV4头部的接收方IP地址u16_t destipaddr[2] | 0xC0 0xA8 0x01 0xBE 表示192.160.1.190 |
| TCP头部的发送方端口u16_t srcport | 0x00 0x50,表示发送方端口为80 |
| TCP头部的接收方端口u16_t destport | 0x0A 0x1F,表示接收方端口为2591 |
| TCP头部的序列号u8_t seqno[4] | 0x00 0x00 0x05 0x64 是由发送的TCP头部的确认号得到的 |
| TCP头部的确认号u8_t ackno[4] | 0x4B 0xF8 0x28 0Xe3 是由"0x4B 0xF8 0x28 0xe2"加1个字节的到的 |
| TCP头部的数据偏移u8_t tcpoffset | 0x50 TCP头部总长度5*4=20字节 |
| TCP头部的标志位u8_t flags | 0x10 ACK‌=1确认应答,用于确认数据已接收 。 |
| TCP头部的窗口大小u8_t wnd[2] | 0x05 0xA6 指示ENC28J60的接收缓冲区大小为1446个字节 |
| TCP头部的校验和u16_t tcpchksum | 0xA1 0x60 |
| TCP头部的紧急指针u8_t urgp[2] | 0x00 0x00 |
| TCP头部中的数据 | 无 |

28、计算机发送的IPV4数据包:

0x00 0x08 0xDC 0x11 0x11 0x02 0xB4 0x2E 0x99 0x59 0xEC 0x1E 0x08 0x00 0x45 0x00 0x01 0x89 0x86 0x7A 0x40 0x00 0x80 0x06 0xEE 0xD4 0xC0 0xA8 0x01 0xBE 0xC0 0xA8 0x01 0x11 0x0A 0x1D 0x00 0x50 0xF5 0xA7 0xB7 0x10 0x00 0x00 0x00 0x01 0x50 0x18 0xFA 0xF0 0xEF 0xBE 0x00 0x00

GET /favicon.ico HTTP/1.1含\r\n,合计27个字节

Host: 192.168.1.17含\r\n,合计20个字节

Connection: keep-alive含\r\n,合计24个字节

User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36含\r\n,合计124个字节

Accept: image/avif,image/webp,image/apng,image/*,*/*;q=0.8含\r\n,合计60个字节

Referer: http://192.168.1.17/含\r\n,合计31个字节

Accept-Encoding: gzip, deflate含\r\n,合计32个字节

Accept-Language: zh-CN,zh;q=0.9含\r\n\r\n,合计35个字节

得到TCP头部中的数据为353个字节,报文长度为353+40=393个字节

|-------------------------------------|--------------------------------------------------------|
| 以太网首部"目的mac地址addr[6]" | 0x00 0x08 0xDC 0x11 0x11 0x02 |
| 以太网首部"源MAC地址addr[6]" | 0xB4 0x2E 0x99 0x59 0xEC 0x1E |
| 以太网首部"以太网帧的类型type" | 0x08 0x00,表示IPV4数据包类型 |
| IPV4头部的IP版本和头部长度u8_t vhl | 0x45,表示IPV4头部有4*5=20个字节 |
| IPV4头部的服务类型u8_t tos | 0x00 |
| IPV4头部的IP报文总长度u8_t len[2] | 0x01 0x89,表示报文长度有393个字节 它是IP头,TCP头部和用户数据的长度。 |
| IPV4头部的标识u8_t ipid[2] | 0x86 0x7A,表示数据包唯一ID,分片时,所有分片段使用相同ID,表示属于同一包数据。 |
| IPV4头部的标志与片偏移u8_t ipoffset[2] | 0x40 0x00, 禁止对该数据包分片 |
| IPV4头部的生存时间u8_t ttl | 0x80 |
| IPV4头部的TCP协议u8_t proto | 0x06,表示协议是TCP |
| IPV4头部的检验和u16_t ipchksum | 0xEE 0xD4 |
| IPV4头部的发送方IP地址u16_t srcipaddr[2] | 0xC0 0xA8 0x01 0xBE 表示192.160.1.190 |
| IPV4头部的接收方IP地址u16_t destipaddr[2] | 0xC0 0xA8 0x01 0x11 表示192.160.1.17 |
| TCP头部的发送方端口u16_t srcport | 0x0A 0x1D,表示发送方端口为2589 |
| TCP头部的接收方端口u16_t destport | 0x00 0x50,表示接收方端口为80 |
| TCP头部的序列号u8_t seqno[4] | 0xF5 0xA7 0xB7 0x10 |
| TCP头部的确认号u8_t ackno[4] | 0x00 0x00 0x00 0x01 是由"0x00 0x00 0x00 0x6F"加1268个字节得到的 |
| TCP头部的数据偏移u8_t tcpoffset | 0x50 TCP头部总长度5*4=20字节 |
| TCP头部的标志位u8_t flags | 0x18 ACK‌=1确认应答,用于确认数据已接收 。 PSH‌=1推送数据,要求接收方立即传递给应用层‌ |
| TCP头部的窗口大小u8_t wnd[2] | 0xFA 0xF0指示计算机接收的缓冲区大小为64240个字节 |
| TCP头部的校验和u16_t tcpchksum | 0xEF 0xBE |
| TCP头部的紧急指针u8_t urgp[2] | 0x00 0x00 |
| TCP头部中的数据353个字节 | 略 |

29、ENC28J60发送的IPV4数据包:

0xB4 0x2E 0x99 0x59 0xEC 0x1E 0x00 0x08 0xDC 0x11 0x11 0x02 0x08 0x00 0x45 0x00 0x00 0x82 0x00 0x0B 0x00 0x00 0x40 0x06 0xF6 0x4B 0xC0 0xA8 0x01 0x11 0xC0 0xA8 0x01 0xBE 0x00 0x50 0x0A 0x1D 0x00 0x00 0x00 0x01 0xF5 0xA7 0xB8 0x71 0x50 0x18 0x05 0xA6 0xD4 0x4D 0x00 0x00

HTTP/1.0 404 Not found含\r\n,合计24个字节

Server: uIP/1.0 http://www.sics.se/~adam/uip/含\r\n,合计47个字节

Connection: close含\r\n,合计19个字节

得到TCP头部中的数据为90个字节,报文长度为90+40=130个字节

|-------------------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| 以太网首部"目的mac地址addr[6]" | 0xB4 0x2E 0x99 0x59 0xEC 0x1E |
| 以太网首部"源MAC地址addr[6]" | 0x00 0x08 0xDC 0x11 0x11 0x02 |
| 以太网首部"以太网帧的类型type" | 0x08 0x00,表示IPV4数据包类型 |
| IPV4头部的IP版本和头部长度u8_t vhl | 0x45,表示IPV4头部有4*5=20个字节 |
| IPV4头部的服务类型u8_t tos | 0x00 |
| IPV4头部的IP报文总长度u8_t len[2] | 0x00 0x82,表示报文长度有130个字节 它是IP头,TCP头部和用户数据的长度。 |
| IPV4头部的标识u8_t ipid[2] | 0x00 0x0B,表示数据包唯一ID,分片时,所有分片段使用相同ID,表示属于同一包数据。 |
| IPV4头部的标志与片偏移u8_t ipoffset[2] | 0x00 0x00, 禁止对该数据包分片 |
| IPV4头部的生存时间u8_t ttl | 0x40 |
| IPV4头部的TCP协议u8_t proto | 0x06,表示协议是TCP |
| IPV4头部的检验和u16_t ipchksum | 0xF6 0x4B |
| IPV4头部的发送方IP地址u16_t srcipaddr[2] | 0xC0 0xA8 0x01 0x11 表示192.160.1.17 |
| IPV4头部的接收方IP地址u16_t destipaddr[2] | 0xC0 0xA8 0x01 0xBE 表示192.160.1.190 |
| TCP头部的发送方端口u16_t srcport | 0x00 0x50,表示发送方端口为80 |
| TCP头部的接收方端口u16_t destport | 0x0A 0x1D,表示接收方端口为2589 |
| TCP头部的序列号u8_t seqno[4] | 0x00 0x00 0x00 0x01 是由发送的TCP头部的确认号得到的 |
| TCP头部的确认号u8_t ackno[4] | 0xF5 0xA7 0xB8 0x71 |
| TCP头部的数据偏移u8_t tcpoffset | 0x50 TCP头部总长度5*4=20字节 |
| TCP头部的标志位u8_t flags | 0x18 ACK‌=1确认应答,用于确认数据已接收 。 PSH‌=1推送数据,要求接收方立即传递给应用层‌ |
| TCP头部的窗口大小u8_t wnd[2] | 0x05 0xA6 指示ENC28J60的接收缓冲区大小为1446个字节 |
| TCP头部的校验和u16_t tcpchksum | 0xD4 0x4D |
| TCP头部的紧急指针u8_t urgp[2] | 0x00 0x00 |
| TCP头部中的数据90个字节 | HTTP/1.0 404 Not found含\r\nServer: uIP/1.0 http://www.sics.se/~adam/uip/含\r\n Connection: close含\r\n |

30、计算机发送的IPV4数据包:

0x00 0x08 0xDC 0x11 0x11 0x02 0xB4 0x2E 0x99 0x59 0xEC 0x1E 0x08 0x00 0x45 0x00 0x00 0x28 0x86 0x7B 0x40 0x00 0x80 0x06 0xF0 0x34 0xC0 0xA8 0x01 0xBE 0xC0 0xA8 0x01 0x11 0x0A 0x1D 0x00 0x50 0xF5 0xA7 0xB8 0x71 0x00 0x00 0x00 0x5B 0x50 0x10 0xFA 0x96 0x78 0x3C 0x00 0x00

计算机发送数据,发现总字节数小于等于60个字节,则填充无用的填充数据0x00 0x00 0x00 0x00 0x00 0x00

|-------------------------------------|------------------------------------------------|
| 以太网首部"目的mac地址addr[6]" | 0x00 0x08 0xDC 0x11 0x11 0x02 |
| 以太网首部"源MAC地址addr[6]" | 0xB4 0x2E 0x99 0x59 0xEC 0x1E |
| 以太网首部"以太网帧的类型type" | 0x08 0x00,表示IPV4数据包类型 |
| IPV4头部的IP版本和头部长度u8_t vhl | 0x45,表示IPV4头部有4*5=20个字节 |
| IPV4头部的服务类型u8_t tos | 0x00 |
| IPV4头部的IP报文总长度u8_t len[2] | 0x00 0x28,表示报文长度有40个字节 它是IP头,TCP头部和用户数据的长度。 |
| IPV4头部的标识u8_t ipid[2] | 0x86 0x7B,表示数据包唯一ID,分片时,所有分片段使用相同ID,表示属于同一包数据。 |
| IPV4头部的标志与片偏移u8_t ipoffset[2] | 0x40 0x00, 禁止对该数据包分片 |
| IPV4头部的生存时间u8_t ttl | 0x80 |
| IPV4头部的TCP协议u8_t proto | 0x06,表示协议是TCP |
| IPV4头部的检验和u16_t ipchksum | 0xF0 0x34 |
| IPV4头部的发送方IP地址u16_t srcipaddr[2] | 0xC0 0xA8 0x01 0xBE 表示192.160.1.190 |
| IPV4头部的接收方IP地址u16_t destipaddr[2] | 0xC0 0xA8 0x01 0x11 表示192.160.1.17 |
| TCP头部的发送方端口u16_t srcport | 0x0A 0x1D,表示发送方端口为2589 |
| TCP头部的接收方端口u16_t destport | 0x00 0x50,表示接收方端口为80 |
| TCP头部的序列号u8_t seqno[4] | 0xF5 0xA7 0xB8 0x71 |
| TCP头部的确认号u8_t ackno[4] | 0x00 0x00 0x00 0x5B |
| TCP头部的数据偏移u8_t tcpoffset | 0x50 TCP头部总长度5*4=20字节 |
| TCP头部的标志位u8_t flags | 0x10 ACK‌=1确认应答,用于确认数据已接收 。 |
| TCP头部的窗口大小u8_t wnd[2] | 0xFA 0x96指示计算机接收的缓冲区大小为64150个字节 |
| TCP头部的校验和u16_t tcpchksum | 0x78 0x3C |
| TCP头部的紧急指针u8_t urgp[2] | 0x00 0x00 |
| 计算机发送数据,发现总字节数小于等于60个字节,则填充无用的填充数据 | 0x00 0x00 0x00 0x00 0x00 0x00 |

31、ENC28J60发送的IPV4数据包:

0xB4 0x2E 0x99 0x59 0xEC 0x1E 0x00 0x08 0xDC 0x11 0x11 0x02 0x08 0x00 0x45 0x00 0x00 0x43 0x00 0x0C 0x00 0x00 0x40 0x06 0xF6 0x89 0xC0 0xA8 0x01 0x11 0xC0 0xA8 0x01 0xBE 0x00 0x50 0x0A 0x1D 0x00 0x00 0x00 0x5B 0xF5 0xA7 0xB8 0x71 0x50 0x18 0x05 0xA6 0xB1 0xC1 0x00 0x00

Content-type: text/html含\r\n\r\n,合计27个字节

得到TCP头部中的数据为27个字节,报文长度为27+40=67个字节

|-------------------------------------|-------------------------------------------------------|
| 以太网首部"目的mac地址addr[6]" | 0xB4 0x2E 0x99 0x59 0xEC 0x1E |
| 以太网首部"源MAC地址addr[6]" | 0x00 0x08 0xDC 0x11 0x11 0x02 |
| 以太网首部"以太网帧的类型type" | 0x08 0x00,表示IPV4数据包类型 |
| IPV4头部的IP版本和头部长度u8_t vhl | 0x45,表示IPV4头部有4*5=20个字节 |
| IPV4头部的服务类型u8_t tos | 0x00 |
| IPV4头部的IP报文总长度u8_t len[2] | 0x00 0x43,表示报文长度有67个字节 它是IP头,TCP头部和用户数据的长度。 |
| IPV4头部的标识u8_t ipid[2] | 0x00 0x0C,表示数据包唯一ID,分片时,所有分片段使用相同ID,表示属于同一包数据。 |
| IPV4头部的标志与片偏移u8_t ipoffset[2] | 0x00 0x00, 禁止对该数据包分片 |
| IPV4头部的生存时间u8_t ttl | 0x40 |
| IPV4头部的TCP协议u8_t proto | 0x06,表示协议是TCP |
| IPV4头部的检验和u16_t ipchksum | 0xF6 0x89 |
| IPV4头部的发送方IP地址u16_t srcipaddr[2] | 0xC0 0xA8 0x01 0x11 表示192.160.1.17 |
| IPV4头部的接收方IP地址u16_t destipaddr[2] | 0xC0 0xA8 0x01 0xBE 表示192.160.1.190 |
| TCP头部的发送方端口u16_t srcport | 0x00 0x50,表示发送方端口为80 |
| TCP头部的接收方端口u16_t destport | 0x0A 0x1D,表示接收方端口为2589 |
| TCP头部的序列号u8_t seqno[4] | 0x00 0x00 0x00 0x5B 是由发送的TCP头部的确认号得到的 |
| TCP头部的确认号u8_t ackno[4] | 0xF5 0xA7 0xB8 0x71 |
| TCP头部的数据偏移u8_t tcpoffset | 0x50 TCP头部总长度5*4=20字节 |
| TCP头部的标志位u8_t flags | 0x18 ACK‌=1确认应答,用于确认数据已接收 。 PSH‌=1推送数据,要求接收方立即传递给应用层‌ |
| TCP头部的窗口大小u8_t wnd[2] | 0x05 0xA6 指示ENC28J60的接收缓冲区大小为1446个字节 |
| TCP头部的校验和u16_t tcpchksum | 0xB1 0xC1 |
| TCP头部的紧急指针u8_t urgp[2] | 0x00 0x00 |
| TCP头部中的数据 | 无 |

32、计算机发送的IPV4数据包:

0x00 0x08 0xDC 0x11 0x11 0x02 0xB4 0x2E 0x99 0x59 0xEC 0x1E 0x08 0x00 0x45 0x00 0x00 0x28 0x86 0x7C 0x40 0x00 0x80 0x06 0xF0 0x33 0xC0 0xA8 0x01 0xBE 0xC0 0xA8 0x01 0x11 0x0A 0x1D 0x00 0x50 0xF5 0xA7 0xB8 0x71 0x00 0x00 0x00 0x76 0x50 0x10 0xFA 0x7B 0x78 0x3C 0x00 0x00

计算机发送数据,发现总字节数小于等于60个字节,则填充无用的填充数据0x00 0x00 0x00 0x00 0x00 0x00

|-------------------------------------|------------------------------------------------|
| 以太网首部"目的mac地址addr[6]" | 0x00 0x08 0xDC 0x11 0x11 0x02 |
| 以太网首部"源MAC地址addr[6]" | 0xB4 0x2E 0x99 0x59 0xEC 0x1E |
| 以太网首部"以太网帧的类型type" | 0x08 0x00,表示IPV4数据包类型 |
| IPV4头部的IP版本和头部长度u8_t vhl | 0x45,表示IPV4头部有4*5=20个字节 |
| IPV4头部的服务类型u8_t tos | 0x00 |
| IPV4头部的IP报文总长度u8_t len[2] | 0x00 0x28,表示报文长度有40个字节 它是IP头,TCP头部和用户数据的长度。 |
| IPV4头部的标识u8_t ipid[2] | 0x86 0x7C,表示数据包唯一ID,分片时,所有分片段使用相同ID,表示属于同一包数据。 |
| IPV4头部的标志与片偏移u8_t ipoffset[2] | 0x40 0x00, 禁止对该数据包分片 |
| IPV4头部的生存时间u8_t ttl | 0x80 |
| IPV4头部的TCP协议u8_t proto | 0x06,表示协议是TCP |
| IPV4头部的检验和u16_t ipchksum | 0xF0 0x33 |
| IPV4头部的发送方IP地址u16_t srcipaddr[2] | 0xC0 0xA8 0x01 0xBE 表示192.160.1.190 |
| IPV4头部的接收方IP地址u16_t destipaddr[2] | 0xC0 0xA8 0x01 0x11 表示192.160.1.17 |
| TCP头部的发送方端口u16_t srcport | 0x0A 0x1D,表示发送方端口为2589 |
| TCP头部的接收方端口u16_t destport | 0x00 0x50,表示接收方端口为80 |
| TCP头部的序列号u8_t seqno[4] | 0xF5 0xA7 0xB8 0x71 |
| TCP头部的确认号u8_t ackno[4] | 0x00 0x00 0x00 0x76 |
| TCP头部的数据偏移u8_t tcpoffset | 0x50 TCP头部总长度5*4=20字节 |
| TCP头部的标志位u8_t flags | 0x10 ACK‌=1确认应答,用于确认数据已接收 。 |
| TCP头部的窗口大小u8_t wnd[2] | 0xFA 0x7B指示计算机接收的缓冲区大小为64123个字节 |
| TCP头部的校验和u16_t tcpchksum | 0x78 0x3C |
| TCP头部的紧急指针u8_t urgp[2] | 0x00 0x00 |
| 计算机发送数据,发现总字节数小于等于60个字节,则填充无用的填充数据 | 0x00 0x00 0x00 0x00 0x00 0x00 |

三、测试结果:

四、校验和程序

//函数功能:将"大端存储方式"的data[]中的前len个字节按照"双字节进行累加和校验"

//data为"待校验数据缓存"的起始地址

//len为待校验数据的字节总数

static u16_t chksum(u16_t sum, const u8_t *data, u16_t len)

{

u16_t t;

const u8_t *dataptr;

const u8_t *last_byte;

dataptr = data; //指向"待校验数据缓存"的起始地址

last_byte = data + len - 1; //指向"待校验数据缓存"的结束地址

while(dataptr < last_byte)//至少有两个字节才能执行此while循环

{

t = (dataptr[0] << 8) + dataptr[1];//生成"大端存储方式"的16位整型数据

sum += t;//计算"累加和"

if(sum < t)//sum越过0x0000,发生进位

{

sum++;//若有进位,则加1

}

dataptr += 2;//修改指针,为下次计算"累加和"做准备

}

if(dataptr == last_byte)//剩余一个字节

{

t = (dataptr[0] << 8) + 0;//生成"大端存储方式"的16位整型数据

sum += t;//计算"累加和"

if(sum < t)//sum越过0x0000,发生进位

{

sum++;//若有进位,则加1

}

}

return sum;//按照"大端存储方式"返回sum

}

//函数功能:将data[]中的前len个字节按照双字节进行累加和校验

u16_t uip_chksum(u16_t *data, u16_t len)

{

u16_t sum;

sum=chksum(0, (u8_t *)data, len);

//将"大端存储方式"的data[]中的前len个字节按照"双字节进行累加和校验"

return htons(sum);

//将sum转换为"小端端存储方式"返回,因为KEIL使用的是小端存储方式

}

//函数功能:将"大端存储方式"的首地址为&uip_buf[14]的缓存中的前20个字节按照"双字节进行累加和校验"

//计算IP头部校验和

u16_t uip_ipchksum(void)

{

u16_t sum;

u8_t *tmpIPDataPointer;

tmpIPDataPointer=&uip_buf[UIP_LLH_LEN];

sum = chksum(0, tmpIPDataPointer, UIP_IPH_LEN);

//将"大端存储方式"的tmpIPDataPointer[]中的前20个字节按照"双字节进行累加和校验"

//定义UIP_LLH_LEN=14,IP头的大小为UIP_IPH_LEN=20

DEBUG_PRINTF("uip_ipchksum: sum 0x%04x\n", sum);

return (sum == 0) ? 0xffff : htons(sum);

//htons()将累加和sum按照小端存储方式返回

}

//计算"上层长度,IP协议,发送方IP和接收方IP,TCP头和数据"的校验和

//proto=UIP_PROTO_TCP 6 //TCP协议

//proto=UIP_PROTO_UDP 17 //UDP协议编

//proto=UIP_PROTO_ICMP6 58 //ICMP6协议

static u16_t upper_layer_chksum(u8_t proto)

{

u16_t upper_layer_len;

u16_t sum;

#if UIP_CONF_IPV6

upper_layer_len = (((u16_t)(BUF->len[0]) << 8) + BUF->len[1]);

#else

upper_layer_len = (((u16_t)(BUF->len[0]) << 8) + BUF->len[1]) - UIP_IPH_LEN;

//上层长度upper_layer_len = IP报文总长度 - IP头的大小

#endif

sum = upper_layer_len + proto;

/*累加"上层长度和IP协议"时,无需考虑进位。

IP protocol and length fields. This addition cannot carry. */

sum = chksum(sum, (u8_t *)&BUF->srcipaddr[0], 2 * sizeof(uip_ipaddr_t));

/* 发送方IP和接收方IP需要考虑累加时考虑进位。Sum IP source and destination addresses. */

sum = chksum(sum, &uip_buf[UIP_IPH_LEN + UIP_LLH_LEN],upper_layer_len);

/*累加"TCP头和数据"时需要考虑加法进位。 Sum TCP header and data. */

return (sum == 0) ? 0xffff : htons(sum);

}

u16_t uip_tcpchksum(void)

{

return upper_layer_chksum(UIP_PROTO_TCP);

}

相关推荐
氵文大师10 分钟前
A机通过 python -m http.server 下载B机的文件
linux·开发语言·python·http
云山工作室1 小时前
用于电动汽车的永磁同步电机调速系统建模与仿真(论文+)
stm32·单片机·嵌入式硬件·毕业设计·毕设
TT哇1 小时前
消息推送机制——WebSocket
java·网络·websocket·网络协议
lingggggaaaa2 小时前
免杀对抗——C2远控篇&PowerShell&有无文件落地&C#参数调用&绕AMSI&ETW&去混淆特征
c语言·开发语言·笔记·学习·安全·microsoft·c#
口袋物联2 小时前
设计模式之建造者模式在 C 语言中的应用(含 Linux 内核实例)
c语言·设计模式·建造者模式
切糕师学AI2 小时前
位带操作(Bit-Banding)是什么?
c语言·arm·嵌入式开发·cortex-m·位带操作
DIY机器人工房2 小时前
嵌入式面试题:纹波率怎么计算;Buck 电路电感值的标准计算式是什么?
stm32·嵌入式硬件·面试题·diy机器人工房
帧栈3 小时前
开发避坑指南(72):HttpHeaders 的add()方法和set()方法有什么区别?
java·spring·http
DIY机器人工房3 小时前
嵌入式面试题:电容滤波,低频高频谁来滤?放置顺序怎么定?
stm32·单片机·嵌入式硬件·diy机器人工房