参考文献:
《TCP-IP详解卷一:协议》
《用TCP-IP进行网际互联第一卷:原理、协议与结构》
《LwIP协议深度剖析与实战演练》
《嵌入式Internet TCP IP基础、实现及应用》
TCP/IP协议族通俗综述
OSI结构仅仅停留在理论阶段,没有以实践作为依据,实现起来过去复杂,所以TCP/IP协议栈简化了。
从底层到顶层剖析TCP/IP协议栈
链路层
-
链路层说白了就是我们平时接触的网卡和网卡的驱动程序。存在的意义在于上层(比如网络层,传输层等等)不知道也不需要知道数据在物理上是如何传输的。就是它让上层可以不需要考虑数据物理传输的细节,更加专注于自己该做的事。就是TCP或者UDP程序可以在不修改的情况下移植到使用另外一种链路层的设备上面去。
-
链路层协议的功能就是将ip数据包封装成什么样的形式通过什么发送出去?网络接口层有不同的实现方式,比如可以通过有线或者无线方式,方式不同那么意味者不同的帧结构,发送速率。虽然这些形式不同,但是最终传送的肯定是上层协议帧,只有链路层可以剥离出上层协议帧就可以了,至于链路层通过什么方式发送出去,那就不重要了。
-
在TCP/IP协议族中,链路层主要有三个目的: (1)为IP模块发送和接收IP数据报;(2)为ARP模块发送 ARP请求和接收ARP应答;(3)为RARP发送RARP请求和接收RARP应答。
ARP-Address Resolution Protocol-地址解析协议
主机A仅仅知道主机B的IP地址,但是不知道物理地址。设计人员想到了一种策略。
主机A广播一个特殊分组,请求主机B相应。包括B在内的所有主机接收到此请求,但是只有B识别他的IP地址,然后发出一个包含其物理地址的应答。A收到应答后就可物理地址和IP地址进行发送分组了。
每一个需要RAP都提供一个ARP高速缓冲。
设备通过自己知道的IP地址来获得自己不知道的物理地址的协议。
- 当一台主机把以太网数据帧发送到位于同一局域网上的另一台主机时,是根据48bit的以太网地址来确定目的接口的。设备驱动程序从不检查IP数据报中的目的IP地址。地址解析为IP地址和数据链路层目的地址提供映射:32bit的IP地址和数据链路层使用的任何类型的地址。
- 在ARP背后有一个基本概念,那就是网络接口有一个硬件地址(一个48bit的值,标识不同的以太网或令牌环网络接口)。在硬件层次上进行的数据帧交换必须有正确的接口地址。但是, TCP/IP有自己的地址:32 bit的IP地址。知道主机的 IP地址并不能让内核发送一帧数据给主机。内核(如以太网驱动程序)必须知道目的端的硬件地址才能发送数据。 ARP的功能是在32bit的IP地址和采用不同网络技术的硬件地址之间提供动态映射。
- MAC(Media Access Control或者Medium Access Control)地址,意译为媒体访问控制,或称为物理地址、硬件地址,用来定义网络设备的位置,产品出产后Mac地址就固定了。又全球制造商统一分配。
- 以太网目的地址:目的MAC地址
- 以太网源地址:源的MAC地址
- 硬件类型:表示硬件地址类型,1表示以太网地址
- 协议类型:表示要映射的协议地址类型。0x0800表示映射IP地址。
- 硬件地址和协议地址长度:分别是6,4字节
- op:操作字段它们是ARP请求(值为1)、ARP应答(值为 2)、RARP请求(值为3)和RARP应答(值为4)。这个字段必需的,因为ARP请求和ARP应答的帧类型字段值是相同的。
- 发送端硬件地址(以太网目的地址MAC地址),发送端的协议地址(发送端IP地址),目的硬件地址(以太网目的地址MAC地址),目的的协议地址(目的IP地址)
- 对于ARP请求,除了目的的MAC地址外的其余都是填充值;当目的端收到ARP请求报文后,补全信息即可。
RARP-Reverse Address Resolution Protocol-逆向地址解析协议
RARP发出要反向解析的物理地址并希望返回其对应的IP地址。RARP基本淘汰,大多使用DHCP协议。
局域网在很久以前是无盘工作站的,无盘工作站是硬盘和操作系统分开的,这样由于主机上没有硬盘故不能保存IP地址信息,而MAC地址是永久存储在网卡中的,所以此时主机知道自己的MAC但不知道IP,但是要通信必须有IP地址啊,否则FTP/TFTP/SMTP等应用层协议都不能使用了,如果局域网管理员一台一台的给主机配置IP就太麻烦了,此时你可能会想到用DHCP啊,DHCP就是用于自动获取IP地址的,正确又不完全正确,正确是DHCP确实能解决这个问题,不正确是因为在很久以前DHCP是没有的(DHCP RFC文档 2131在1997年3月份才发布),那么这个问题该如何解决呢?答案就是今天探讨的RARP(RFC文档编号903,发布日期1984年6月份),通常情况下我们把RARP理解为把MAC地址映射为IP地址,如果你还套用ARP的解析流程和应用场景去分析RARP那就越想越不通了,这里说的把MAC地址映射为IP地址实际上无盘主机在开机后,网卡引导程序就不淡定了,它会通过广播的方式询问局域网所有主机,有谁知道我的IP地址啊?RARP服务器收到这个报文后就会告诉它你的IP地址是多少,这样无盘主机就有IP地址了,就可以使用FTP快乐的下载文件了,直到BOOTP的出现,什么?怎么不是DHCP,确实在1985年9月份BOOTP出现并取代了RARP协议,编号是RFC 951,然后就一直到1997年DHCP的出现。
至此我已经列出了三种可以分配IP地址的协议了,分别是RARP、BOOTP、DHCP,那这三种协议有什么区别呢?
- 1、RARP的实现是在数据链路层实现的,BOOTP和DHCP的实现是在UDP传输层实现的,这仅仅是表面上的区别,那优势呢,如果没有优势BOOTP就不会取代RARP了,我的理解是RARP工作在数据链路层就需要网卡去解析协议,而随着操作系统的发展,纯软件实现的网络协议内核比纯硬件网卡解析更加实惠,而BOOTP就是使用网络协议内核去解析的。
- 2、RARP服务器只能提供简单的地址分配,而且这些IP地址和MAC地址必须要提前在RARP服务器上配置好,而BOOTP和DHCP有更多复杂的功能,比如租约周期、地址池、网关和DNS服务器等,在这个年代你没有DNS只有IP也是不能上网的,除非你手动指定DNS服务器。另外BOOTP在获取到IP地址后客户端还会通过TFTP或者FTP协议去网络服务器上下载一个引导镜像文件。
- 3、DHCP是BOOTP的升级版本,增加了Option配置选项,而且DHCP可以分配之前已经分过的但当前没有使用的IP地址,提高了IP地址利用率。而BOOTP的IP地址和MAC地址的映射是事先配置好不能动态改变的。
允许计算机从服务器获得IP地址的协议。对于寻找自己的IP地址的机器和提供这一地址的服务器,他们之间的所有通信都只能使用物理网络实施。RAPR机制提供目标的物理硬件地址,唯一的标识处理器并广播RARP请求。网络上的服务器接收报文,在一个表中查找映射,并应答对方。一旦机器获得它的IP地址,就把地址存储在主存里,直到重启以前不再使用RARP。另外RARP还有两种替换方案BOOTP和DHCP。
网络层
IP(Internet Protocol)网际协议
常见的广域网路由器就工作在IP层。
1、互联网功能可以抽象为一个分组交付系统,将分组从一个地方交付到另外一个地方,实现主机之间的互联。IP是一种不可靠的无连接数据报协议,尽最大努力完成交付服务,但是不保证每一个分组可以正确到达。需要配合上层协议(如TCP)以保证可靠性。
2、网络层接收上层传输层数据分组,封装层IP数据报文,填入首部,使用路由算法来确定直接交付数据报,还是传递给路由器。也负责处理传入数据报,并检查有效性,然后判断该数据报是否给本机,否则路由算法将数据转发出去。如果是给主机,那么除去首部得到数据分组并传递给上层传输层解析。
IP地址的由来:假如PC机在同一个子网,数据报可以通过ARP发送出去。但是这样有一个缺陷,那就是当ARP以广播的方式发送数据包时候,需要确保所有设备都可以接受到该数据包,这样不仅仅传输效率低,而且局限在发送者所在子网。如果两台计算机不在同一个子网,广播传不出去,这种设计合理,否则互联网所有机器都会收到包,导致网络收到危害。
假如两个子网,需要找出一种方法区分哪些MAC地址属于同一个子网络,哪些不是的。如果同一个子网就选择广播方式,否则就采用路由方式发送。这个区分就是依靠的IP地址。它的作用就是引进一套新的地址,使得用户可以区分不同计算机是否属于同一个子网。这两个地址并没有任何联系都是唯一存在的。
- 4位版本
4-IPV4,6-IPV6 - 4位首部长度
最大数值15,单位是4字节。如1111就表示15*4=60字节所以首部最长60字节,普通IP该字段是5,如上图所示。 - 8位服务类型(TOS)
分别代表最小时延、最大吞吐量,最高可靠性和最小费用,路由器通过这些标识进行流量的优先排序。不同应用,TOS不同。
- 16位总长度(字节数)
整个IP数据包的长度,利用首部长度字段和总长度就知道IP数据报内容的起始位置和长度。理论上IP数据包总长度可以达到65535,但是实际底层链路不允许这个大数据包。以太网链路中规定MTU为1500,如比这个大,那么分组发送;最少也应是46字节,如比这个小,那么填充0以满足长度要求。 - 16位标识
标识字段唯一地标识主机发送的每一份数据报,在分片时候复制到每一片中。 - 3位标志
用一个比特来表示更多的片,除了最后一片外。 - 13位片偏移
该片偏移原始数据包开始处的位置,另外当数据报分片时候,没片总长度改为该片的长度值。 - 8位生存时间(TTL)
time-to-live
设置数据包可以经过的最多路由器数。通常位32或者64,一旦通过路由器处理,值减1,。该值为0时,数据报丢弃,并发送ICMP报文通知源主机。主要为了防止数据包不会在网络中无休止飘荡,可以看成是网络自动防范故障的一种机制。 - 8位协议
识别数据包序列中上层协议数据报类型,指明IP数据报的数据区域中数据的格式。
由于TCP、 UDP、 ICMP和IGMP都要向IP传送数据,因此IP必须在生成的IP首部中加入某种标识,以表明数据属于哪一层。为此,IP在首部中存入一个长度为8bit的数值,称作协议域。 1表示为ICMP协议, 2表示为IGMP协议, 6表示为TCP协议,17表示为UDP协议。根据这个字段识别哪个协议向IP传送数据。 - 16位首部校验和
仅仅针对IP首部,并不关心内部数据在传输过程是否出错,对于数据的校验由上层协议房负责,如ICMP、IGMP、TCP、UDP协议都会计算头部以及整个数据区的校验和。使用首部校验有一个优点,那就是在数据包转发过程中,每经过一个路由器,首部字段仅修改TTL,而数据包中的数据部没有改变,因此校验和仅仅针对首部,可以提高路由器处理分组的效率。
首先把检验和字段置为0。然后,对首部中每个16bit进行二进制反码求和(整个首部看成是由一串 16bit的字组成),结