在看《Linux高性能服务器编程》的过程中,TCP/IP 的章节里发现了几个比较有意思的名词:报文段、数据报、数据包和帧。这几个名词都是在讲协议部分出现的,一开始没明白有哪些区别、哪些联系,后来仔细想了下,又查了一下,似乎了解了大概。
帧与数据包
首先不容易理解的是数据包
和帧
。
数据包,就是从最上层,一层一层封装,直到网络层的,最后借由数据链路层发送出去的数据单元。
帧,是数据链路层的传输单元。
这么一看,数据包和帧好像没什么不一样,好像数据传递的都是一样的。可是为什么会把它们区分开呢?学习 TCP/IP 协议的同学应该都知道,数据链路层中有 MTU 这样一个东西,它是帧最大传输单元。
数据包是一个完整的数据单元,但是如果数据包的大小超过了 MTU 呢?所以,可能许多帧组合在一起,才能形成一个完整的数据包,这就是帧和数据包的关系。
数据包与数据报
说完了数据包与帧,那么数据包与数据报又是什么关系呢?
数据包是整个的数据单元,那么数据报就是组成这一个数据单元的分组。每一层封装后的数据都可以称作数据报也就是说,一个完整的数据包是有若干个数据报组成的。
而和帧不同的是,帧是作为数据链路层的传输单元,而数据报数据包的分组。
数据段
在看协议的时候,有了一个疑问,那就是同是在传输层的 TCP 和 UDP 两个协议,一个称为 TCP 数据段,一个称为 UDP 数据报。这是为啥嘞?
原来上面的数据报还有一条,数据报是面向无连接传输的协议,而 TCP 是面向连接的协议。
UDP 是无连接的协议,就是随着 IP 一起传输就可以了,不必去管连接和分组问题。可是 TCP 不一样了,面向连接,在数据部分很大的时候,要分组。这样每个分组就称为 TCP 数据段。这些 TCP 段组成了一个完整的 TCP 数据报。
后记
这几个概念算是勉勉强强自圆其说了。菜鸟文章,大神路过如果有错误欢迎指正,非常非常感谢!
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。