IP (Internet Protocol)
网络号+主机号
IP表示方法
1 | 10.11.12.13 |
LAN
local area network
WAN
wide area network
DNS
domain name system
MTU
Maximum Transmission nit 最大传输单元
数据链路层的最大载荷上限(即IP数据报最大长度),每段链路的 MTU 可能都不相同,一条端到端路径的 MTU 由这条路径上 MTU 最小的那段链路的 MTU 决定。
MTU 是链路层中的网络对数据帧的一个限制,以以太网为例,MTU 通常为1500字节,采用巨帧(Jumbo Frame)时可达到9000字节。所谓的 MTU 是二层协议的一个限制,对不同的二层协议可能有不同的值,只有二层协议是以太网时,MTU 一般才取1500字节,不是物理链路介质的限制,只有工作在二层的设备才需要指定 MTU 的值,如网卡、转发设备端口(网络接口)等,通过一段线缆直连的通信端口或网卡,MTU 一定相同。
一个IP数据报在以太网中传输,如果它的长度大于当前链路的 MTU值,就要进行分片(IP层分片)传输,使得每片数据报的长度不超过 MTU,分片传输的IP数据报不一定按序到达,但IP首部中的信息能让这些数据报按需组装,IP数据报的分片和重组都是在网络IP层完成的
MSS
Maximum segment size
MSS = MTU - TCP header - IPv4 header
最大报文段长度,为TCP 传输层的最大载荷上限(应用层数据最大长度),TCP 三次握手期间通过 TCP 首部选项中的 MSS 字段通知对端,通常一条 TCP 连接的 MSS 取通信双方较小的值。
在以太网中 MSS = 以太网MTU - TCP首部长度 - IPv4首部长度 = 1500 - 20 - 20 = 1460 bytes
未指定 MSS 时默认 536 bytes,这是因为在 Internet 中标准的 MTU 值为 576 bytes。
一个应用程序如果要发送超过 MSS 大小的数据,就要进行分段传输(TCP 分段),使得每个报文长度都不超过 MSS,分段传输的 TCP 报文不一定按序到达,但实现可靠传输的 TCP 协议中有处理乱序的机制,即利用报文段序列号在接收缓冲区进行数据重排以实现重组,TCP 分段的重组是在 TCP 传输层完成的。
Socket
socket 是什么?socket 就是一个内存对象,保存了一些控制信息(ip、端口、MTU、MSS…),协议栈是通过 socket 中记录的控制信息而工作的。
控制信息分为两部分:一是头部信息,二是套接字(内存)中保存的信息。
连接
连接就是客户端和服务器交换一些控制信息(IP、端口…)。
长度(MSS) or 时间 (Nagle算法)
TCP 发送数据时会考虑 MSS 和 时间,它们其实是互相矛盾的,如果长度优先那么网络的效率就会提高,但可能会因为等待填满缓冲区而产生延迟,相反如果时间优先,那么延迟时间会变少,但会降低网络效率(比如我只发一个字节的数据,此时网络包大小(20+20+1),效率只有 1/40 ),因此在进行发送操作的时候要综合考虑这两个因素以达到平衡。
但是 TCP 协议并没有指明怎么达到平衡,因此实际如何平衡由协议栈开发者来决定,正是这个原因,不同版本不同操作系统在相关操作上存在差异。
问题:是协议栈负责根据 MTU 分片还是路由器?
TCP分段 Segmentation IP分片 Fragmentation
- TCP 报文段如果很长的话会在发送时发生分段,在接收时进行重组
- IP 数据报在长度超过一定值时也会发生分片,在接收端将分片重组
分段特指发生在使用 TCP 协议的传输层中的数据区分行为
分片特指发生在使用 IPv4 协议的网络 IP 层中的数据区分行为
分段和分片发生在协议栈的不同层次中,但目的都一样,都是为了能够传输上层交付的、数据量超过本层传输能力上限的数据,不得已才做的数据切分。即正常情况下尽量避免做数据切分,能不分就不分,而只有在特殊场景下才不得不这么做。
为什么能不分就不分呢?
- 数据切分对于协议栈而言,显然使处理逻辑变得更加复杂,在发送端需要做切分,甚至在路径中的转发设备中也需要切分,在接收端又需要做重组,处理开销明显增大,对设备的处理能力提出更高要求。
- 在切分过程中不可避免的要为每个数据分片增加必要的协议首部以完成网络传输,在首部中还需要携带必要的顺序、偏移、是否属于同一块大数据等元信息来帮助重组数据。
疑问:分段和分片会不会同时发生
TCP 分段的原因是因为 TCP 报文段大小受 MSS 限制
IP 分片的原因是因为 IP 数据报大小受 MTU 限制
由于一直有 MSS < MTU 的存在,很明显分段后的每一个 TCP 报文段加上 IP 首部后的长度构造成的 IP 数据报长度都不可能超过 MTU,因此也就不需要在网络层进行 IP 分片了。
相比于为实现面向连接、提供可靠传输服务而具备各种复杂机制的 TCP,UDP 是简单至极的传输协议,就是在 IP 协议基础上增加了些特性以实现端到端的数据传输服务,因此 UDP 是不可靠的,UDP 协议并不会自行分段,所以 MSS 的限制对其没有作用,因此最终的 IP 数据报的长度超过 MTU 时,网络层会负责执行 IP 分片,同样没有分段功能的 ICMP 数据在网络层中同样会出现 IP 分片的情况。
结论:UDP 不会分段,由 IP 来分片,TCP 会分段,不用 IP 来分片
在分片的数据中,传输层的首部只会出现在第一个分片中,IP数据报分片后,只有第一片带有传输层首部(UDP 或 ICMP等),后续分片只有 IP 首部和应用数据,到了目的地后根据 IP 首部中的信息在网络层进行重组,这一步骤对上层是透明的,即传输层根本不知到 IP 层发生了分片与重组。而 TCP 报文段的每个分段中都有 TCP 首部,到了目的地后根据 TCP 首部的信息在传输层进行重组。
注:IP 分片只有第一片有 TCP 首部,而 TCP 分段,每一段都有 TCP 首部
TCP 分段仅发生在发送端,这是因为在传输过程中,TCP 分段是先封装成 IP 数据报,在封装在以太网帧中被链路所传输的,并且在端到端的路径上通常不会有工作在三层以上(传输层)的设备,故 TCP 分段不会发生在传输路径中间的某个设备中,在发送端 TCP 传输层分段后,在接收端 TCP 传输层重组。
IP 分片不仅会发生在使用 UDP、ICMP 等没有分段功能的传输层协议的数据发送方,还会发生在传输途中,甚至可能都会发生,这是因为原本的大数据报被分片后很可能会经过不同 MTU 大小的链路,一旦链路 MTU 小于当前当前 IP 分片大小,则需要在当前转发设备(如路由器)中再次分片,但是各个分片只有到达目的地后才会在其网络层重组,而不是像其他网络协议在下一跳就要进行重组。
发送端在进行 TCP 分段后就一般不会在 IP 层进行分片,因为 MSS 本身就是基于 MTU 推导而来,TCP 层分段满足了 MSS 限制,也就满足了 MTU 的物理限制,但在 TCP 分段发生后仍然可能发生 IP 分片,这是因为 TCP 分段仅满足了通信两端的 MTU 要求,传输路径上如果经过 MTU 值比较小的链路,那么在分片到该条链路的设备中仍然会以更小的 MTU 值作为依据再次分片。如果两个通信主机直连,那么 TCP 连接协商得到的 MTU 就是端到端的路径 MTU 值,故发送端只要做了 TCP 分段,在整个通信过程中一定不会发生 IP 分片。TCP 分段通常能避免 IP 分片,但前提是 MSS 反映了真实的路径 MTU。若路径上存在比协商 MTU 更小的链路,而 PMTUD 又没生效,那么即使 TCP 分段了,仍可能触发 IP 分片。
对途中发生分片的数据报而言,即使只丢失其中一片数据也要重传整个数据报(这里既然有重传说明传输层使用的是具有重传功能的协议,如 TCP 协议,而 UDP 协议不可靠,即使丢包了也不在意更不会重传,所以必须在应用层实现可靠通信的逻辑),这是因为 IP 本身没有重传机制,只能由更高层来负责重传以确保可靠传输,于是当来自同一个 TCP 报文段封装得到的原始 IP 数据报中某一片丢失后,接收段 TCP 迟迟接受不到完整的报文段,它就会认为该报文段(包括全部 IP 分片)已丢失,TCP 之后由于超时会收到三个冗余 ACK 就会重传整个 TCP 报文段,该报文段对应于一份IP数据报,可能有多个 IP 分片,但没有办法单独重传其中某一个数据分片,只能重传整个报文段。
分段或分片发生的根源都在于 MTU 这一数据链路层的限制,由于更靠近数据链路层的 IP 层在感知 MTU 方面相比于传输层具备天然的优势,在大小超过 MTU 的大数据报传输问题出现伊始,IP 层分片技术就成为主流解决方案,而分片带来的诸多开销(额外首部,复杂处理逻辑)以及其甚至可能在端到端的传输过程中多次发生网络转发设备(路由器)的问题,让网络协议设计者们又要费劲心思地在端到端通信过程中避免 IP 分片。
TCP 分段技术被提出后,在一定程度上减少了 IP 分片,但如上所诉,TCP 分段仅在发送端避免了 IP 分片,但是却不能保证整个端到端通信路径上不会发送 IP 分片,因为路径上经常会有 MTU 值小于该 TCP 连接协商得到的 MTU 值的链路,在转发至该段链路之前转发设备仍需要分片,所以 TCP 分段并不能完全避免 IP 分片。
如何才能彻底避免分片呢?
Path MTU
路径 MTU
Path MTU Discovery
路径 MTU 发现 略
路径 MTU 发现看似完美避免了 IP 分片的问题,但同时又带来了新的问题:如果 ICMP 消息最终没能到达源主机怎么办?很显然该 IP 数据报就被静静丢弃了,TCP 连接超时而被断开。ICMP 为什么回不来?一般是被防火墙或路由器的访问控制列表(Access Control List, ACL)给无情拒绝了。
分段是为了避免分片,分片不可避免。
有了 TCP 的确认重传机制,网卡、集线器、路由器就不需要有补偿机制了。
混杂模式 Promiscuous Mode
是指一台机器的网卡能够接收所有经过它的数据流,而不论其目的地址是否是它。 一般计算机网卡都工作在非混杂模式下,此时网卡只接受来自网络端口的目的地址指向自己的数据。当网卡工作在混杂模式下时,网卡将来自接口的所有数据都捕获并交给相应的驱动程序。
plug and play
热拔插,在过去是需要手动设置网卡中断号的。
数据链路层帧报头的作用 (时钟同步)
数据信号、时钟信号,通过时钟信号区分连续的1数据信号,这就是数据链路层报头的作用,保持时钟同步,通过观察报头的信号变化确保同步。