一、协议模型

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之网络技术基础相关推荐

  1. 计算机与网络技术基础试题及答案,计算机与网络技术基础试题及答案(2003年10月)...

    计算机与网络技术基础试题及答案(2003年10月) 以下是部分内容预览,注意图片没有显示出来,WORD里是有的.请到下载区下载完整的试题及答案. 全国2003年10月高等教育自学考试 计算机与网络技术 ...

  2. 电大计算机网络技术基础,电大--2016年电大 计算机与网络技术基础小抄已排版.doc...

    电大--2016年电大 计算机与网络技术基础小抄已排版 (1) ISO--国际标准化组织(2) ITU--国际电信联盟(3) ANSI--美国国家标准协会(4) EIA--电子工业联盟(5) IEEE ...

  3. 交换与路由第一章 网络技术基础

    交换与路由第一章 网络技术基础 1.OSI参考模型(OSI/RM) 1.1 OSI参开模型分为5层,从下至上,每一层完成目标明确的不同的功能. 物理层: 规定了激活.维持和关闭通信端点之间的机械特性. ...

  4. 第一台电子计算机于1846年诞生,全国2010年1月高等教育自学考试计算机与网络技术基础试题.doc...

    全国2010年1月高等教育自学考试 计算机与网络技术基础试题 课程代码:00894一.单项选择题(本大题共20小题,每小题1分,共20分) 在每小题列出的四个备选项中只有一个是最符合题目要求的,请将其 ...

  5. 第二章网络网络技术基础计算题及其解析[计算机网络]

    总结一下计算机网络学期课程所学,方便以后的复习和补充.       本文主要是第二章网络技术基础计算题部分.需要掌握的知识点如下图.       需要手写记录的笔记pdf和课本pdf可私信. 文章目录 ...

  6. 网络技术——基础与5G

    网络技术--基础与5G 计算机网络的基础认识 1.协议 2. 标准 3. 5G技术的效率指标 指标说明 计算机网络的基础认识 1.协议 协议就是规则:网络之间相互通信的各种"规则" ...

  7. 网络技术入门(一):网络技术基础知识系统归结

    <网络技术入门>系列文章,分别从宏观硬件和微观数据传输角度说明网络传输过程.请期待后续系列文章. 自己写文章习惯性在每一个小节上做总结,有时候方便理解可以先看总结的内容. 本章主要是总结性 ...

  8. Cisco网络技术基础实训

    实验名称:Cisco网络技术基础实训 一. 实验需求(100分) 1.拓扑如下图所示,设备名称跟拓扑使用的端口号必须跟拓扑所示一致.(5分) 2.IP地址规划,如图所示(x-班级号,y-学号.比如17 ...

  9. 计算机网络san,SAN存储区域网络技术基础知识

    SAN存储区域网络技术基础知识 存储区域网络(SAN)是一种高速网络或子网络,提供在计算机与存储系统之间的数据传输.存储设备是指一张或多张用以存储计算机数据的磁盘设备.一个 SAN 网络由负责网络连接 ...

最新文章

  1. 作为公司新上任的管理者,如何更好的规划工作方案
  2. JS 正则匹配字符串
  3. 基于注解的IOC案例
  4. 11 个 Visual Studio 代码性能分析工具
  5. 【自动驾驶】15.一文读懂图像中点的坐标变换(刚体变换,相似变换,仿射变换,投影变换)
  6. 从 IPv4 到 IPv6,阿里踩过哪些坑?
  7. 1970“变种”bug连WiFi热点iOS设备会变砖?
  8. 数据结构思维 第十二章 `TreeMap`
  9. 三星Galaxy Note10前脸照曝光:下巴比iPhone还要窄
  10. gnuplot在windows下的安装和使用
  11. SVN创建,切换,合并,删除分支
  12. stc8a循迹小车程序编写实验:完成循迹功能,包括直角转弯,以及调头
  13. centos7下安装airflow
  14. JavaFX scene切换
  15. [PAT] PAT注意点
  16. 30天自制操作系统 第2天
  17. Mbps 和MB/s 之间的区别
  18. 体验最近火爆的ChatGPT,真的被震惊到了
  19. Android工具类blankj
  20. 删除一个字符串中指定位置上的字符

热门文章

  1. 软件设计师习题笔记-重点习题六
  2. 多路查找树之2-3树的删除原理
  3. Ubuntu 20.10安装docker
  4. 计算机直线的绘制实验报告,dda画直线实验报告
  5. 数据结构之外部排序:置换-选择排序
  6. Shodan新手入坑指南
  7. linux io阻塞问题
  8. c++ winpcap开发(9)
  9. 图像的通道(channels)问题
  10. LeetCode 680 验证回文字符串 Ⅱ