当前位置:首页 > lwip中各种函数,标志位的总结
要是state, netif, ethaddr, cttime)
LWIP利用netif.input指向的函数接收以太网数据包,通常这个函数是ethernet_input。ethernet_input 根据以太网首部的类型字段判断收到的数据包的类型,如果是IP 包,则将该包递交给etharp_ip_input,如果是ARP包,则将该包递交给 etharp_arp_input并不是说ethernet_input 直接与底层硬件交互接收数据包,而是更底层的函数接收到数据包后将数据包递交给ethernet_input,ethernet_input再对其进行处理 ARP应答包,主要的工作就是更新arp表
etif.output指向的函数发送IP数据包,通常这个函数是etharp_output。注意,这里并不是说etharp_output直接与底层硬件交互发送数据包,而是将数据包做相应的处理,主要是将IP数据包打包成以太网帧数据,最终递交给netif.linkoutput函数来发送的。
IP层的输入
8位协议字段用来描述该IP 数据包是来自于上层的哪个协议,该值为1表示为ICMP协议,该值为2表示IGMP协议,该值为6表示TCP协议,该值为17表UDP协议
LWIP中是怎么样来描述这个IP数据报头的,使用的结构叫ip_hdr
从以太网底层进来的数据包经过ethernet_input函数分发给
IP模块或者ARP模块,分发给IP 模块是通过调用ip_input 函数完成的,当然在递交前,ethernet_input需要将数据包去掉以太网头
对IP 数据报头做校验,该工作是函数inet_chksum 完成的 ip_input 函数会遍历netif_list链表上的netif结构以找到匹配的IP地址,并记录该netif结构体变量,也即记录该网卡 这就是IP 分片数据包的重装,ip_input函数通过数据包的3位标志和13位片偏移字段判断发给自己的该IP包是不是分片包,如果是,则需要将该分片包暂存,等到接收完所有分片包后,统一将整个数据包递交给上层应用程序
ip_input函数根据IP数据包头内部的协议字段判断该数据包应该被递交给哪个上层协议,并调用相应的函数递交数据包。是UDP协议,则调用udp_input函数;是TCP协议,则调用 tcp_input 函数;是ICMP协议,则调用icmp_input 函数;是IGMP协议,则调用igmp_input函数;如果都不是,则调用函数icmp_dest_unreach 返回一个协议不可达ICMP 数据包给源主机,同时删除数据包。
TCP的建立与断开
源端口号和目的端口号,用于标识发送端和接收端的应用进程。这两个值加上IP 首部中的源IP地址和目的IP地址就能
唯一确定一个TCP连接。一个IP地址和一个端口号也称为一个插口(socket)
32位序号字段用来标识从TCP发送端到TCP接收端的数据字节流,用它来标识这个文段中的第一个数据字节的序号。当建立一个新的连接时,SYN标志置1,序号字段包?由这个发送主机选择的该连接上的初始序号ISN(Initial Sequence Number)。该主机要发送数据的第一个字节序号为ISN+1 32 位确认序号只有ACK标志为1时才有效,它包?发送确认的一端所期望收到的下一个序号。因此,确认序号应当是上次已成功收到数据字节序号加 1。当一个TCP连接被正确建立后,ACK字段总是被设置为1的。
在T C P首部中有6个标志比特。URG紧急指针(urgent pointer)有效标识;ACK确认序号有效标识;PSH 接收方应该尽快将这个报文段交给应用层;RST重建连接;SYN同步序号,用来发起一个连接;FIN 发端完成发送任务 最长报文大小,又称为 MSS PACK_STRUCT_BEGIN struct tcp_hdr {
PACK_STRUCT_FIELD(u16_t src); // 源端口 PACK_STRUCT_FIELD(u16_t dest); // 目的端口 PACK_STRUCT_FIELD(u32_t seqno); // 序号 PACK_STRUCT_FIELD(u32_t ackno); // 确认序号
PACK_STRUCT_FIELD(u16_t _hdrlen_rsvd_flags); // 首部长度+保留位+标志位
PACK_STRUCT_FIELD(u16_t wnd); // 窗口大小 PACK_STRUCT_FIELD(u16_t chksum); // 校验和 PACK_STRUCT_FIELD(u16_t urgp); // 紧急指针 } PACK_STRUCT_STRUCT; PACK_STRUCT_END
它首先打开某个端口,进入LISTEN状态以侦?客户端的连接请求。当服务器收到客户端的SYN连接请求,则进入SYN_REV状态,并向客户端返回一个ACK及自身的SYN包,此后,服务器等待客户端返回一个确认包,收到该ACK包后,服务器进入ESTABLISHED状态,并可以和服务器进行稳定的数据交换过程。
当服务器收到客户端发送的一个断开数据包FIN时,则进入CLOSE_WAIT状态,并向上层应用程序通告这个消息,同时向客户端返回一个ACK包,此时客户端到服务器方向的连接断开成功;此后,当服务器上层应用处理完毕相关信息后会向客户端发送一个FIN包,并进入LASK_ACK状态,等待客户端返回一个ACK包,当收到返回的ACK包后,此时服务器到客户端方向的连接断开成功,服务器端至此进入初始的CLOSED状态
TCP控制块
共分享92篇相关文档