首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

一文秒懂 TCP/IP实际五层结构

00 引言

本运维老狗在TCP/IP实际五层结构(上篇)中详细讲解了TCP/IP实际结构,以及实际结构中低层协议(以太网和IP协议)。好多同学直呼没看过瘾,迫切的想看本运维老狗对实际结构中高层协议的讲解。

应同学们的要求,TCP/IP实际五层结构(中篇)在运维间隙中赶制出来了。废话不多少,直接上干货。

01 UDP协议

UDP是一个简单的面向数据报的传输层协议,不提供可靠性。意思就说UDP是个愣头青,上来就发数据,不管对端是否准备好。

使用UDP的应用进程需要控制UDP数据报的长度,不能让其超过网络MTU值,不然就会产生IP分片。因为UDP进程的每个输出操作都正好产生一个UDP数据报,并组装成一份待发送的IP数据报。

小做复习,回顾一下UDP首部的位置。UDP数据报作为IP数据报的数据部分,包含在IP首部中。如下图所示:

02 UDP首部

上文说的UDP是个简单的协议,有同学可能还有疑惑,UDP能有多简单?一点不假,非常简单,UDP首部啥也没有。且看下图,UDP首部只有四个部分:源端口号、目端口号、UDP长度和UDP检验和字段。

(1)端口号 (16位)

端口号表示发送进程和接收进程。

UDP端口号和TCP端口是相互独立的,有些知名服务的UDP和TCP使用相同的端口,只是为了使用方便。比如DNS的TCP 53端口和UDP 53端口。

(2)UDP长度 (16位)

UDP长度字段指的是UDP首部和UDP数据的字节长度之和。

理论上来说UDP的长度可达2^16字节,即65535字节。

下图展示了UDP长度为55字节的数据包。我们算一下,55字节(UDP长度) = 47字节(UDP数据)+ 8字节(UDP首部)。

(3)UDP检验和 (16位)

UDP检验和覆盖UDP首部和UDP数据。UDP和TCP在首部中都有覆盖它们首部和数据的检验和。UDP的检验和是可选的,而TCP的检验和是必须的。

UDP检查和中需要出现UDP伪首部。我们知道,UDP首部非常简单,只有源目端口号和UDP长度等信息。UDP的检验和为了验证UDP两次检查(发包检查、收报检查)数据是否已经正确到达目的地,就必须增加一些额外的信息,如源目IP地址等信息。

UDP伪首部的结构如下图所示:

03 分片

物理层会限制每次发送数据帧的最大长度(在上篇以太网章节的MTU部分介绍过长度会被限制的原因),当网络层收到一份待发送的IP数据报时,会进行选路(选择出接口),并查询该接口MTU值。

如果IP数据报中的数据长度大于该接口MTU值,会发两种情况:丢包或分片。当IP数据包开启允许分片功能,则会进行分片,否则就丢包。

下图通过展示长度为1502字节的报文来展示分片的原理。

分片的步骤如下:

A.UDP应用的进程进行一次输出操作,产生一个UDP数据报,假设该数据报的UDP长度是1482字节。加上IP首部20字节,刚好超过了1500字节。

B.我们假设该IP数据报开启了允许分片功能,即IP首部的标志字段的“Don’t Fragment”位不置位(即为0)。

C.IP数据报在发出数据接口上,产生了分片。IP数据包被分成了两片。两片各组成了独立的分组,都具有自己的IP首部。但只有第一片会有UDP首部。第二片只有IP首部和分片的数据部分。其中第一片的UDP数据大小为1472字节,第二片的UDP数据大小为2字节。

D. IP数据报分片以后,只有到达目的端才进行重组装。重组装由目的端的IP层来完成,其目的是使分片和重组装的过程对传输层是透明的。

说到这里,有的同学就可能有疑惑了:

1.什么每片都有IP首部,但只有第一片有UDP首部?

2. 目的端收到的很可能是顺序被打乱的IP数据报,那分片是如何在目的端被正确组装的?目的端怎么确定分片IP数据包的数量的?

好嘞,老狗在这里给同学们做个解释。

疑惑一的解答:这么设计完全是基于传输效率考虑的。首先,每片都要有IP首部,原因是为了让数据包能够到达正确的目的地,这是必不可少的。其次,只要分片能够在目的端被正确组装,那就只需要其中一片中有UDP首部即可,不必把UDP首部放在每一片中。

那怎么才能保证分片被正确组装呢?正好看第二个疑惑。

疑惑二的解答:通过UDP首部的分析,我们知道了UDP首部中UDP长度为16bit,也就是说,UDP长度最大能达到65535个字节。这么大的UDP数据,足够分四五十片的。这些分片如何被正确组装,就非常重要了。

老狗在上篇介绍IP首部时说过,IP首部中的标识字段、标志字段和片偏移字段主要用于分片。也正是这三个字段帮助目的端正确组装了分片。

标识字段能够唯一地标识主机发出的每一份数据报,该值在数据报分片时被复制到每个片中。这就让分片中有了相同标识ID,便于目的端找出哪些分片的IP数据包。

要想保证所有分片的IP数据报都找出来,就要先找一片标志字段的MF=0(即不再有更多分片)的IP数据报,确认分片都已经传输完成。

最后是重组,需要确认每片的先后顺序。片偏移字段能够确认某个分片偏移原始数据包开始处的位置。

至此,分片的原理就介绍的差不多了。需要赶紧找个案例来练练手。

现在用电脑PING大包(数据部分5000字节)来看看分片情况。通过Wireshark抓包进行数据包分析,可以看到完全符合刚才讲的分片原理。

04 总结

简单的UDP首部决定了UDP协议的特性。比如UDP不可控,容易产生分片;UDP不稳定,在网络质量差的时候容易丢包;UDP不可靠,不能保证数据传输的完整。有的同学又心生疑惑了,有这么看起来UDP协议都是缺点,还会有用武之地?可靠稳定的TCP协议为什么不独占天下?

这里就要先卖关子,待本老狗讲解完TCP协议后,大家就都明白了。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20200917A0M5OM00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券