TCP和1448

1448字节是实际场景下,单个TCP包的实际运载能力。也就是说,实际场景下,上层调用send(1000KB),下层会把这1000KB封装成多个TCP包进行发送。单个TCP包每次打包1448字节的数据进行发送。
详细的TCP在传输情景wireshark截图如图1

图1

每个TCP包在理论上应该能打包更多数据才对,但是实际场景下TCP传输为什么会以这个1448作为打包单位呢?
这个实际TCP单包传输1448字节数据的根源在于“以太网Ethernet最大的数据帧是1518字节”。

1500字节的MTU

以太网Ethernet最大的数据帧是1518字节。以太网帧的帧头14字节和帧尾CRC校验4字节(共占18字节),剩下承载上层协议的地方也就是Data域最大就只剩1500字节. 这个值我们就把它称之为MTU。

我们来看看linux上MTU默认值,查证一下,如图2

图2

这个MTU值可以修改,但是现在大部分计算机网络都被以太网承载,所以修改这个值没有什么实际意义。

MSS决定TCP的单包传输量

MSS就是TCP数据包每次能够传输的最大量。为了达到最佳的传输效能,TCP协议在建立连接的时候通常要协商双方的MSS值,这个值TCP协议在实现的时候往往用MTU值代替(需要减去IP数据包包头的大小20Bytes和TCP数据段的包头20Bytes)所以往往MSS为1460(如图1中红色方框所示的SYN包中的MSS值)。通讯双方会根据双方提供的MSS值得最小值确定为这次连接的最大MSS值。

MSS为1460是由1500-20(IP头)-20(TCP头)计算出的。
实际场景下,TCP包头中会带有12字节的选项—-时间戳。
这样,单个TCP包实际传输的最大量就缩减为1448字节。1448=1500-20(IP头)-32(20字节TCP头和12字节TCP选项时间戳)

回到我们开篇的问题

“每个TCP包在理论上应该能打包更多数据才对,但是实际场景下TCP传输为什么会以这个1448作为打包单位呢?”
理论上,单个TCP包能打包的数据量远远多于1448字节,现在为了适应MTU,只要在以太网上跑TCP,系统就默认最大以1448字节打包TCP。
假如我们用更大的数据量来打包会有什么结果呢?
答案是降低了传输效率。
超过MTU的大包反而降低效率的原因如下:

IP层非常关心MTU,因为IP层会根据MTU来决定是否把上层传下来的数据进行分片。就像一条运输线路的承载能力是有限的,碰到大东西要运输,只能把大东西拆开成为散件,分开运输,到达目的地之后还必须能再次组装起来。 当两台远程PC互联的时候,它们的数据需要穿过很多的路由器和各种各样的网络媒介才能到达对端,网络中不同媒介的MTU各不相同,就好比一长段的水管,由不同粗细的水管组成(MTU不同 :))通过这段水管最大水量就要由中间最细的水管决定。 对于网络层的上层协议而言(我们以TCP/IP协议族为例)它们对水管粗细不在意它们认为这个是网络层的事情。网络层IP协议会检查每个从上层协议下来的数据包的大小,并根据本机MTU的大小决定是否作“分片”处理。分片最大的坏处就是降低了传输性能,本来一次可以搞定的事情,分成多次搞定,所以在网络层更高一层(就是传输层)的实现中往往会对此加以注意!
这个就是在以太网上,TCP不发大包,反而发送1448小包的原因。只要这个值TCP才能对链路进行效能最高的利用。

转载于:https://www.cnblogs.com/CnKker/p/11125030.html

