IP分片浅析 - Glacier

标签: ip glacier | 发表时间:2014-04-09 01:25 | 作者:Glacier
出处:

在TCP/IP分层中,数据链路层用MTU(Maximum Transmission Unit,最大传输单元)来限制所能传输的数据包大小,MTU是指一次传送的数据最大长度,不包括数据链路层数据帧的帧头,如以太网的MTU为1500字节,实际上数据帧的最大长度为1512字节,其中以太网数据帧的帧头为12字节。

当发送的IP数据报的大小超过了MTU时,IP层就需要对数据进行分片,否则数据将无法发送成功。

IP分片的实现

IP分片发生在IP层,不仅源端主机会进行分片,中间的路由器也有可能分片,因为不同的网络的MTU是不一样的,如果传输路径上的某个网络的MTU比源端网络的MTU要小,路由器就可能对IP数据报再次进行分片。而分片数据的重组只会发生在目的端的IP层。

在IP首部有4个字节是用于分片的,如下图所示。前16位是IP数据报的标识,同一个数据报的各个分片的标识是一样的,目的端会根据这个标识来判断IP分片是否属于同一个IP数据报。中间3位是标志位,其中有1位用来表示是否有更多的分片,如果是最后一个分片,该标志位为0,否则为1。后面13位表示分片在原始数据的偏移,这里的原始数据是IP层收到的传输的TCP或UDP数据,不包含IP首部。

需要注意的,在分片的数据中,传输层的首部只会出现在第一个分片中,如下图所示。因为传输层的数据格式对IP层是透明的,传输层的首部只有在传输层才会有它的作用,IP层不知道也不需要保证在每个分片中都有传输层首部。所以,在网络上传输的数据包是有可能没有传输层首部的。

避免IP分片

在网络编程中,我们要避免出现IP分片,那么为什么要避免呢?原因是IP层是没有超时重传机制的,如果IP层对一个数据包进行了分片,只要有一个分片丢失了,只能依赖于传输层进行重传,结果是所有的分片都要重传一遍,这个代价有点大。由此可见,IP分片会大大降低传输层传送数据的成功率,所以我们要避免IP分片。

对于UDP包,我们需要在应用层去限制每个包的大小,一般不要超过1472字节,即以太网MTU(1500)—UDP首部(8)—IP首部(20)。

对于TCP数据,应用层就不需要考虑这个问题了,因为传输层已经帮我们做了。在建立连接的三次握手的过程中,连接双方会相互通告MSS(Maximum Segment Size,最大报文段长度),MSS一般是MTU—IP首部(20)—TCP首部(20),每次发送的TCP数据都不会超过双方MSS的最小值,所以就保证了IP数据报不会超过MTU,避免了IP分片。

IP分片实例

1. UDP

从10.224.142.166向10.137.133.101发送3000字节的UDP数据,抓包的结果如下图。从图中可以看到这个UDP数据包被分成了3个IP片,从各分片的偏移量可以看出,3片包含的UDP数据大小分别是1480、1480、48(加上UDP首部8个字节),各分片加上IP首部的大小分别就是1500、1500、68,传送的总的UDP数据大小为3008,由此也看出只有一个分片包含UDP首部。

2. TCP

从10.224.142.166向10.137.133.101发送2000字节的TCP数据,抓包的结果如下图。从图中可以看出TCP数据被分成了2个IP片,包含的数据大小分别为1448、552,从三次握手可以看出双方通告的MSS都是1460字节,刚好是MTU(1500)—IP首部(20)—TCP首部(20),但实际为什么第一个分片只发送了1448字节呢,个人觉得应该是TCP首部还有一些选项占用了12个字节,也请知道的达人解释一下。


本文链接: IP分片浅析,转载请注明。

相关 [ip glacier] 推荐:

IP分片浅析 - Glacier

- - 博客园_首页
在TCP/IP分层中,数据链路层用MTU(Maximum Transmission Unit,最大传输单元)来限制所能传输的数据包大小,MTU是指一次传送的数据最大长度,不包括数据链路层数据帧的帧头,如以太网的MTU为1500字节,实际上数据帧的最大长度为1512字节,其中以太网数据帧的帧头为12字节.

