为什么会有网络模型
因为**标准化**。
车同轨 书同文 行同伦就是秦始皇的最大贡献,有标准才能统一化。如果每个厂商都定义自己的网络模型,对于信息的流转将是巨大灾难。
对应关系
由国际化标准组织制定的 OSI 模型,本来是最应该在全球范围内推广的网络模型,不过因为 OSI 的设计过于理想不合实际,再加上当时应用 TCP/IP 模型的因特网(Internet)已经覆盖了全球大部分地区。种种原因,导致 OSI 并没有取得市场化的成功,仅仅是获得了理论上的研究成果。而 TCP/IP 模型则被作为了事实上的国际标准
数据封装
既然是标准化,那么对于每一层要对数据做怎么样的处理就应该是协商一致的。
tcp/ip是如何封装数据的,如下图:
我们通过wareshark抓取一个TCP数据包看看是否和上图中的流程一致:
对比前图,我们的wareshark在网络层少了FCS。原因如下:
网卡在工作时要先去掉前导同步码和帧开始定界符,然后对帧进行差错检验,如果帧校验和错,就丢弃此帧。如果校验和正确,就判断帧的目的硬件地址是否符合自己的接收条件(目的地址是自己的物理硬件地址、广播地址、可接收的多播硬件地址等),如果符合,就将帧交“设备驱动程序”做进一步处理。这时我们的抓包软件才能抓到数据。
因此,wireshark 抓到的是去掉前导同步码、帧开始分界符、FCS校验之外的数据
数据传输流
知道数据如何封装,那么整个数据在网络流转就会很清晰了。
协议包头
MAC头
MAC 帧中非数据部分的长度一共是 18(6+6+2+4)个字节,而总长度限制范围是 64 ~ 1518,那么 MTU 数据部分的长度就为 46 – 1500字节
IP 头
IP 数据报中首部长度(Header Length)字段占用了 4 位,能表示的最大值的 15。但是这个字段的单位 32位长( 4个字节),所以首部最大长度为 15*4=60 字节。其最小值为5,因为首部固定部分 20 字节。
由于 IP 数据报首部格式固定部分长度为 20字节,那么 可选项部分(Option)最大长度为 40个字节。
IP 数据报中总长度(Total Length)占了 16 位,最大值是 2^16 -1 = 65535 字节,但是实际中这么大的数据报是极少见的。注意这里的总长度包括了当前报文段的首部和数据部分。
另外,总长度 – 首部长度 = 数据部分长度,也就是传输层 TCP 或 UDP 报文分组的长度。
-
IP数据报分片
所发送的 IP 数据报如果超过的链路层的 MTU值,就必须进行分片传输。IP 数据报支持分片传输,但是在实际使用中我们要避免分片。为什么要避免分片?
IP层没有重传机制,如果某个分片丢失,传输层需要将所有分片进行重传。
多个分片都会有自己的 IP 首部,实际数据部分比例下降,数据传输效率会降低。
一般 TCP 建立连接时会相互通知 MSS 值(TCP报文的 Option 中),从而避免分片。UDP需要应用层去现在包大小,MTU最大 1500,需要限制 UDP包不超过 1472 (1500 – IP包头20 – UDP包头8)
-
MSS 值是多少?
一般来说,只要避免 IP 分片,TCP 的 MSS 值可以尽量大一些。但是网络情况是复杂的,IP数据报经历的路劲是会动态变化的,最佳的 MSS 确认是不太容易的。如果双方没有相互通知 MSS ,那个需要一个保守的值,再加上一些历史原因,于是默认的 MSS 定为 576。如果使用TCP协议,实际中在连接阶段很多相互通知 MSS 的值为 1460(MTU 1500 – IP header 20 – TCP header20)
TCP 头
TCP 报文段格式内是没有长度的,其长度可以通过 IP 首部中长度推算出来。
实际中,在连接阶段很多相互通知 MSS 的值为 1460(MTU 1500 – IP header 20 – TCP header20)。如果没有通知 MSS,则默认的 MSS 为 576,一个很保守的值。