TCP之1460MSS和1448负载相关推荐

  1. TCP/IP的七层负载均衡

    七层负载均衡工作在OSI模型的应用层,应用层协议较多,常用http.radius.dns等.七层负载就可以基于这些协议来负载.这些应用层协议中会包含很多有意义的内容.比如同一个Web服务器的负载均衡, ...

  2. TCP之深入浅出send和recv

    本篇我们用一个测试机上的阻塞socket实例来说明主题.文章中所有图都是在测试系统上现截取的. 需要理解的3个概念 1. TCP socket的buffer 每个TCP socket在内核中都有一个发 ...

  3. recv/send堵塞和非堵塞

    recv/send堵塞和非堵塞理解 TCP之深入浅出send和recv 需要理解的3个概念 实例详解send() send函数 recv函数 参考: TCP之深入浅出send和recv linux下非 ...

  4. 利用Haproxy实现http和TCP反向代理和负载均衡(入门和技术验证)

    系统访问量上去遇到了性能瓶颈,解决方法一般都是从两个方向入手Scale Up 和Scale Out.Scale Up适用于哪些钱多的系统,因为Scale Up其实就是直接升级硬件,CPU.内存.IO哪 ...

  5. 在深谈TCP/IP三步握手四步挥手原理及衍生问题—长文解剖IP

    如果对网络工程基础不牢,建议通读<细说OSI七层协议模型及OSI参考模型中的数据封装过程?> 下面就是TCP/IP(Transmission Control Protoco/Interne ...

  6. 再深谈TCP/IP三步握手四步挥手原理及衍生问题—长文解剖IP

    转载地址: https://www.zhoulujun.cn/html/theory/ComputerScienceTechnology/network/2015_0708_65.html 如果对网络 ...

  7. server2008网卡驱动包_从网卡发送数据再谈TCP/IP协议—网络传输速度计算-网卡构造...

    在<在深谈TCP/IP三步握手&四步挥手原理及衍生问题-长文解剖IP>里面提到 单个TCP包每次打包1448字节的数据进行发送(以太网Ethernet最大的数据帧是1518字节,以 ...

  8. linux负载均衡(什么是负载均衡)

    linux负载均衡(什么是负载均衡) 一.总结 一句话总结: 建立在现有网络结构之上,它提供了一种廉价有效透明的方法扩展网络设备和服务器的带宽.增加吞吐量.加强网络数据处理能力.提高网络的灵活性和可用 ...

  9. TCP传输的单个报文最大字节(MSS和MTU)

    TCP和1448 1448字节是实际场景下,单个TCP包的实际运载能力.也就是说,实际场景下,上层调用send(1000KB),下层会把这1000KB封装成多个TCP包进行发送.单个TCP包每次打包1 ...

最新文章

  1. 夏天来了,你的数据中心应该跟着热起来
  2. 网络编程五种IO模型之epoll模型
  3. 微信小程序图片轮转播放
  4. python3高性能网络编程_Python3 网络编程
  5. 强制转换const 引用
  6. 【Lucene4.8教程之五】Luke
  7. ios项目icon和default图片命名规则
  8. swool tcp mysql_swoole/mysql(异步)
  9. [译] 想帮助用户做决定?你的APP可以这样设计!
  10. AttributeError: module ‘tensorflow‘ has no attribute ‘xxx‘
  11. Flutter TextField设置默认值默认值和光标位置
  12. linux 驱动 printk 输出变量格式
  13. java 词典 分词_java分词中 用户自定义词典有什么要求
  14. 基于CAN总线的汽车诊断协议--Windows上位机设计
  15. Linux 服务器配置使用密钥登录教程
  16. Optimizing radiotherapy plans for cancer treatment with Tensor Networks解读
  17. c51抢答器程序汇编语言,c51单片机汇编语言单片机八位抢答器程序
  18. Xposed指纹支付插件 安卓版
  19. opengl剪裁空间和视口空间中不遵从右手定则,而是遵从左手定则
  20. ECharts(三)

热门文章

  1. 许昌往事之压力无处不在
  2. Centos7 把php5.4升级到php5.6
  3. Oracle MERGE用法
  4. 试验一下纯手写blog
  5. 使用Ant制作发布版本
  6. LeetCode数据库 180. 连续出现的数字
  7. TensorFlow2.0正式版安装
  8. python随机数小游戏
  9. c语言 选择结构,C语言学习:选择结构
  10. Python中变量判断