有关计算机网络的更多细节
(会持续更新, 当掌握到更多的链路层的相关知识时会继续补充)
链路层
在T C P / I P协议族中,链路层主要有三个目的:
- 为IP模块发送和接收IP数据报;
- 为A R P模块发送A R P请求和接收ARP应答;
- 为R A R P发送R A R P请求和接收RARP应答。
TCP/IP支持多种不同的链路层协议,这取决于网络所使用的硬件,如以太网、令牌环网、F D D I(光纤分布式数据接口)及 R S-2 3 2串行线路等
此文讨论以下3个内容:
- 以太网链路层协议
- 两个个串行接口链路层协议(SLIP和PPP)
- 大多数实现都包含的环回(loopback)驱动程序
以太网
以太网采用一种称作CSMA/CD的媒体接入方法
在T C P / I P世界中,以太网I P数据报的封装是在RFC 894[Hornig 1984]中定义的, 而在IEEE 802
网络的I P数据报封装是在RFC 1042[Postel and Reynolds 1988] , 最常使用的封装格式是 RFC 894定义的格式
IEEE 802.2/802.3(RFC 1042)和以太网的封装格式(RFC 894)
幸运的是, 8 0 2定义的有效长度值与以太网的有效类型值无一相同,这样,就可以对两种帧格式进行区分
在以太网帧格式中,类型字段之后就是数据;而在 8 0 2帧格式中,跟随在后面的是 3字节的802.2 LLC和5字节的802.2 SNAP。 DSAP和SSAP的值都设置为0xaa
尾部封装
RFC 893[Leffler and Karels 1984]描述了另一种用于以太网的封装格式,称作尾部封装(trailer encapsulation)。这是一个早期B S D系统在DEC VA X机上运行时的试验格式,
它通过调整I P数据报中字段的次序来提高性能, 现在,尾部封装已遭到反对,因此我们不对它举任何例子。
SLIP:串行线路IP
SLIP的全称是Serial Line IP。它是一种在串行线路上对 I P数据报进行封装的简单形式,在
RFC 1055[Romkey 1988]中有详细描述。
一种在串行线路上对IP数据包进行封装的简单形式
SLIP一般提供基于服务类型的排队方法. 允许对交互通信数据在处理大块数据之前进行处理。由于大多数的实现都不使用 TO S字段,因此这种排队机制由S L I P自己来判断和处理,驱动程序先查看协议字段(确定是否是一个 T C P段),然后检查T C P信源和信宿的端口号,以判断是否是一个交互服务。
S L I P是一种简单的帧封装方法,还有一些值得一提的缺陷
- 每一端必须知道对方的I P地址。没有办法把本端的I P地址通知给另一端。
- 数据帧中没有类型字段(类似于以太网中的类型字段)。如果一条串行线路用于 S L I P,
那么它不能同时使用其他协议 - S L I P没有在数据帧中加上检验和(类似于以太网中的 C R C字段)。
尽管存在这些缺点,S L I P仍然是一种广泛使用的协议
PPP 协议
PPP点对点协议修改了SLIP协议中的所有缺陷。PPP包括以下三个部分
- 在串行链路上封装 I P数据报的方法。 P P P既支持数据为 8位和无奇偶检验的异步模式(如大多数计算机上都普遍存在的串行接口),还支持面向比特的同步链接。
- 建立、配置及测试数据链路的链路控制协议( L C P:Link Control Protocol)。它允许通信双方进行协商,以确定不同的选项。
3.针对不同网络层协议的网络控制协议(NCP:Network Control Protocol)体系。当前RFC定义的网络层有IP、OSI网络层、DECnet以及AppleTalk。例如,IPNCP允许双方商定是否对报文首部进行压缩,类似于CSLIP(缩写词NCP也可用在TCP的前面)。
尽管P P P比S L I P有更多的优点,但是现在的S L I P用户仍然比P P P用户多。随着产品越来越多,产家也开始逐渐支持PPP,因此最终PPP应该取代SLIP
环回接口(Loopback Interface)
A类网络号127就是为环回接口预留的。根据惯例,大多数系统把IP地址127.0.0.1分配给这个接口,并命名为localhost。一个传给环回接口的IP数据报不能在任何网络上出现, 一旦传输层检测到目的端地址是环回地址时,应该可以省略部分传输层和所有网络层的逻辑操作
但是大多数的产品还是照样完成传输层和网络层的所有过程,只是当IP数据报离开网络层时把它返回给自己
环回接口处理IP数据报的过程
MTU 最大传输单元
如果 IP层有一个数据报要传,而且数据的长度比链路层的 MTU还大,那么IP层就需要进行分片,把数据报分成若干片,这样每一片都小于MTU。
可以用netstat
命令打印出网络接口的M T U
-
路径MTU
但是如果两台主机之间的通信要通过多个网络,重要的不是两台主机所在网络的 M T U的值,重要的是两台通信主机路径中的最小 M T U
最后
以上是当今TCP/IP所采用的部分数据链路公共技术。TCP/IP成功的原因之一是它几乎能在任何数据链路技术上运行。
IP:网际协议
IP是TCP/IP协议族中最为核心的协议。所有的TCP、UDP、IMP及IGMP数据都以IP数据报格式传输
不可靠(unreliable)的意思是它不能保证IP数据报能成功地到达目的地。IP仅提供最好的传输服务。如果发生某种错误时,如某个路由器暂时用完了缓冲区,IP有一个简单的错误处理算法:丢弃该数据报,然后发送ICMP消息报给信源端。任何要求的可靠性必须由上层来提供(如TCP)。
无连接(connecltionless)这个术语的意思是IP并不维护任何关于后续数据报的状态信息。每个数据报的处理是相互独立的。这也说明,IP数据报可以不按发送顺序接收。如果一信源向相同的信宿发送两个连续的数据报(先是A,然后是B),每个数据报都是独立地进行路由选择,可能选择不同的路线,因此B可能在A到达之前先到达。
IP: Headers
普通的IP首部长为2 0个字节,除非含有选项字段。
IP数据报格式及首部中的各字段
由于T C P / I P首部中所有的二进制整数在网络中传输时都要求以big endian字节序,因此它又称作网络字节序。
-
首部长度 指的是首部占
32 bit 字的数目,包括任何选项。
由于它是一个 4比特字段,因此首部最长为6 0个字节。在第8章中,我们将看到这种限制使某些选项如路由记录选项在当今已没有什么用处。普通IP数据报(没有任何选择项)字段的值是 5 (20个字节)\[5\times 32 \div 8 = 20 \]\[(2^4-1)\times 32 \div 8 = 60 \] -
服务类型(TO S)字段包括一个3 bit的优先权子字段(现在已被忽略)
现在大多数的T C P / I P实现都不支持TO S特性服务类型字段推荐值
-
总长度字段 是指整个 I P数据报的长度,以字节为单位
利用首部长度字段和总长度字段,就可以知道 I P数据报中数据内容的起始位置和长度。当数据报被分片时,该字段的值也随着变化- 尽管可以传送一个长达 65535字节的IP数据报,但是大多数的链路层都会对它进行分片, 而且,主机也要求不能接收超过 576字节的数据报
一些数据链路(如以太网)需要 填充 一些数据以达到最小长度。尽管以太网的最小帧长为 4 6字节
ifconfig
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 192.168.0.1 0.0.0.0 UG 600 0 0 wlp4s0
169.254.0.0 0.0.0.0 255.255.0.0 U 1000 0 0 wlp4s0
172.16.93.0 0.0.0.0 255.255.255.0 U 0 0 0 vmnet8
192.168.0.0 0.0.0.0 255.255.255.0 U 600 0 0 wlp4s0
192.168.124.0 0.0.0.0 255.255.255.0 U 0 0 0 vmnet1
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
default _gateway 0.0.0.0 UG 600 0 0 wlp4s0
link-local 0.0.0.0 255.255.0.0 U 1000 0 0 wlp4s0
172.16.93.0 0.0.0.0 255.255.255.0 U 0 0 0 vmnet8
192.168.0.0 0.0.0.0 255.255.255.0 U 600 0 0 wlp4s0
192.168.124.0 0.0.0.0 255.255.255.0 U 0 0 0 vmnet1
后三条是自动生成的,因为是直连的网段,不需要走三层,直接走二层协议,在每块网卡上每配置一个IP就会生成一条记录(一个网卡上可以配置多个IP)。表示去往这两个网段的数据包,直接由网卡接口ens33及ens37发送出去
这两条记录中的gateway并没有意义,Flags那一列中有G时才会使用Gateway。这两条路由并没有这样的标志,由于它们是本地的,匹配这些条目的数据包会直接通过Iface列中的网卡发送出去。
后两条表达的意思:
192.168.0.0 10.77.238.254 255.255.0.0 UG 0 0 0 eth0
表示去往192.168.0.0网段的数据包由网关10.77.238.254通过网卡eth0来转发
0.0.0.0 169.254.0.0 0.0.0.0 UG 0 0 0 eth1
表示去往所有目标地址数据包由网关169.254.0.0 通过网卡eth1来转发
- 环回地址必须是127.0.0.1吗
不是必须!IPv4 的环回地址是保留地址之一 127.0.0.1。尽管只使用 127.0.0.1 这一个地址,但地址 127.0.0.0 到 127.255.255.255 均予以保留。此地址块中的任何地址都将环回到本地主机中。此地址块中的任何地址都绝不会出现在任何网络中。
ARP:地址解析协议
数据链路如以太网或令牌环网都有自己的寻址机制(常常为 48 bit地址)
这一节主要介绍ARP(地址解析协议)和RAR(逆地址解析协议)
- ARP为IP地址到对应的硬件地址之间提供动态映射, 我们之所以用动态这个词是因为这个过程是自动完成的,一般应用程序用户或系统管理员不必关心
- RARP是被那些没有磁盘驱动器的系统使用,它需要系统管理员进行手工设置。
ARP发送一份称作ARP请求的以太网数据帧给以太网上的每个主机。这个过程称作广播,如图4-2中的虚线所示。ARP请求数据帧中包含目的主机的IP地址(主机名为bsdi),其意思是“如果你是这个IP地址的拥有者,请回答你的硬件地址。
当用户输入命令“ftp 主机名”时ARP的操作
ARP的高速缓存
ARP高效运行的关键是由于每个主机上都有一个ARP高速缓存。这个高速缓存存放了最近Internet地址到硬件地址之间的映射记录。高速缓存中每一项的生存时间一般为20分钟,起始时间从被创建时开始算起。
我们可以用arp命令来查看arp高速缓存
sun (140.252.13.33) at 8:0:20:3:f6:42
svr4 (140.252.13.34) at 0:0:c0:c2:9b:26
ARP的分组格式
用于以太网的ARP请求或应答分组格式
对于一个ARP请求来说,除目的端硬件地址外的所有其他的字段都有填充值。当系统收到一份目的端为本机的ARP请求报文后,它就把硬件地址填进去,然后用两个目的端地址分别替换两个发送端地址,并把操作字段置为2,最后把它发送回去
ARP代理
ARP代理通俗地说,就是由中间设备代替其他主机响应arp请求。下图展现了ARP代理工作的主要过程:
ARP代理工作的过程说明
- 192.168.0.16/16主机向外发送目的主机为192.168.1.3/24的ARP请求报文;
- 网关收到0.16的ARP请求报文,由于网关开启了ARP代理的功能,因此网关代替1.3向0.16发送ARP响应数据报;
- 网关向1.0/24网段发送1.3的ARP请求报文;
- 1.3收到后,发送ARP响应报文。
arp 代理
gratuitous ARP (免费arp)
免费ARP可以有两个方面的作用:
1)一个主机可以通过它来确定另一个主机是否设置了相同的IP地址。主机bsdi并不希望对此请求有一个回答。但是,如果收到一个回答,那么就会在终端日志上产生一个错误消息“以太网地址:a🅱️c:d:e:f发送来重复的IP地址”。这样就可以警告系统管理员,某个系统有不正确的设置。
2)
RARP:逆地址解析协议
具有本地磁盘的系统引导时,一般是从磁盘上的配置文件中读取 I P地址。但是无盘机,如X终端或无盘工作站,则需要采用其他方法来获得 I P地址。
RARP分组的格式与ARP分组基本一致(见图4-3)。它们之间主要的差别是RARP请求或应答的帧类型代码为0x8035,而且RARP请求的操作代码为3,应答操作代码为4。
ICMP:Internet控制报文协议
ICMP经常被认为是IP层的一个组成部分。它传递差错报文以及其他需要注意的信息ICMP报文通常被IP层或更高层协议(TCP或UDP)使用。一些ICMP报文把差错报文返回给用户进程。
ICMP封装在IP数据报内部
下面各种情况都不会导致产生ICMP差错报文:
- ICMP差错报文(但是,ICMP查询报文可能会产生ICMP差错报文)。
- 目的地址是广播地址或多播地址(D类地址)的IP数据报。
- 作为链路层广播的数据报。
- 不是IP分片的第一片(将在11.5节介绍分片)。
- 源地址不是单个主机的数据报。这就是说,源地址不能为零地址、环回地址、广播地址或多播地址
这些规则是为了防止过去允许ICMP差错报文对广播分组响应所带来的广播风暴。
ICMP地址掩码请求与应答
ICMP地址掩码请求用于无盘系统在引导过程中获取自己的子网掩码。系统广播它的ICMP请求报文(这一过程与无盘系统在引导过程中用RARP获取IP地址是类似的)。
无盘系统是用于网吧,卡拉OK,办公室的一种网络传输技术。使用无盘系统的计算机将不使用本机的硬盘获得启动系统,而是通过网络的指定服务器去获得启动系统的镜像,并下载回本机后用于机器启动。同时也不需要使用传统硬盘读取资料,而是通过局域网内的服务器读取资料。
无盘系统获取子网掩码的另一个方法是 B O O T P协议
RFC规定,除非系统是地址掩码的授权代理,否则它不能发送地址掩码应答(为了成为授权代理,它必须进行特殊配置,以发送这些应答。参见附录E)。但是,正如我们从本例中看到的那样,大多数主机在收到请求时都发送一个应答,甚至有一些主机还发送差错的应答
标明是“内核”,那么ICMP就由内核来处理。如果最后一列指明是“用户进程”,那么报文就被传送到所有在内核中登记的用户进程,以读取收到的ICMP报文。如果不存在任何这样的用户进程,那么报文就悄悄地被丢弃(这些用户进程还会收到所有其他类型的ICMP报文的拷贝,虽然它们应该由内核来处理,当然用户进程只有在内核处理以后才能收到这些报文)。有一些报文完全被忽略。
ICMP时间戳请求与应答
ICMP时间戳请求允许系统向另一个系统查询当前的时间。返回的建议值是自午夜开始计算的毫秒数,协调的统一时间(CoordinatedUniversalTime,UTC)(早期的参考手册认为UTC是格林尼治时间)这种ICMP报文的好处是它提供了毫秒级的分辨率,而利用其他方法从别的主机获取的时间(如某些Unix系统提供的rdate命令)只能提供秒级的分辨率
ICMP端口不可达差错
之前讨论了ICMP查询报文—地址掩码和时间戳查询及应答现在来分析ICMP差错报文即端口不可达报文;
UDP的规则之一是,如果收到一份UDP数据报而目的端口与某个正在使用的进程不相符,那么UDP返回一个ICMP不可达报文,可以用TFTP来强制生成一个端口不可达报文
注意,ICMP报文是在主机之间交换的,而不用目的端口号
ICMP差错报文,必须包括生成该差错报文的数据报IP首部(包含任何选项)
Ping
目的是为了测试另一台主机是否可达。该程序发送一份ICMP回显请求报文给主机,并等待返回ICMP回显应答
一般来说,如果不能Ping到某台主机,那么就不能Telnet或者FTP到那台主机。反过来,如果不能Telnet到某台主机,那么通常可以用Ping程序来确定问题出在哪里
IP路由
系统产生的或转发的每份IP数据报都要搜索路由表,它可以被路由守护程序或ICMP重定向报文修改用route命令可以进入静态路由,可以利用新ICMP路由器发现报文来初始化默认表项,
主机在启动时只有一个简单的路由表,它可以被来自默认路由器的 I C M P重定向报文动态修改。