嵌入式网络那些事:LwIP协议深度剖析与实战演练(阅读笔记) - 图文-_第1页
嵌入式网络那些事:LwIP协议深度剖析与实战演练(阅读笔记) - 图文-_第2页
嵌入式网络那些事:LwIP协议深度剖析与实战演练(阅读笔记) - 图文-_第3页
嵌入式网络那些事:LwIP协议深度剖析与实战演练(阅读笔记) - 图文-_第4页
嵌入式网络那些事:LwIP协议深度剖析与实战演练(阅读笔记) - 图文-_第5页
已阅读5页,还剩14页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、嵌入式网络那些事:LwIP协议深度剖析与实战演练(阅读笔记TCP/IP协议模型可以分为4层(从下到上:网络接口层(Network Interface Layer、网络层(Internet Layer、传输层(Transport Layer、应用层(Application Layer网络接口层:主要负责网络上数据帧的发送和接收。一方面将上层(网络层的数据组装成自己特定的数据帧并发送,另一方面接收网络中的发给自己的数据帧,并解析出帧中的数据后递交上层(网络层。网络层:主要负责主机之间的通信中选择数据报的传输路径,即路由。一方面,当网络层接收到来自于上层(传输层的数据分组后封装在IP数据报中,使用路

2、由器算法来确定是直接交付数据报还是传递给路由器。另一方面判断是否为给本机的数据报,是则去除首部后递交给上层(传输层,否则转发给路由器。传输层:主要提供应用程序之间的通信服务,即端到端通信。为保证提供可靠的传输服务,可采用协商、确认、重发等机制。应用层:利用传输层提供的数据传输功能发送字节的数据到对方。应用层DNS、DHCP、HTTP、SNMP、API、BSD Socket传输层TCP、UDP网络层IPv4、IPv6、ICMP、IGMP、ARP网络接口PPP、SLIP、以太网、回环接口层第五章【在无操作系统模拟层环境下移植LwIP】1.LwIP是TCP/IP协议一种独立、简单的实现。一般其运行需

3、要几十KB的RAM和40KB的ROM。2.使用的版本是1.ARP协议,以太网地址解析协议;IP协议,包括IPv4和IPv6,支持IP分片和重装,支持多网络接口下的数据包转发;ICMP协议,用于网络调试与维护IGMP协议,用于网络组管理,可以实现多播数据的接收;UDP协议,用户数据报协议;TCP协议,支持TCPTCP拥塞控制,RTT估计,快速恢复与重传等;提供三种用户编程接口方式:raw/callback API、sequential API、BSD-style socket API;DNS,域名解析;SNMP,简单网络管理协议;DHCP,动态主机配置协议;AUTOIP,IP地址自动配置;PPP

4、,点对点协议,支持PPPoE。3.以太网中数据帧格式:前两个字段由网卡在物理层上发送以太网数据时添加上去的前同步码SFD目的地址源地址长度/类型数据和填充CRC7字节1字节6字节6字节2字节46字节1500字节4字节目的地址分为:单播地址、多播地址、广播地址单播地址:第一个字节的bit0为0多播地址:第一个字节的bit0为1广播地址:48位全为1长度或类型字段:小于1518表示长度,大于1518表示上层协议类型,0x800表示IP数据包,0x806表示ARP数据包数据和填充字段:最小长度为46字节,最大长度为1500字节static void low_level_init(struct net

5、if *netifstatic err_t low_level_input(struct netif *netif,struct pbuf *pstatic struct pbuf *low_level_input(struct netif *netifstatic void ethernetif_input(struct netif *netiferr_t ethernetif_init(struct netif *netiflow_level_init为网卡初始化函数,它主要用来完成网卡复位及参数初始化,同时根据实际的网卡特性,还需设置协议栈网络接口管理结构netif中网卡属性相关字段,例

6、如网卡MAC地址长度等;low_level_output为网卡数据包发送函数,它将内核数据结构pbuf描述的数据包发送出去;low_level_input为网卡数据包接收函数,它将收到的数据封装成pbuf的形式;ethernetif_input主要作用是调用网卡数据包接收函数low_level_input从网卡处读取一个数据包,然后解析该数据包的类型(ARP包或IP 包,最后将该数据包递交给相应的上层。ethernetif_init是上层在管理网口接口结构体netif时会调用的函数。该函数主要完成netif结构中某些字段的初始化,并最终调用low_level_init完成网卡的初始化。第七章(

7、围绕LwIP的数据包pbuf管理机制进行讲解1.链路层判断收到的数据类型,提取数据包中的数据字段,记录主机物理地址信息;IP层根据数据包中的IP地址实现数据的存储,转发,根据数据包编号实现数据包的重装,提取数据包中关于传输层的信息,向上层递交数据包并记录递交结果;TCP使用数据包中的信息更新TCP状态机,并向应用程序递交数据。2.数据链路层完成IP数据包在物理线路传输时的封装、传递问题;网络层完成数据包选路和路由,负责将数据包从源主机发送到目标主机;传输层完成数据在两台主机间的端到端传递,IP地址只能唯一标识出一台主机,而端口号却可以标识出一台主机上的不同进程,传输层通过识别端口号来向不同的用

8、户应用程序递交数据。第九章(ARP协议1. ARP,全称 Address Resolution Protocol,地址解析协议。ARP层是将底层链路与协议上层连接起来的纽带,是以太网通信中不可或缺的协议。2.为了解决地址映射的问题,ARP协议提供了一种地址动态解析的机制,ARP的功能是在32bit的IP地址和采用不同网络技术ude硬件地址之间提供动态映射,为上层将底层的物理地址差异屏蔽起来,这样上层的因特网协议便可以灵活的使用IP地址进行通信。3.在以太网中,ARP数据包和IP数据包是两个独立的组织结构。ARP数据包种类有两种:一是ARP请求包,它是通过以太网广播的方式发送的,用于向具有某个I

9、P地址的主机发送请求,希望该主机返回其MAC地址;二是ARP应答包,收到ARP请求的主机会比对该数据包中的IP地址与自己的IP地址相符合,若是,则返回一个ARP应答包,向源主机报告自己的MAC地址。源主机通过提取ARP应答包中的相关字段来更新ARP缓存表。4.ARP表项中 stable状态超时时间为20分钟,而pending状态的超时时间为10秒钟。5.ARP包是被封装在以太网帧中发送的,下面为ARP报文组织结构:以太网目的地址以太网源地址帧类型硬件类型协议类型硬件地址长度协议地址长度OP发送方以太网地址发送方IP地址接收方以太网地址接收方IP地址6(字节62221126464以太网首部28字

10、节ARP数据包6.以太网头部中的前两个字段是以太网的目的MAC地址和源MAC地址,目的地址为全1的特殊地址是以太网广播地址。7.以太网帧类型,对于ARP包来说,为0x0806,对于IP数据包来说,为0x0800,对于PPPoE数据包来说,为0x8864。在网络数据中的数据发送都是采用的大端方式,例如IP包的帧类型,先发0x08,后发0x00。8.硬件地址长度和协议地址长度,对于以太网上ARP请求或应答来说,它们的值分别有6和4,代表MAC地址的长度和IP地址的长度。9.操作字段OP指出ARP数据包的类型,ARP请求(值为1,ARP应答(值为2,RARP请求(值为3,RARP应答(值为4。RAR

11、P为逆地址解析协议10.ARP和IP是两个相互独立的协议,它们都属于网络层上的协议,从分层结构上看,ARP应该处于更底层。ARP和IP都依赖于以太网帧来传输自身的协议数据包。 第十章(网际协议【IP】1.IP是整个TCP/IP协议的核心,传输层协议,如UDP和TCP都需要IP提供的服务,而像ICMP和IGMP等网络层协议也基于IP来传送协议数据。常见的广域网路由器就工作在IP层,它们负责将IP数据报从源主机送至目的主机,主机间的区分是通过IP地址来实现的。2.IP协议是一种不可靠的无连接数据报协议。网络字节序第一字节第二字节第三字节第四字节A 类0网络号主机号B 类10网络号主机号C 类110

12、网络号主机号D 类1110多播地址E 类1111保留未用类别类标识第一字节取值范围网络地址长度主机地址长度最大可用网络号个数网络最大主机数适用范围B 类101281912字节2字节1636865534中型网络C 类1101922233字节1字节2096896254小型网络D 类1110224239-组播地址E 类1111240255-保留PACK_STRUCT_BEGIN /!<禁止编译器自对齐PACK_STRUCT_END IP层输入实现的功能:1.字段的校验2.地址的比较(转发还是接收3.数据报分片重组4.将数据递交至上层协议IP层输出实现的功能:1.填充数据报首部2.选择数据报的发

13、送路径3.对数据报进行分片处理4.发送数据报IP数据包组成: 1.版本号:IP协议的版本信息2.首部长度:对于不含选项字段的IP首部,长度值为5(5*4 = 20字节3.服务类型(Type Of Service:路由器在转发过程中,根据服务类型选择最合理的路由路径。4.总长度:整个IP数据报(IP首部和数据区的总字节数5.标识:每发送一份报文该值加1,分片时,该字段会被复制到每一个分片中。接收端会使用该字段组装分片,生成一个完整的数据报。6.标志:第一位保留,第二位不分片位,为1时,该数据报在发送和转发的过程中不能被分片,若物理层无法实现则丢弃,为0,则可分片;第三位更多分片位,为1表示不是最

14、后一个分片,为0表示最后一个分片或为唯一分片。7.偏移字段:表示当前分频所携带的数据在整个数据报中的相对位置(以8字节为单位。8.生存时间(TTL:该IP数据报最多被转发的次数,没经过一次转发,该值减1,当该值为0时,路由器会丢掉分组,同时一个ICMP差错报文会被返回至源主机。9:协议:用来描述IP数据报中的数据所属的上层协议类型,1为ICMP协议,2为IGMP协议,6为TCP协议,17为UDP协议。10.首部校验和:只针对IP首部做校验,内部数据由上层协议负责校验。第十一章(网际控制报文协议【ICMP】1.ICMP协议用于在IP主机、路由器之间传递控制消息,例如数据报错误信息、网络状况信息、

15、主机状况信息等,用于提高数据报递交的有效性。2.ICMP报文分为两大类:ICMP差错报告和ICMP查询报文ICMP报文分类:ICMP 报文种类具体类型报文功能差错报告报文3目的站不可达4源站抑制5重定向(改变路由11数据报超时12数据报参数错误查询报文8或0回送请求或回答10或9路由器询问和通告13或14时间戳请求或回答15或16信息请求或回答17或18地址掩码请求或回答 第十二章(用户数据报协议【UDP】1.典型的传输层协议有UDP协议和TCP协议。2.UDP协议是实现多种上层应用协议的基础,例如DNS、DHCP、IGMP、SNMP等。3.IP协议使用IP地址来标识不同的主机,而UDP协议则

16、使用端口号来标识主机上的不同进程。UDP熟知端口号及其作用:熟知端口协议说明0-保留7echo报文回送服务器端口53nameserver域名服务器(DNS端口67bootps BOOT或DHCP服务器端口68bootpc BOOT或DHCP客户端口69TFTP简单文件传送协议端口123NTP网络时间协议161SNMP简单网络管理协议端口 校验和计算的范围包括伪首部和Udp首部。UDP控制块的操作函数1.struct udp_pcb *udp_new(void申请UDP控制块内存,初始化TTL字段。2.err_t udp_bind(struct udp_pcb *pcb,struct ip_ad

17、dr *ipaddr,u16_t port设置控制块的local_port和local_ip字段,并将控制块加入链表udp_pcbs中。3.err_t udp_connect(struct udp_pcb *pcb,struct ip_addr *ipaddr,u16_t port设置远程ip和远程端口,将控制块状态设置为连接状态。4.void udp_disconnect(struct udp_pcb *pcb清除远程ip和远程端口,将控制块状态设置为非连接状态。5.void udp_recv(struct udp_pcb *pcb,void (*recv(void *arg,struct

18、udp_pcb *upcb,struct pbuf *p,struct ip_addr *addr,u16_t port, void *recv_arg为控制块注册回调函数。6.void udp_remove(struct udp_pcb *pcb将控制块从链表中删除,并释放内存空间。第十三章(传输控制协议【TCP】) 1.很多上层应用协议都是基于TCP实现的,例如WWW、TELNET、SMTP、FTP等。 TCP使用的熟知端口号: 熟知端口 协议 说明 保留 报文回送服务器端口 文件传送协议(数据) 文件传送协议 终端连接 简单邮件传送协议 域名服务器 万维网服务器 邮局协议版本3 代理服务

19、器协议 0 7 20 21 23 25 53 80 110 1080 echo FTP-DATA FTP TELNET SMTP DNS HTTP POP3 SOCKS DNS同时占用UDP和TCP的53端口。 1.连接的定义:一条连接包含两个有效端点。(端点是一对整数,标识为(IP地址,端口号) 2.数据流编号:TCP把一个连接中的所有数据字节都进行了编号。 3.滑动窗口:所有数据流按照顺序被组织在发送缓存中,滑动窗口决定发送数据的时间及发送多少,以达到流量控制效果和拥塞控制效 果。 TCP报文结构 1.序号:当前报文段中的第一个数据的字节序号。 2.TCP首部中的标志位 标志位 该位置1后

20、的意义 首部中的紧急指针字段有效 首部中的确认序号字段有效 尽快将这个报文交给应用层(推送数据 连接复位 发送连接,同步序号 终止连接 URG ACK PSH RST SYN FIN TCP选项 最大报文段长度选项格式: 代码:2 (1字节 长度:4 (1字节 最大报文段长度 (2字节 窗口扩大因子选项格式: 代码:3 (1字节 长度:3 (1字节 扩大因子 建立连接 三次握手的过程: 【第一次握手客户端告诉服务器端自己的初始序号等,第二次握手服务器端告诉客户端自己的初始序号及窗口大小,第三次客户端告诉服 务器端自己的窗口大小。】 客户端发送一个SYN标志位置1的TCP报文段,报文段首部指明自

21、己的端口号及期望连接的服务器端口号,同时需要通告自己的初始序号 ISN,另外报文段中还可以携带一些选项字段,注意本段中的ACK标志位为0,故它的确认号字段和窗口大小字段是无效的。 服务器端接收到报文后,返回一个SYN和ACK标志位置1的报文段作为应答。ACK置1表示确认序号有效,此时的确认序号为客户端初始 序号+1。回应报文中包含自身的初始序号ISN,以及自己的接收窗口大小,同时还可以加上选项字段。 当客户端接收到服务器的SYN应答报文之后,返回ACK置位的报文段,确认序号为服务器初始序号+1,同时向服务器指明客户端的接收 窗口大小。 当服务器接收到第三次握手中的ACK之后,服务器与客户端之间

22、的连接就建立起来了,它们双方都获得了彼此的窗口大小、初始序号、最 大报文等。 断开连接 四次握手的过程: 客户端向服务器发送一个FIN标志位置1的报文段,用来关闭从客户端至服务器端的数据传送,序号为C。 当服务器收到FIN之后,返回ACK报文,确认序号为C+1。 服务器想客户端发送一个FIN标志位置1的报文段,用来关闭从服务器端至客户端的数据传送,序号为D。 客户端会返回一个ACK报文段(D+1。 TCP控制块中的函数指针,用户在初始化的时候注册这些函数,用于回调: err_t (*sent(void *arg,struct tcp_pcb *pcb,u16_t space; /!<当数

23、据被成功发送后被调用 err_t (*recv(void *arg,struct tcp_pcb *pcb,struct pbuf *p,err_t err; /!<接收到数据之后被调用 err_t (*connected(void *arg,struct tcp_pcb *pcb,err_t err; /!<连接建立后被调用 err_t (*poll(void *arg,struct tcp_pcb *pcb; /!<被内核周期性调用 err_t (*errf(void *arg,err_t err; /!<连接发生错误时调用 TCP控制块链表 struct tcp_

24、pcb *tcp_bound_pcbs; /!<只进行过端口号绑定的TCP控制块,此时的控制块可认为处于closed状态。 union tcp_listen_pcbs_t tcp_listen_pcbs; /!<所有进入侦听状态的控制块 struct tcp_pcb *tcp_active_pcbs; /!<所有处于其他状态的控制块 struct tcp_pcb *tcp_tw_pcbs; /!<所有处于TIME_WAIT状态的控制块 接收窗口 rcv_nxt:表示自己期望收到的下一个数据字节编号 rcv_wnd:表示接收窗口的大小 rcv_ann_wnd:表示将向对方

25、通告的窗口值大小 rcv_ann_right_edge:记录了上一次窗口通告时窗口右边界取值 发送窗口 lastack:被接收放确认的最高序列号 snd_nxt:表示自己将要发送的下一个数据的起始编号 snd_wnd:记录了当前的发送窗口大小,它常被置为接收方通告的接收窗口值 snd_lbb:记录了下一个将被应用程序缓存的数据的起始编号 有这样一种情况: 发送窗口中已发送了部分数据,但剩下的数据由于太小不能组成一个有效报文段,因此不能被发送,发送发需要等待新的确认的到来,从 而使发送窗口向右滑动,使更多的数据被包含在窗口中,这样再启动下一个报文段的发送。 控制块新建 struct tcp_pc

26、b *tcp_alloc(u8_t prio; 控制块绑定操作 新建完成之后需要绑定,tcp_bind的参数是一个端点(IP地址和端口号,绑定的前提是这个端点没有被使用,所以需要遍历各个控制块链 表(有四个)。 控制块侦听 struct tcp_pcb *tcp_listen_with_backlog(struct tcp_pcb *pcb,u8_t backlog /!<将某个绑定的控制块置为侦听状态 tcp_listen就是将相应的控制块设置为LISTEN状态。 进入LISTEN状态后,服务器就等待客户端发送来的SYN报文进行连接,收到之后会遍历tcp_listen_pcbs链表。找到匹配IP地址和端口号的 控制块之后,新建tcp_pcb结构,将tcp_listen_pcb结构中的各字段拷贝至其中,然后添加入tcp_active_pcb中。 注意:tc

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论