LwIP Application Developers Manual3---链路层和网络层协议之ARP,IPV4
1.前言
本文主要讲述链路层和网络层的几种协议:ARP,ipv4
2. ARP
2.1 ARP的主要应用
ARP的主要应用是在与互联网相连的以太网网络层,该层需要一些机制将MAC地址(该地址主要由制造商分发并固定在硬件里)转换成IP地址(该地址主要取决于设备接入的网络)
2.2 从应用的角度来看待ARP
一个支持ARP的网络接口会使 etharp_output 处理所有即将发送的数据包并设置与它相关的netif结构体里面的一个标志来使能“无理由(gratuitous)ARP”(“Writing a device driver”有关于这个的实现)。
一个近期的IP地址和它相关的硬件地址表将被维护。如果有一个即将发送的数据包并没有与之相匹配的硬件地址,那么程序将会执行一次ARP查询来发现其相关的地址。
应用程序员不要直接调用此协议,因为如果程序正常工作,此协议相当于透明的。有一些标志可决定ARP表的大小、以及数据包如何在一个挂起的ARP查询后排队和ARP code是否要需从传入的数据包中绑定MAC-IP地址。
这些标志可以在lwipopts.h选项文件里设置。
2.3 lwIP支持ARP的历史记录
新的标志 LWIP_ARP,各种优化,更好的ARP排队
1.2.0稳定
2.4 外部参考
- Wikipedia: ARP
- WireShark: Address Resolution Protocol
- RFC 826 - An Ethernet Address Resolution Protocol
- RFC 903 - A Reverse Address Resolution Protocol
- RFC 2390 - Inverse Address Resolution Protocol
3. IPv4
3.1 IPv4特性
IPv4(Internet Protocol version 4)是现在最广泛使用的网络协议。它有如下特性:
- 尽最大努力的交付(best effort delivery)。
网络设备尽最大的努力让数据包到达目的地,然而并没有延迟或可靠性的保证,只有这样中间节点才会尽他们最大的努力(do their “best”)
- 没有保证的交付(传送)或重传
目的主机并不会告知发送主机它已经接收到数据包。
- 数据包到达的次序与发送的次序并不都相同
一旦数据包进入到网路,它们可能会按不同的路由来发送。没有方法能协调数据包按特定的序列到达目的地。
- 主机可能会接受到重复的数据包
3.2 从应用的角度来看待IPv4
3.2.1 管理地址
IPv4的地址长度是32位比特,且该地址用点十进制计数来表示,如127.0.0.1。
在lwIP的内部,IP地址主要保存在结构体变量ip_addr中。结构体struct ip_addr保存着一个32位的无符号字(其结构如下所示struct ip_addr { u32_t addr;};)。
因此,为了设置一个IP地址,可以参考如下代码:
#include <lwip/ip_addr.h>
struct ip_addr local;
IP4_ADDR(&local,127,0,0,1); // Set local ="127.0.0.1"
3.2.2 作用于struct ip_addr变量的函数或值
一些其它有用的函数和值作用于struct ip_addr变量,如下列表所示:
- IP_ADDR_ANY--任何IP地址。
举例,如果你想要监听一个TCP端口,该端口并没有绑定到一个特定的地址。
- ip_addr_set(dest,src)-复制地址
- ip_addr_cmp(addr1,addr2)-比较两个地址是否相等
- ip_addr1(ipaddr)-IP地址的第一个字节(比如,182.178.3.5->182)
- ip_addr2(ipaddr)-IP地址的第二个字节(比如,182.178.3.5->178).
- ip_addr3(ipaddr)-IP地址的第三个字节。
- ip_addr4(ipaddr)-IP地址的第四个字节
3.2.3 主机 vs 网络字节顺序
由于小端和大端结构的差异,你一定要清楚结构体里面值的字节顺序(详细请看 Wikipedia:Endianness for explanation)。
网络字节顺序是大端的。你的主机平台的字节顺序也可以是大端模式的,这样从技术上来说你的代码就不需要其它考虑(如转换)。
然而,如果你编译你的代码是在小端模式的处理器上运行(如,Inter,AMDs,ARM,等等),那么你的程序将会出现莫名其妙的行为,难以调试和检测。
因此,一些主机转网络字节顺序的转换函数将会起到作用,如下所示:
- netval=htonl(hostval)-将32位的主机数据转换成网络数据。
- netval=htons(hostval)-将16位的主机数据转换成网络数据。
- hostval=ntohl(netval)-将32位的网络数据转换成主机数据。
- hostval=ntohs(netval)-将16位的网络数据转换成主机数据
lwIP处理大部分内部Internet协议结构体字节顺序的转换。当你手动设置或比较IP地址或者你为了将数据发送到另一个系统而将数据序列化时,你只要知道字节顺序的区别。
如果你的目的平台与你的平台字节顺序有区别,那么你一定要按照标准进行转换,这样你的16位数据就能和他的16位数据匹配了。
根据IP地址的一般经验来说,“ip_addr->addr是网络字节顺序的,而u32_t someip是主机字节顺序的。”。比如:
- IN_CLASS 宏检测IP地址是否是A类,该宏操作在32位的主机字节顺序上。
- IP_ADDR_ANY宏是一个结构体struct ip_addr,而且它的IP地址按网络字节顺序存储的。实际上该宏是指向一个IP地址为0.0.0.0的指针。
- ip_addr_cmp宏比较2个IP地址的区别,由于比较的网络地址保存在结构体struct ip_addr中,因此该地址也是网络字节顺序的。
举例:一个无效的地址比较如下所示:

