LwIP之网络技术基础
一、协议模型
TCP/IP协议模型(Transmission Control Protocol/Internet Protocol),包含了一系列构成互联网基础的网络协议,是Internet的核心协议,通过20多年的发展已日渐成熟,并被广泛应用于局域网和广域网中,目前已成为事实上的国际标准。TCP/IP协议簇是一组不同层次上的多个协议的组合,通常被认为是一个四层协议系统,与OSI的七层模型相对应。
- 链路层
用来处理连接网络的硬件部分。包括控制操作系统、硬件的设备驱动、网卡,及光纤等物理可见部分。
- 网络层
用来规定通过怎样的路径把数据包传送给对方计算机。
- 传输层
主要为两台主机上的应用程序提供端到端的通信。
- 应用层
应用层负责处理特定的应用程序细节。
二、各层协议
各种协议在TCP/IP协议模型中所处的层次如下:
ARP:通过IP地址获取MAC地址。
RARP:通过MAC地址获取IP地址。
IP:尽快将数据包从一个主机传送到另一个主机,不保证可靠性。
ICMP:IP层用它来与其他主机或路由器交换错误报文和其他重要信息。
IGMP:Internet组管理协议,用来把UDP数据报多播到多个主机。
UDP:简单地将数据包从一个应用程序发送到另一个应用程序,不保证可靠性。
TCP:提供一个应用程序到另一个应用程序的可靠传输。
三、IP地址及分类
互联网中采用一套独立的编址技术,使任何主机的编址不受其物理环境的影响。设计人员为每一台主机分配了一个唯一的32bit整数地址,称之为IP地址。
目前IP地址采用了分类的概念,把所有地址划分为A、B、C、D、E五类。
其中,有一些特殊用途的IP地址
环回地址:127.x.x.x,通常使用127.0.0.1。
网络地址:主机号全0的地址,如85.0.0.0、134.89.0.0、213.89.89.0等。
直接广播地址:用于向所在网络广播消息。主机号全1的地址,如85.255.255.255、134.89.255.255、213.89.89.255等。
受限广播地址:255.255.255.255,用于向本地网络广播消息。
不确定IP地址:0.0.0.0,表示整个网络
错误地址:169.254.x.x,DHCP分配失败时系统自动分配。
本网络特定主机地址:网络号全0的地址,如0.x.x.x、0.0.x.x、0.0.0.x。
/* 不确定IP地址(表示本机所有网络接口IP地址)指针 */
#define IP_ADDR_ANY ((struct ip_addr *)&ip_addr_any)
/* 广播IP地址指针 */
#define IP_ADDR_BROADCAST ((struct ip_addr *)&ip_addr_broadcast)/* A类地址 */
#define IN_CLASSA(a) ((((u32_t)(a)) & 0x80000000UL) == 0) //是否为A类地址
#define IN_CLASSA_NET 0xff000000 //A类网络地址掩码
#define IN_CLASSA_NSHIFT 24 //A类网络地址偏移量
#define IN_CLASSA_HOST (0xffffffff & ~IN_CLASSA_NET) //A类主机地址掩码
#define IN_CLASSA_MAX 128 //A类网络地址最大数/* B类地址 */
#define IN_CLASSB(a) ((((u32_t)(a)) & 0xc0000000UL) == 0x80000000UL) //是否为B类地址
#define IN_CLASSB_NET 0xffff0000 //B类网络地址掩码
#define IN_CLASSB_NSHIFT 16 //B类网络地址偏移量
#define IN_CLASSB_HOST (0xffffffff & ~IN_CLASSB_NET) //B类主机地址掩码
#define IN_CLASSB_MAX 65536 //B类网络地址最大数/* C类地址 */
#define IN_CLASSC(a) ((((u32_t)(a)) & 0xe0000000UL) == 0xc0000000UL) //是否为C类地址
#define IN_CLASSC_NET 0xffffff00 //C类网络地址掩码
#define IN_CLASSC_NSHIFT 8 //C类网络地址偏移量
#define IN_CLASSC_HOST (0xffffffff & ~IN_CLASSC_NET) //C类主机地址掩码/* D类地址(组播) */
#define IN_CLASSD(a) (((u32_t)(a) & 0xf0000000UL) == 0xe0000000UL) //是否为D类地址
#define IN_CLASSD_NET 0xf0000000 //D类网络地址掩码
#define IN_CLASSD_NSHIFT 28 //D类网络地址偏移量(高4位1110)
#define IN_CLASSD_HOST 0x0fffffff //D类主机地址掩码
#define IN_MULTICAST(a) IN_CLASSD(a) //是否为组播地址/* 保留未用地址 */
#define IN_EXPERIMENTAL(a) (((u32_t)(a) & 0xf0000000UL) == 0xf0000000UL) //是否为保留未用地址
/* 广播地址 */
#define IN_BADCLASS(a) (((u32_t)(a) & 0xf0000000UL) == 0xf0000000UL) //是否为广播地址
四、子网划分与子网掩码
标准IP地址使用网络号和主机号两层地址结构,当大量个人用户和小型局域网用户接入互联网,即使为其分配一个C类网络也会造成IP地址的大量浪费。随着互联网用户的剧烈增长,IP地址的分配变得格外紧张,为每个物理网络分配一个网络号的做法变得很不现实。
因此,通过子网掩码的方式将网络进一步划分为多个子网,将原来的二级结构变为三级结构。如果按照下面的方式进行划分一个B类网络来,则可以在整个网络中划分出254个子网,每个子网可以有254台主机。这样做可以大大减少标准IP编址中地址浪费现象。
网掩和IP地址一样是一个32位数,其对应网络地址(包括网络号和子网号)的所有位置都为1,对应于主机地址的所有位置都为。按照上图这种方式划分一个B类网络时,子网掩码为255.255.255.0。
对于一个主机或者路由器,当接收到一个数据包时2。若要判断发送数据的源主机和自己是否在同一网络时,可以将源IP地址和子网掩码进行与运算,得到源主机网络地址,并同样的方式得到自己的网络地址,然后进行比较。
/* 判断网段是否相同 */
#define ip_addr_netcmp(addr1, addr2, mask) (((addr1)->addr & \(mask)->addr) == \((addr2)->addr & \(mask)->addr))
使用了子网掩码之后,各个子网也同样存在广播地址。下面这段代码用于判断IP地址是否为广播地址
/* 判断IP地址是不是广播地址 */
u8_t ip_addr_isbroadcast(struct ip_addr *addr, struct netif *netif)
{u32_t addr2test;addr2test = addr->addr;/* 全0或全1 */if ((~addr2test == IP_ADDR_ANY_VALUE) || (addr2test == IP_ADDR_ANY_VALUE))return 1;/* 网络接口不支持广播 */else if ((netif->flags & NETIF_FLAG_BROADCAST) == 0)return 0;/* 本机地址 */else if (addr2test == netif->ip_addr.addr)return 0;/* 子网广播 */else if (ip_addr_netcmp(addr, &(netif->ip_addr), &(netif->netmask)) && ((addr2test & ~netif->netmask.addr) == (IP_ADDR_BROADCAST_VALUE & ~netif->netmask.addr)))return 1;elsereturn 0;
}
五、NAT转换协议
随着互联网的发送,IP地址短缺现象越来越严重,即使是拥有几百台的大型企业,也很难申请到几个IP地址。为了解决这个问题,产生了局域网技术。对于局域网外部来说,所有主机公用一个合法IP地址。但是在局域网内部,用户使用专用IP进行相互通信。
NAT协议的功能简单来说:数据发送到外部时,将局域网内部主机的IP地址转换成一个外部公用的IP地址;数据从外部接收时,将外部公用的IP地址转换成局域网内部主机的IP地址。
NAT最常见的实现方式是端口多路复用,它基于TCP或UDP协议端口号以及IP地址来实现。
例如:某公司IP地址为222.178.197.21,局域网内部某主机IP地址为192.168.1.178,该主机正在使用TCP协议与某外部服务器进行通信,该外部主机IP地址为130.21.45.20。TCP双方,内部主机TCP端口号为1234,外部主机TCP端口号为80。
具有NAT功能的路由器会在内部维护一个NAT转换表,当路由器收到该分组时,会在表中为连接(192.168.1.78:1234,130.21.45.20:80)分配一个路由器内部的端口,假设为5678。数据发送到外部时,路由器会将数据包中的源IP和端口号,由192.168.1.78:1234改为222.178.197.21:5678;数据从外部接收时,路由器会将数据包中的目的IP和端口号,由222.178.197.21:5678改为192.168.1.78:1234。
这样经过两次NAT转换,局域网用户就实现了与外部网络的数据交互。
六、数据包格式
Ethernet II帧格式
前导码:由8个8‘b10101010构成。
以太网首部目的地址:目的设备的MAC物理地址。
源地址:发送设备的MAC物理地址。
类型:0x0800为IP协议包,0x0806为ARP协议包。
数据:数据长度最小为46字节,不足46字节时,填充至46字节。
FCS: 就是CRC校验值
其中,目的地址、源地址和类型,共同组成以太网首部
IP数据包和ARP数据包格式分别如下:
TCP数据帧封装过程举例:
LwIP之网络技术基础相关推荐
- 计算机与网络技术基础试题及答案,计算机与网络技术基础试题及答案(2003年10月)...
计算机与网络技术基础试题及答案(2003年10月) 以下是部分内容预览,注意图片没有显示出来,WORD里是有的.请到下载区下载完整的试题及答案. 全国2003年10月高等教育自学考试 计算机与网络技术 ...
- 电大计算机网络技术基础,电大--2016年电大 计算机与网络技术基础小抄已排版.doc...
电大--2016年电大 计算机与网络技术基础小抄已排版 (1) ISO--国际标准化组织(2) ITU--国际电信联盟(3) ANSI--美国国家标准协会(4) EIA--电子工业联盟(5) IEEE ...
- 交换与路由第一章 网络技术基础
交换与路由第一章 网络技术基础 1.OSI参考模型(OSI/RM) 1.1 OSI参开模型分为5层,从下至上,每一层完成目标明确的不同的功能. 物理层: 规定了激活.维持和关闭通信端点之间的机械特性. ...
- 第一台电子计算机于1846年诞生,全国2010年1月高等教育自学考试计算机与网络技术基础试题.doc...
全国2010年1月高等教育自学考试 计算机与网络技术基础试题 课程代码:00894一.单项选择题(本大题共20小题,每小题1分,共20分) 在每小题列出的四个备选项中只有一个是最符合题目要求的,请将其 ...
- 第二章网络网络技术基础计算题及其解析[计算机网络]
总结一下计算机网络学期课程所学,方便以后的复习和补充. 本文主要是第二章网络技术基础计算题部分.需要掌握的知识点如下图. 需要手写记录的笔记pdf和课本pdf可私信. 文章目录 ...
- 网络技术——基础与5G
网络技术--基础与5G 计算机网络的基础认识 1.协议 2. 标准 3. 5G技术的效率指标 指标说明 计算机网络的基础认识 1.协议 协议就是规则:网络之间相互通信的各种"规则" ...
- 网络技术入门(一):网络技术基础知识系统归结
<网络技术入门>系列文章,分别从宏观硬件和微观数据传输角度说明网络传输过程.请期待后续系列文章. 自己写文章习惯性在每一个小节上做总结,有时候方便理解可以先看总结的内容. 本章主要是总结性 ...
- Cisco网络技术基础实训
实验名称:Cisco网络技术基础实训 一. 实验需求(100分) 1.拓扑如下图所示,设备名称跟拓扑使用的端口号必须跟拓扑所示一致.(5分) 2.IP地址规划,如图所示(x-班级号,y-学号.比如17 ...
- 计算机网络san,SAN存储区域网络技术基础知识
SAN存储区域网络技术基础知识 存储区域网络(SAN)是一种高速网络或子网络,提供在计算机与存储系统之间的数据传输.存储设备是指一张或多张用以存储计算机数据的磁盘设备.一个 SAN 网络由负责网络连接 ...
最新文章
- 作为公司新上任的管理者,如何更好的规划工作方案
- JS 正则匹配字符串
- 基于注解的IOC案例
- 11 个 Visual Studio 代码性能分析工具
- 【自动驾驶】15.一文读懂图像中点的坐标变换(刚体变换,相似变换,仿射变换,投影变换)
- 从 IPv4 到 IPv6,阿里踩过哪些坑?
- 1970“变种”bug连WiFi热点iOS设备会变砖?
- 数据结构思维 第十二章 `TreeMap`
- 三星Galaxy Note10前脸照曝光:下巴比iPhone还要窄
- gnuplot在windows下的安装和使用
- SVN创建,切换,合并,删除分支
- stc8a循迹小车程序编写实验:完成循迹功能,包括直角转弯,以及调头
- centos7下安装airflow
- JavaFX scene切换
- [PAT] PAT注意点
- 30天自制操作系统 第2天
- Mbps 和MB/s 之间的区别
- 体验最近火爆的ChatGPT,真的被震惊到了
- Android工具类blankj
- 删除一个字符串中指定位置上的字符