4.2 TCP和IP分别做什么
网络层只负责向计算机传送数据包,而传输层负责向应用程序传送数据。从网络层的角度来看,发送到同一台计算机上不同应用程序的数据包看起来是一样的。这意味着要让两个应用程序交换数据,我们需要两个地址。第一个是 Internet 协议地址,这是网络层用来向计算机传送数据包的地址。第二个是 TCP 端口,它告诉计算机软件将数据发送到哪个应用程序。Web 服务器通常在 TCP 端口 80 上运行。因此,当我们打开到 Web 服务器的连接时,我们会向运行该 Web 服务器的计算机发送一个 IP 数据包,目标地址是该计算机的 IP 地址。
4.3 路由器如何转发数据包
现在我们知道Client和Server之间的通信是通过路由器组进行的。路由器如何转发数据包?它通过称为转发表的东西来实现这一点,如下图所示。转发表由一组 IP 地址模式和为每个模式发送的链接组成。当数据包到达时,路由器会检查哪个转发表条目的模式与数据包最匹配。它沿着该条目的链接转发数据包。通常,“最佳”意味着最具体的匹配。(最佳匹配的算法在第8小结有详细介绍)
可以用traceroute命令感受路由跳转,每个数字代表一跳数据包mtu,* * *表示路由器屏蔽了信息。
haoyufei@Diablo ~ % traceroute www.cs.brown.edu
traceroute to www.cs.brown.edu (128.148.32.12), 64 hops max, 52 byte packets
1 192.168.0.1 (192.168.0.1) 17.093 ms 9.828 ms 9.473 ms
2 218.17.162.129 (218.17.162.129) 18.666 ms 18.658 ms 20.429 ms
3 * * *
4 218.17.52.42 (218.17.52.42) 18.277 ms
61.144.236.181 (61.144.236.181) 20.215 ms
58.60.235.21 (58.60.235.21) 7.534 ms
5 1.186.37.59.broad.dg.gd.dynamic.163data.com.cn (59.37.186.1) 9.161 ms
61.146.247.193 (61.146.247.193) 19.337 ms 15.221 ms
6 125.176.37.59.broad.dg.gd.dynamic.163data.com.cn (59.37.176.125) 23.425 ms 20.298 ms
117.176.37.59.broad.dg.gd.dynamic.163data.com.cn (59.37.176.117) 19.342 ms
7 183.56.65.69 (183.56.65.69) 9.476 ms
14.147.127.93 (14.147.127.93) 20.166 ms
14.147.127.89 (14.147.127.89) 18.483 ms
8 202.97.94.138 (202.97.94.138) 17.867 ms
202.97.94.126 (202.97.94.126) 18.930 ms
202.97.94.142 (202.97.94.142) 17.630 ms
9 202.97.12.5 (202.97.12.5) 11.727 ms *
202.97.94.106 (202.97.94.106) 25.900 ms
10 202.97.51.110 (202.97.51.110) 175.015 ms
202.97.51.98 (202.97.51.98) 182.644 ms
......
5. 网络的三个基本原则
网络设计原则:分层、封装和分组交换。
5.1 分组交换
上面我们提到了路由器根据转发表来转发数据包,相对于IP数据包中的预定路由器转发线路有很多优势,比如
不存在信息安全问题,Hacker可以通过修改IP包来欺骗路由器将数据包发送到非法地址(如果IP数据包中安排了路由器转发线路)。没有性能问题,路由器可以为每个数据包做出单独的本地决策,否则在发送 IP 之前计算路由器的电路将是一个巨大的工作量。资源利用率高,没有一个IP包可以独占某条路由线路。
假设A要发送一个数据包P给E,但是这个数据包有点大,需要分成三组,比如分成三个较小的数据包p1,p2,p3。这时候A直接把这个小数据包丢给附近的路由器,然后A就不管了。比如A把p1丢给B,这时候A已经不关心p1了。当B收到p1的完整小数据包后,B再次抛给E。分组交换有几个特性:
存储特性,B在转发前必须收到完整的p1数据包。非实时的,因为A把数据包丢给B后就不管了,没人知道B什么时候转发p1,也有可能B绕了几圈再发给E。被封锁。可能有很多路由器丢数据包给B,这时候通信就会阻塞。可能p1正在排队等待B发送。丢包,因为路由器B的容量有限,如果丢给它的数据包太多,它可能容纳不下,这时候就可能出现丢包。重复数据。再者,由于p1、p2、p3数据包都有文件头,所以都包含了A和E的一些信息,当然还有其他的信息。5.2 分层
可以说,任何复杂的计算机系统,甚至现实世界中的系统(如邮政、物流系统)都是分层的。分层就是我们把大而复杂的问题拆解成容易处理的小问题。分层意味着模块化,意味着每一层的关注点和职责可以分离,意味着每一层都可以独立开发和优化。我们以最熟悉的编程为例。Java等语言为程序员隐藏了计算机的底层细节。我们只需要专注于编写Java代码,然后将代码传递给底层编译器即可。编译器生成目标代码,然后将其转换传递给链接器,链接器将编译后的目标文件和库链接在一起生成可执行文件,最后机器执行代码。分层让编译器专注于词法分析,而链接器则专注于有效地将对象拼接在一起,双方都不必担心对方的工作,并且各自可以改进、升级。
5.3 包装
封装是指我们将网络每一层的数据灵活地组装成数据包,每个数据包中包含来自多个层的数据。假设我们正在使用我们的计算机通过 WiFi 浏览网页。我们的网络浏览器生成一个 HTTP GET 请求。此时HTTP GET请求就是TCP段的payload,这个TCP段就是IP包的payload。这个封装了 TCP 段和 HTTP GET 的 IP 数据包是 WiFi 帧的有效负载。数据包最外层的封装格式是WiFi帧,里面是IP包,里面是TCP段,里面是HTTP GET。
5.3.1 递归封装
我们可以更灵活地封装数据包。例如,当我们使用 TLS 时,我们实际上将我们的 IP 数据包放入一个 TLS 段中。TLS 保护信息并保密。这个 TLS 会话在 TCP 流中,这意味着我们将 IP 数据包放在 TCP 数据包中。
6. 字节顺序和数据包格式 6.1 什么是字节序
字节序,也称为端序或尾序(英文表达为:Endianness),在计算机领域,是指在计算机内存或数字通信链路中占用多个字节的数据的字节顺序。字节的排列方式有两个一般规则:
让我们举个例子来轻松理解它。比如我们在内存中需要4个字节来存放整数168496141。该值对应的十六进制表示为0X0A0B0C0D:
X86 计算机使用小端,ARM 计算机使用大端。
6.2 为什么需要字节顺序
很多人会问数据包mtu,为什么会有字节序,难道不能统一使用big endian序吗?答案是计算机电路先处理低位字节,效率更高,因为计算是从低位字节开始的。因此,计算机的内部处理是小端的。在计算机内部,little-endian 被广泛用于在现代 CPU 中存储数据;而在其他场景,如网络传输、文件存储等,则采用big-endian。
7. 子网掩码
子网掩码告诉设备哪些IP在本地,哪些IP在网络。发往网络的报文需要经过路由器,发往本地的报文则不需要。子网掩码由一系列“1”组成,例如 255.255.255.0 的前 3 个八位字节为“1”,这意味着前 24 位相同的两个 IP 地址位于同一网络上。同理,255.255.252.0表示前22位为同一个IP在同一网络,255.128.0.0表示前9位。同时,我们不难得出一个结论:子网掩码越小,网络越大。
对两台机器的IP地址和子网掩码进行按位与运算。如果运算结果相等,则两台机器在同一个网络中。
我们可以通过ifconfig命令直观感受子网掩码,打开终端输入ifconfig命令,可以看到IP为192.168.0.173,而我们的网络掩码(子网掩码)为0xffffff00,十六进制为255.255。 255.0,也就是说以192.168.0开头的IP地址和我们在同一个本地网络,两者之间发送的数据包不需要经过路由器。
......
en0: flags=8963<UP,BROADCAST,SMART,RUNNING,PROMISC,SIMPLEX,MULTICAST> mtu 1500
options=6463<RXCSUM,TXCSUM,TSO4,TSO6,CHANNEL_IO,PARTIAL_CSUM,ZEROINVERT_CSUM>
ether bc:d0:74:38:80:fe
inet6 fe80::184e:651c:6716:6ec7%en0 prefixlen 64 secured scopeid 0xe
inet 192.168.0.173 netmask 0xffffff00 broadcast 192.168.0.255
nd6 options=201<PERFORMNUD,DAD>
media: autoselect
status: active
......
7.1 历史IP地址结构
历史上的IP地址分为网络部分和主机部分,根据网络部分和主机部分的长度分为三类:
地址的网络部分是管理域。管理域可大可小,小到国家,小到学校。例如,具有 7 个网络位和 24 个主机位的 A 类地址可以表示 128 个网络。1677W 个 IP 地址。
7.2 现代 IP 地址结构
我们不难发现,上面的网络位只有三个不够灵活,所以今天的IP地址已经演变成Classless Inter-Domain (CIDR),CIDR允许任意长度的网络位(即子网掩码的长度) ,例如:171.64.0.0/16,其子网掩码的长度为16。颁发IP地址的权威机构是IANA,它向各大互联网区域注册机构(Regional Internet Registries,RIRs)颁发/8子网。例如,美国的 RIR 是 ARIN。小块。
8. 路由转发算法
前面我们提到路由器根据路由表转发数据包。路由表中有很多路由地址。您如何知道选择哪个路由地址是最佳解??决方案?这时就用到路由转发算法,也称为最长前缀匹配算法(LPM)。路由表如图所示,其中x代表通配符。
匹配算法针对的是最具体的,什么意思?举个例子:假设我们有一个如下所示的路由表。这时有一个目的地址为171.33.13.14的数据包,匹配到0.0.0.0/0和171.33.0.0/16。这时候路由器会选择Forward到后者,因为后者的子网掩码前缀比0位长16位,更具体。
9.ARP协议
我们现在知道数据包是通过链路层进行传输的,第一步就是将数据包发送到链路中路由器的物理地址(也叫MAC地址)。如果我不知道路由器的物理地址怎么办?ARP 就是为了解决这个问题而设计的:ARP 可以发现其直连的MAC 地址。
请注意,IP 地址和 MAC 地址是两个不同的东西。IP地址描述的是“这台主机”,而MAC地址描述的是“这台网络设备”。:4c:d9:6a
ARP 形成IP 地址和Mac 地址之间的映射关系。它是一个简单的请求-响应协议,每个节点都保存着IP地址和Mac地址映射关系的缓存。如果一个节点需要向它没有映射到的IP地址发送数据包,它会**广播(ff:ff:ff:ff地址)**发送一个请求:“谁有xxx的Mac地址”,使用缓存的 Mac 地址 节点将响应。让我们举个例子。假设我们有一个客户端(IP:192.168.0.5)位于网关(IP:192.168.0.1)下。这时候Client要将数据包发送到Internet。第一步是将数据包发送给网关,如果客户端不知道网关的MAC地址,就需要使用ARP请求其他“知道网关MAC地址”的客户端帮忙。
9.1 ARP包详解
ARP 数据包有 10 个字段。
硬件字段指示此请求/响应适用于哪个链路层。协议字段指示此请求/响应的目标网络协议。硬件和协议长度字段指示链路层和网络地址的字节数。Opcode 指示数据包是请求操作还是响应。操作,1为请求,2为响应。源硬件地址、源协议地址、目的硬件地址、目的协议地址四个字段用于请求和指定映射。所有数据均采用大端顺序,如Opcode = 15,则存储为0x000f。Protocol = 0x0800时,对应IP协议。此时Source protocol address的值为IP地址,Protocol相关的其他字段以此类推。
参考:什么是电路交换和分组交换,什么是大端和小端,为什么会有字节序