struct ip_addr ip, otherip;
ip.addr = 0x7f000001; /* BAD: 127.0.0.1 on big-endian, 1.0.0.127 on little-endian */
IP4_ADDR(&ip,127,0,0,1); /* GOOD: works anywhere */
ip_addr_set(&otherip,&ip); /* GOOD: network-order assigned to network-order */
otherip.addr = ip.addr; /* BAD: Works, but better to use the macro (it checks for NULL) */
if (ip.addr == 0x7f000001) { .... /* BAD: true on big-endian, false on little-endian! */ ... }
if (ip.addr == 0x0100007f) { .... /* BAD: true on little-endian, false on big-endian! */ ... }
if (ntohl(ip.addr) == 0x7f000001) { .... /* GOOD: Works anywhere */ ... }
if (ip_addr_cmp(&ip,&otherip)) { .... /* GOOD: Works anywhere */ ... }

3.2.4 分配地址给各接口
一个网络接口只能有一个IP地址。lwIP有3种方法分配合适的IP地址给接口:
静态IP
netif的IP地址可以被设置在初始化的时候(通过netif_add或者netif_set_addr或者netif_set_ipaddr。详细请看Network interfaces management)
DHCP
DHCP是一个可选的协议从一个DHCP服务器来获得IP地址。详细请看DHCP。
AUTOIP
AUTOIP也是一个可选的协议,该协议可以从本地局域网中选取一个IP地址而不用通过服务器。详细请看AUTOIP。
3.2.5 分段和重组
3.2.6 lwIP IPV4支持历史
1.2.0版本稳定
3.2.7 外部参考链接
- Wikipedia: Internet Protocol
- Wikipedia: IPv4
- WireShark: IPv4
- RFC 760 (obsolete) - Internet protocol
- RFC 791 (repleaces 760) - Internet protocol
- RFC 3344 - IP Mobility Support for IPv4
- http://www.networksorcery.com/enp/protocol/ip.htm - The IP header
4.参考文献
[1]http://lwip.wikia.com/wiki/Introduction_to_lwIP
[2]lwIP应用开发手册中文翻译
LwIP Application Developers Manual3---链路层和网络层协议之ARP,IPV4的更多相关文章
- LwIP Application Developers Manual3---链路层和网络层协议之IPV6,ICMP,IGMP
1.前言 本文主要讲述链路层和网络层的协议IPV6,ICMP 2.IPV6 2.1 IPV6特性 IPv6是IPv4的更新.其最显著的差别在于地址空间由32位转换成128位 2.2 从应用的角度看IP ...
- LwIP Application Developers Manual4---传输层之UDP、TCP
1.前言 本文主要讲解传输层协议UDP TCP 2.UDP 2.1 UDP from an application perspective 2.2 UDP support history in lwI ...
- LwIP Application Developers Manual2---Protocols概览
1.前言 本文是对LwIP Application Developers Manual的翻译 lwIP是模块化的并支持广泛的协议,这些大部分协议可以被裁减从而减小代码的尺寸 2.协议概览 链路层和网络 ...
- LwIP Application Developers Manual1---介绍
1.前言 本文主要是对LwIP Application Developers Manual的翻译 2.读者(应用开发手册的读者) 谁适合读这份手册 网络应用的开发者 想了解lwIP的网络应用开发者 阅 ...
- 在计算机通信中,可靠交付应当由谁来负责?是网络还是端系统? 网络层协议 MAC帧、IP数据报、TCP报文 关系 IP地址与硬件地址 链路层与网络层
小结: 1. 网络层两种服务 虚电路服务 virtual circuit 电信网 网络层负责可靠交付 数据报服务 网络层不负责可靠交付 提供灵活的.无连接的.尽最大努力交付的数据报服务 不提供服务 ...
- TCP\IP协议实践:wireshark抓包分析之链路层与网络层
目录 TCP\IP协议实践:wireshark抓包分析之链路层与网络层 从ping开始 链路层之以太网封装 ip首部 开启ping程序,开始抓包 由一个ping的结果引出来的两个协议ARP ICMP ...
- LwIP Application Developers Manual6---Application API layers
1.前言 lwIP提供3种应用编程接口来跟TCP/IP内核通信,如下所示: 低水平的内核/回调或raw API 2个高水平序列API: 1) netconn API 2) socket API(为了兼 ...
- LwIP Application Developers Manual7---lwIP with or without an operating system
1.前言 最近有一些讨论关于lwIP如何在单机的环境(比如,没有一个多线程的操作系统)使用. 本文的目的就是描述lwIP如何在无多线程操作系统或有多线程操作系统环境中运行 2.lwIP单线程内核 2. ...
- LwIP Application Developers Manual12---Configuring lwIP
1.前言 2.LwIP makefiles With minimal features C_SOURCES = \ src/api/err.c \ src/core/init.c \ src/core ...
随机推荐
- Java运算符和引用数据类型(Scanner、Random)
运算符 算术运算符: 运算符 运算规则 范例 结果 + 正号 +3 3 + 加 2+3 5 + 连接字符串 “中”+“国” “中国” - 负号 int a=3;-a -3 - 减 3-1 2 * 乘 ...
- python中执行shell命令的几个方法小结
原文 http://www.jb51.net/article/55327.htm 最近有个需求就是页面上执行shell命令,第一想到的就是os.system, os.system('cat /proc ...
- 1411 - Ants(巨人与鬼)
参考博客 紫薯P230 题意:给出平面上n个白点n个黑点,要求两两配对,且配对所连线段没有交点. 紫薯思路:找出y坐标最小的点,如果多个,考虑x最小的.将其他点相对于这个点按极角从小到大排序,然后开始 ...
- 全局拦截各种http请求
http请求无非就是ajax.src.href.表单 function hookAJAX() { XMLHttpRequest.prototype.nativeOpen = XMLHttpReques ...
- 【转】第8章 前摄器(Proactor):用于为异步事件多路分离和分派处理器的对象行为模式
目录: Reactor(反应堆)和Proactor(前摄器) <I/O模型之三:两种高性能 I/O 设计模式 Reactor 和 Proactor> <[转]第8章 前摄器(Proa ...
- VMware Workstation Pro 14 虚拟机安装教程
准备学习一下linxus,可不想双系统,那么只有虚拟机这条路了.故在此记录一下安装VMware的过程. 一.下载VMware 我用的是VMware Workstation Pro 14(其他版本也可以 ...
- spingBoot整合mybatis+generator+pageHelper
spingBoot整合mybatis+generator+pageHelper 环境/版本一览: 开发工具:Intellij IDEA 2018.1.4 springboot: 2.0.4.RELEA ...
- 使用Calender类获取系统时间和时间和运算
使用Calender类获取系统时间和时间和运算: @Test public void testCal(){ //使用Calender对象获取时间,并对时间进行计算: Calendar instance ...
- plsql developer 11 + Oracle 11g 开发环境setup
这是一个很水的博客, 介绍搭建plsql developer 11+ Oracle 11g 开发环境. 1. 本机上安装Oracle 11g express 对于开发足够了, 300MB的下载文件, ...
- Ubuntu Server Download
点击查看所有版本(中国站点) http://mirror.lzu.edu.cn/ubuntu-releases/