传输层 数据传输鱼MSS分段

TCP是面向字节流的协议,它不限制应用层传输消息的长度实际上在TCP之下的网络层和数据链路层,由于发送报文使用的内存是有限的,所以一定会限制报文的长度。

因此TCP必须将其从应用层那里接收到任意长度的字节流切分为许多报文段,拆分报文段的依据是什么呢?

下面来看看如何基于mss最大报文段大小来进行TCP报文段的拆分。

TCP 应用层编程示例


 如果直接使用TCP socket库去编程的话,client向server去建立连接的时候,需要建立一个socket,会去调用connect方法,server端会在accept成功建立连接之后,在连接的状态看到establish之后进入下一个阶段,也就是传输数据的阶段。

在传输数据的时候调用write就是发送消息,read可以从内存当中接受任意长度的消息。

TCP 流的操作


实际上在操作系统当中会发生什么?

操作系统的内核栈会将发送的消息拆分为许多segement的报文段。

TCP 流与报文段


上面一个应用程序向另外一个应用程序发送了22个字节,前面3个字节通过tcp发到了应用程序当中,那么4 5 6 7这4个字节正在TCP栈当中,8 9还在网络当中传输,10 11 12 13可能从IP层下来,正在数据链路层处理,14 15 16 17 18还在TCP栈当中,19-22还在应用层当中,应用程序很有可能是从1发到22字节的,实际上发送的是流,拆分为了很多segment段,这个流分段的依据是什么呢?

流分段大小的依据
MSS:防止 IP 层分段 (如果tcp不分段的话,ip层一定会分层,一定要避免ip层分层,因为ip层分层是十分没有效率的)
流控:接收端的能力(比如接收端一次可能只能接受3个字节了,所以它只能发送3个字节过来,可能这台服务器非常的繁忙,内存以及不够使用了,或者应用程序没有及时的将缓冲区当中的数据读取出来,所以需要现在进行流控,这个时候也会影响分段的大小)

MSS:Max Segment Size 最大段的大小


定义:仅指 TCP 承载数据,不包含 TCP 头部的大小,参见 RFC879

MSS 选择目的
尽量每个 Segment 报文段携带更多的数据,以减少头部空间占用比率(因为头部是固定的20个字节,20个字节的ip头部,如果携带的数据量比较小的话,头部占用的空间比率就比较大,实际上传递信息的效率就比较低)
防止 Segment 被某个设备的 IP 层基于 MTU 拆分
默认 MSS:536 字节(默认 MTU576 字节,20 字节 IP 头部,20 字节 TCP 头部)
握手阶段协商 MSS
MSS 分类
• 发送方最大报文段 SMSS:SENDER MAXIMUM SEGMENT SIZE
接收方最大报文段 RMSS:RECEIVER MAXIMUM SEGMENT SIZE

TCP 握手常用选项 


猜你喜欢

转载自blog.csdn.net/qq_34556414/article/details/125730860
今日推荐