http 请求报文和应答报文

本文详细解析了HTTP请求与响应的过程,包括请求报文中各字段的含义,如POST方法、主机头、客户端类型等;同时介绍了响应报文的结构及含义,例如状态码200表示请求成功。

请求报文

POST /cgi-bin/httpconn HTTP/1.1

POST:请求地址

Host: 111.161.64.121

HOST:主机头

Accept: /

Accept :accept 属性

User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)

U-A:客户端类型

Connection: Keep-Alive

connection: :keep-Alive 持续连接

Cache-Control: no-cache

cache-control:缓存管理

Accept-Encoding: gzip, deflate

Accept-enconding: 支持压缩

Content-Type: application/octet-stream

content-type:传输类型

Content-Length: 218

content-length:传输长度

响应报文

HTTP/1.1 200 OK

HTTP:200成功返回值正常

Server: httpsf2

server:主机类型

Connection: Keep-alive

Connection:持续可连接

Content-Type: text/octet

Content-Type:传输类型

Content-Length: 2291

Content-Length:传输长度

转载于:https://blog.51cto.com/13680639/2092700

### 1. ARP 请求应答报文的结构 ARP(Address Resolution Protocol)请求应答报文的格式在以太网中遵循标准的ARP报文结构[^1]。以下是其主要字段组成: - **硬件类型 (Hardware Type)**:表示物理网络的类型,对于以太网,该值为1。 - **协议类型 (Protocol Type)**:表示高层协议的类型,对于IPv4,该值为0x0800。 - **硬件地址长度 (Hardware Address Length)**:表示硬件地址的长度,以字节为单位,对于以太网MAC地址,该值为6。 - **协议地址长度 (Protocol Address Length)**:表示协议地址的长度,对于IPv4地址,该值为4。 - **操作码 (Operation Code)**:用于区分请求应答报文。如果值为1,则表示ARP请求;如果值为2,则表示ARP应答。 - **发送方硬件地址 (Sender Hardware Address)**:发送方的MAC地址。 - **发送方协议地址 (Sender Protocol Address)**:发送方的IP地址。 - **目标硬件地址 (Target Hardware Address)**:目标方的MAC地址。在ARP请求中通常为全0,在ARP应答中为目标方的真实MAC地址。 - **目标协议地址 (Target Protocol Address)**:目标方的IP地址。 ARP请求应答报文的具体结构如下所示: ```c struct etharp_hdr { uint16_t hardware_type; // 硬件类型 uint16_t protocol_type; // 协议类型 uint8_t hardware_len; // 硬件地址长度 uint8_t protocol_len; // 协议地址长度 uint16_t opcode; // 操作码 uint8_t sender_hwaddr[6]; // 发送方硬件地址 uint8_t sender_ipaddr[4]; // 发送方协议地址 uint8_t target_hwaddr[6]; // 目标硬件地址 uint8_t target_ipaddr[4]; // 目标协议地址 }; ``` ### 2. lwIP 中 ARP 请求与应答的实现 在lwIP协议栈中,ARP请求应答的处理主要通过以下函数实现: - **ARP 请求的生成**: 当需要解析一个未知IP地址对应的MAC地址时,`etharp_query` 函数会被调用。此函数会检查ARP缓存表,如果没有找到匹配项,则生成一个ARP请求并发送出去[^3]。具体流程如下: - 调用 `etharp_request` 函数生成ARP请求报文。 - 在 `etharp_request` 内部,调用 `etharp_create_req` 函数填充ARP请求报文的字段。 - 最终通过设备驱动程序的 `linkoutput` 钩子函数发送ARP请求报文。 - **ARP 应答的生成**: 当接收到一个ARP请求时,如果目标IP地址是本机的IP地址,则会生成一个ARP应答报文[^1]。具体流程如下: - 接收数据包后,`etharp_input` 函数被调用来解析ARP报文。 - 如果发现请求的目标IP地址与本机IP地址匹配,则调用 `etharp_raw` 函数生成ARP应答报文。 - 在 `etharp_raw` 内部,设置操作码为2,并填充发送方目标的硬件及协议地址。 - 最终通过 `linkoutput` 钩子函数发送ARP应答报文。 ### 3. 示例代码 以下是一个简化的ARP请求应答生成的代码示例: ```c // ARP请求生成 void etharp_create_req(struct pbuf *p, struct netif *netif, const ip4_addr_t *dest_ip) { struct etharp_hdr *hdr = p->payload; memset(hdr, 0, sizeof(struct etharp_hdr)); hdr->hardware_type = htons(ARPHRD_ETHER); hdr->protocol_type = htons(ETH_P_IP); hdr->hardware_len = ETHARP_HWADDR_LEN; hdr->protocol_len = ETHARP_PROTO_LEN; hdr->opcode = htons(ARPOP_REQUEST); memcpy(hdr->sender_hwaddr, netif->hwaddr, ETHARP_HWADDR_LEN); ip4_addr_copy(hdr->sender_ipaddr, *netif_ip4_addr(netif)); ip4_addr_copy(hdr->target_ipaddr, *dest_ip); } // ARP应答生成 void etharp_create_reply(struct pbuf *p, struct netif *netif, const ip4_addr_t *src_ip, const uint8_t *src_hwaddr) { struct etharp_hdr *hdr = p->payload; memset(hdr, 0, sizeof(struct etharp_hdr)); hdr->hardware_type = htons(ARPHRD_ETHER); hdr->protocol_type = htons(ETH_P_IP); hdr->hardware_len = ETHARP_HWADDR_LEN; hdr->protocol_len = ETHARP_PROTO_LEN; hdr->opcode = htons(ARPOP_REPLY); memcpy(hdr->sender_hwaddr, netif->hwaddr, ETHARP_HWADDR_LEN); ip4_addr_copy(hdr->sender_ipaddr, *netif_ip4_addr(netif)); memcpy(hdr->target_hwaddr, src_hwaddr, ETHARP_HWADDR_LEN); ip4_addr_copy(hdr->target_ipaddr, *src_ip); } ``` ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值