tcp/ip调优

- Lucseeker - 在路上
在TCP/IP协议中,TCP协议提供可靠的连接服务,采用三次握手建立一个连接. 第一次握手:建立连接时,客户端发送syn包(syn=x)到服务器,并进入SYN_SEND状态,等待服务器确认;. 第二次握手:服务器收到syn包,必须确认客户的SYN(ack=x+1),同时自己也发送一个SYN包(syn=y),即SYN+ACK包,此时服务器进入SYN_RECV状态;.

获取 WAN IP

- 狗尾草 - LinuxTOY
如果你在 router 或者 firewall 后面,你直接查询 interface ,拿到可能不是 WAN 的 IP. 很久很久以前的一个版本,把它们贴到 .bashrc (Bash 专用) 或者 .profile (非 Bash 专用)里面去. .profile 即可生效,输入 myip 就能拿到 WAN IP.

TCP/IP分享——链路层

- Goingmm - 弯曲评论
在张国荣自尽8周年纪念日,也就是愚人节的前几十分钟,终于把第二章弄完了. 首席似乎不是特别有空,我就斗胆在这里自己发了,从前面2期的反响来看,相当热烈,我也是摆出一副要杀要剐,悉听尊便的架势,这可能是受最近流行霸气外露的影响,批评几句又伤不了皮毛,也影响不了我的工作和正常生活,只要给大家带来快乐,我就很开心,似乎历史上很多想法都是在争吵中诞生的.

一些IP查询网站

- 19GHz - iGFW
一些境内服务器的IP查询网站:. 一些境外服务器的IP查询网站:. https://whoer.net/ (支持https). 各网站查询到的IP归属地可能有差异,以apnic.net为准. 本文原始地址:http://igfw.tk/archives/5611.

TCP/IP重传超时--RTO

- dennis - 一个故事@MySQL DBA
Shared by 子非鱼 安知余(褚霸). 概述:本文讨论主机在发送一个TCP数据包后,如果迟迟没有收到ACK,主机多久后会重传这个数据包. 主机从发出数据包到第一次TCP重传开始,RFC中这段时间间隔称为retransmission timeout,缩写做RTO. 本文会先看看RFC中如何定义RTO,然后看看Linux中如何实现.

IP地址库介绍

- Wolf - 淘宝核心系统团队博客
在CDN系统中,IP地址库在流量调度、网络服务质量监测等方面起到重要的作用,本文主要介绍了IP地址库的功能、内容以及IP地址库的生成和评价方法. 所谓IP地址库,指的是提供了IP地址(段)同地理、ISP、结构等信息映射关系的一组数据. IP地址库应用的场合较为广泛,下面举几个常见的例子:. (1)根据客户的IP地址确定客户来源,为后期的客户行为分析提供基础,例如需要统计学生群体的访问特点,这时我们就是通过分析来自教育网的IP地址的那些请求得到的.

[转]【linphone】android--ip电话

- - 小鸥的博客
android2.3部分的sip实现.           manager = SipManager.newInstance(this); //初始化call manager.         initializeLocalProfile(); //初始化profile,也即是参数.         //得到username,pwd, domain.

各个IP API接口

- - 谁主沉浮
腾讯的IP地址API接口地址: http://fw.qq.com/ipaddress. 返回的是数据格式为:var IPData = new Array(“114.218.183.139″,””,”江苏省”,”苏州市”);. .

获取google IP段方法

- - 运维生存时间
Google越来越难访问了,多半是修改hosts,然而IP也不是总是可用的,可能被GFW封闭了,也可能是Google IP变动了. 然而,搞技术的,靠国内的破逼搜索,能搜索到个毛线. 要想访问Google可以看下这篇文章介绍的方法《 google搜索被屏蔽的完美解决方法》. 下面来说说如何获取Google IP段的方法,非常简单.