IP地址
网络上每一个节点都必须有一个独立的 IP 地址,通常使用的 IP 地址是一个 32bit 的数字,被 .
分成 4 组,例如,255.255.255.255
就是一个 IP 地址
域名
用 12 位数字组成的 IP 地址很难记忆,在实际应用时,用户一般不需要记住 IP 地址,互联网给每个 IP 地址起了一个别名,习惯上称作域名
常见的域名包括 com、net 和 org 三种顶级域名后缀,除此之外每个国家还有自己国家专属的域名后缀(比如我国的域名后缀为 cn)
MAC
MAC(Media Access Control)地址,或称为物理地址、硬件地址,用来定义互联网中设备的位置。
端口号
IP 地址是用来发现和查找网络中的地址,但是不同程序如何互相通信呢?这就需要端口号来识别了。如果把 IP 地址比作一间房子 ,端口就是出入这间房子的门
网络层协议的数据单元是 IP 数据报 ,而数据链路层的工作就是把网络层交下来的 IP 数据报 封装为 帧(frame)发送到链路上,以及把接收到的帧中的数据取出并上交给网络层。 为达到这一目的,数据链路必须具备一系列相应的功能,主要有:
数据帧的结构是这样的:
流量控制
流量控制实际上是对发送方数据流量的控制,使其发送速率不超过接收方的速率。所以需要一些规则使得发送方知道在什么情况下可以接着发送下一帧,而在什么情况下必须暂停发送,以等待收到某种反馈信息后再继续发送。这就是流量控制。
MTU
为了提供足够快的响应时间,以太网和 IEEE802.3 对数据帧长度都有限制,其最大值分别为 1500 字节和 1492 字节,链路层的这个特性称作 MTU ,即 最大传输单元 。
当网络层传下来一个 IP 数据报,并且其长度比链路层的 MTU 大,那么网络层就需要对数据报进行分片,使每一片都小于 MTU
IP 数据报
版本号
:4 位,用于标明 IP 版本号,0100 表示 IPv4,0110 表示 IPv6。目前常见的是 IPv4。首部长度
:4 位,表示 IP 报头长度,包括选项字段。服务类型(TOS)
:分别有:最小时延、最大吞吐量、最高可靠性、最小花费 4 种服务,如下图所示。4 个标识位只能有一个被置为 1。总长度
:16 位,报头长度加上数据部分长度,便是数据报的总长度。IP 数据报最长可达 65535
字节。标识
:16 位,接收方根据分片中的标识字段相不相同来判断这些分片是不是同一个数据报的分片,从而进行分片的重组。通常每发送一份报文它的值就会加 1。标志
:3 位,用于标识数据报是否分片。其中的第 2 位是不分段(DF)位。当 DF 位被设置为 1 时,则不对数据报进行分段处理;第 3 位是分段(MF)位,除了最后一个分段的 MF 位被设置为 0 外,其他的分段的 MF 位均设置为 1。偏移
:13 位,在接收方进行数据报重组时用来标识分片的顺序。生存时间(TTL)
:8 位,用于设置数据报可以经过的最多的路由器个数。TTL 的初始值由源主机设置(通常为 32 或 64),每经过一个处理它的路由器,TTL 值减 1。如果一个数据报的 TTL 值被减至 0,它将被丢弃。协议
:8 位,用来标识是哪个协议向 IP 传送数据。ICMP 为 1,IGMP 为 2,TCP 为 6,UDP 为 17,GRE 为 47,ESP 为 50。首部校验和
:根据 IP 首部计算的校验和码。源 IP 和目的 IP
:数据报头还会包含该数据报的发送方 IP 和接收方 IP。选项
:是数据报中的一个可变长、可选的信息,不常用,多用于安全、军事等领域。首先看到开头的 192.168.42.5.5901 > 192.168.42.2.39512 代表的是源 ip 为 192.168.42.5,端口 5901,目的 ip 为 192.168.42.2,端口 39512
然后看到 0x0000 那行:
IP 地址分类
A 类地址
B 类地址
C 类地址
子网划分
IP 地址如果只使用 ABCDE 类来划分,会造成大量的浪费:一个有 500 台主机的网络,无法使用 C 类地址。但如果使用一个 B 类地址,6 万多个主机地址只有 500 个被使用,造成 IP 地址的大量浪费。
因此,可以在 ABC 类网络的基础上,进一步划分子网:占用主机号的前几个位,用于表示子网号 。
这样 IP 地址就可看作 IP = 网络号 + 子网号 + 主机号
子网号的位数没有硬性规定,于是我们用 子网掩码 来确定一个 IP 地址中哪几位是主机号,具体使用方法如图:
子网掩码中的 1 标识了 IP 地址中相应的网络号和子网号,0 标识了主机号。将 IP 地址和子网掩码进行 逻辑与运算 ,结果就能区分网络号和子网号
IP 路由选择
如果发送方与接收方直接相连(点对点)或都在一个共享网络上(以太网),那么 IP 数据报就能直接送达。 而大多数情况则是发送方与接收方通过若干个路由器(router)连接,那么数据报就需要经过若干个路由器的转发才能送达,它是怎么选择一个合适的路径来"送货"的呢?
IP 层在内存中有一个路由表(输入命令 route -n
可以查看路由表),当收到一份数据报并进行发送时,都要对该表进行搜索:
NAT 技术
TTL值
UDP 报文
UDP 数据报可分为两部分:UDP 报头和数据部分。其中数据部分是应用层交付下来的数据。UDP 报头总共 8 字节,而这 8 字节又分为 4 个字段:
TCP 报文
TCP 是面向字节流的,而 TCP 传输数据的单元是 报文段 。一个 TCP 报文段可分为两部分:报头和数据部分。数据部分是上层应用交付的数据,而报头则是 TCP 功能的关键。
TCP 报文段的报头有前 20 字节的固定部分,后面 4n 字节是根据需要而添加的字段。如图则是 TCP 报文段结构:
20 字节的固定部分,各字段功能说明:
还记得我们在 IP 网际协议抓取的报文吗?我们下面再用 tcpdump 命令试着抓取一下。
其实输出结果中还包含着 TCP 协议的报文,试着回顾一下,相信你能很快找到哪部分是 IP 协议的首部。IP 报文头紧接着的一部分就是 TCP 报文头,从 170d 开始。
源端口:0x170d,转换为十进制为 5901。
目的端口:0x9d86,即为 40326。
序号:0xba42638b,即为 3124913035,这和图中开头的 seq 是一致的。
确认序号:0x4c1ad749,即为 1276827465,这和图中开头的 ack 是一致的。
数据偏移:0x8,8*4=32B。
从 4500 到 0101 都是 IP 报头,IP 报文在之前已经讲过,这里就不赘述了。后面的部分就是 UDP 报文。
我们知道 UDP 报头一共 8 字节,所以从 803e 到 7f05 是 UDP 报头的部分。
TCP 可靠传输的实现
可见超时重发机制是 TCP 可靠性的关键,只要没有得到确认报文段,就重新发送数据报,直到收到对方的确认为止
超时重传
TCP 规定,接收者收到数据报文段后,需回复一个确认报文段,以告知发送者数据已经收到。而发送者如果一段时间内(超时计时器)没有收到确认报文段,便重复发送。
为了实现超时间重传,需要注意:
连续 ARQ 协议
也许你也发现了,按上面的介绍,超时重传机制很费时间,每发送一个数据报都要等待确认。
在实际应用中的确不是这样的,真实情况是,采用了流水线传输:发送方可以连续发送多个报文段(连续发送的数据长度叫做窗口),而不必每发完一段就停下来等待确认。
实际应用中,接收方也不必对收到的每个报文都做回复,而是采用累积确认方式:接收者收到多个连续的报文段后,只回复确认最后一个报文段,表示在这之前的数据都已收到。
这样,传输效率得到了很大的提升。
流量控制和拥塞控制
由于接收方缓存的限制,发送窗口不能大于接收方接收窗口。在报文段首部有一个字段就叫做窗口(rwnd),这便是用于告诉对方自己的接收窗口,可见窗口的大小是可以变化的。
那么窗口的大小是如何变化的呢?TCP 对于拥塞的控制总结为“慢启动、加性增、乘性减”,如图所示: