TCP报文一次性最大运输的货物量(Payload),大体可以这么来计算:

IP报文头长度  +  TCP报文头长度  +  Payload长度  ≤ MTU

即左边的三者之和,要小于等于右边MTU的长度,其中:

Internet 路由器接口标准MTU = 1500

IP报文头长度 = 20

TCP报文头长度 = 20

所以

Payload长度≤ MTU – IP报文头长度 – TCP报文头长度

                    ≤ 1500 -20 -20

                    ≤ 1460

TCP为了提高传输效率,通常会使用最大上限1460字节来传输应用层数据,如http,除非http待传输数据小于1460。

但是TCP没有那么简单,所以还需要考虑得更多一点。

TCP报文通常有3部分组成:IP Header + TCP Header + Payload

但是,当前主流操作系统的TCP/IP协议栈,为了提高传输性能,通常还会使用 TCP Option选项。

一个例子

客户端在TCP握手连接,告诉服务器自己支持以下三个option:

(1)   Maximum Segment Size

(2)   SACK Permitted

(3)   Timestamp

服务器接收到该报文,却有不同的意见,服务器只支持这三者中的Maximum Segment Size

Option,翻译成中文是选项。所谓选项,不是强制标准,对方如果不支持或不理解,完全可以忽略。

在这里服务器并没有打算支持选项2 ,3, 所以双方共同支持双方的交集,即选项1。

Maximum Segment Size

MSS的存在是为了通信双方交换各自TCP Payload最大传输长度,这个长度上限一般为1460,即上文计算的方法。

如果双方的MSS不一样,将选择较小的MSS值,作为接下来通信Payload的长度上限。

假如服务器支持选项2,“Timestamp”,那么TCP报文将会包含4部分:

IP Header + TCP Header + TCP Option +Payload

这里的TCP Option为“Timestamp”,长度为 10字节,看看 Payload最大可以传输多少字节?

IP Header + TCP Header + TCP Option +Payload ≤ 1500

 

IP Header + TCP Header + Timestamp +Payload ≤ 1500

 

Payload ≤ 1500 - IP Header -TCP Header – Timestamp

              ≤ 1500 -20 -20 -10

              ≤ 1450

简而言之,没有携带option的TCP报文,最大可以支持1460字节的Payload长度。

一旦携带option,由于option需要占用空间,留给payload的空间将会相应减少,具体减少的空间等于option占用的空间。

Payload长度和Window Size有关系吗?

有一点点关系。

如果把Payload 1460看成一个标准的集装箱,Window Size可以看作双方的仓库大小,用于临时堆放对方运过来的集装箱,在集装箱被客户运走之前,一直会呆在TCP仓库里。

为了更高效地利用仓库,最理想的方法就是,仓库的大小是集装箱的整数倍,这样就不会产生零星的空间。

零星的空间一直无法使用,因为不够容纳一个标准集装箱,势必会造成仓库空间的浪费。

空间浪费只是直接后果,还有一个间接后果,更加严重。

假设接收方的仓库空间还有200字节,于是通过window size update消息告诉发送方。

发送方心急火燎发200字节,那么一个标准1460报文,将会分成8个小报文发送,这样的传输效率会非常低下。

为了避免这种低效传输场景,TCP协议有了新的严格规定:

如果 window size < MSS , 不允许更新自己的window。

上文用通俗语言表达为,一旦接收方的仓库空间小于一个标准集装箱,window size update = 0 , 即善意欺骗对方,仓库已经用完,不允许再发货物过来。

以上是从接收方入手,万一接收方没有遵守规定,那就让发送方严格执行另外一个规定。

发送方一旦发现对方的window size < MSS,理解为对方的仓库已经占满(剩余空间不足以容纳一个标准集装箱),不会发送任何集装箱。

TCP/IP中的Payload概念以及由此引申出的一些问题的更多相关文章

  1. TCP/IP中链路层的附加数据(Trailer数据)和作用

    1.TCP/IP中链路层的附加数据是什么 在用wireshark打开报文时,链路层显示的Trailer数据就是附加数据,如图 2.如何产生 1.例如以太网自动对小于64字节大小的报文进行填充(未实验) ...

  2. TCP/IP中最高大上的链路层简介(二)

    引言 对于程序猿来讲,似乎越接近底层,就越显得高大上.这也算是程序猿们的共同认知吧,虽然不是所有人.今天LZ就和各位一起探讨一下TCP/IP中最高大上的一层,也就是最底层的链路层. 这一层LZ了解的还 ...

  3. TCP/IP协议原理与应用笔记11:TCP/IP中地址与层次关系

    1. 网络中常用的地址: 2. TCP/IP中地址与层次关系 :

  4. TCP/IP 物理层卷一 -- 基本概念

    一.基本概念: 物理层:TCP/IP 协议簇的最底层,物理层所需要考虑的是如何在连接计算机的传输媒体上传输数据的比特流,而不是连接计算机的具体物理设备. 信号:数据的电气或电磁表现,是数据在传输媒体上 ...

  5. TCP/IP详解系列 --- 概念总结01

    UDP协议  .vs.  TCP协议:  原理上:(TCP报文段. vs . UDP用户数据报) TCP协议的特性: TCP是面向连接的运输层协议,应用程序在使用TCP协议之前,必须先建立TCP连接. ...

  6. TCP/IP 协议大致的概念

    最近在看<图解HTTP>和<HTTP权威指南>,对TCP/IP大致过了一下. TCP/IP 不仅仅是TCP 和 IP  TCP/IP 是协议族,与之相对的事IEEE等标准组织设 ...

  7. TCP/IP中你不得不知的十大秘密

    这段时间 有一点心很浮躁,不过希望自己马上要矫正过来.好好学习编程!这段时间我想好好地研究一下TCP/IP协议和网络传输这块!加油 一.TCP/IP模型 TCP/IP协议模型(Transmission ...

  8. TCP/IP中的传输层协议TCP、UDP

    TCP提供可靠的通信传输,而UDP则常用于让广播和细节控制交给应用的通信传输. 传输层协议根据IP数据报判断最终的接收端应用程序. TCP/IP的众多应用协议大多以客户端/服务端的形式运行.客户端是请 ...

  9. tcp/ip 中的分组和分片

    osi 大家应该都知道osi七层模型吧,物理层 链路层 网络层 传输层 会话层 表示层 应用层ip 属于网络层,tcp 属于传输层,你可以把每一层想像成粽子的粽叶,包裹了七层的粽子最外面的就是物理层, ...

随机推荐

  1. 建议收藏!利用Spring解决循环依赖,深入源码给你讲明白!

    前置知识 只有单例模式下的bean会通过三级缓存提前暴露来解决循环依赖的问题.而非单例的bean每次获取都会重新创建,并不会放入三级缓存,所以多实例的bean循环依赖问题不能解决. 首先需要明白处于各 ...

  2. C#——线程总结

    #线程详解 1. Thread基础之从 WinDbg 角度理解你必须知道的时间和空间上的开销 一:空间上的开销 1.thread本身来说就是操作系统的概念... <1> thread的内核 ...

  3. [leetcode]168. Excel Sheet Column Title表格列名编码(十进制和多进制相互转换)

    其实就是一道,十进制转多进制的题 十进制转多进制就是从后边一位一位地取数. 这种题的做法是,每次用n%进制,相当于留下了最后一位,然后把这位添加到结果最前边.结果需要转为进制的符号. 下一次循环的n变 ...

  4. [leetcode]79.Search Word 回溯法

    /** * Given a 2D board and a word, find if the word exists in the grid. The word can be constructed ...

  5. Android驱动学习-内部机制_回顾binder框架关键点

    内部机制_回顾binder框架关键点server注册服务时, 对每个服务都提供不同的ptr/cookie,在驱动程序里对每个服务都构造一个binder_node, 它也含有ptr/cookie cli ...

  6. JavaScript window.onload 事件和 jQuery ready 函数有何不同?

    JavaScript window.onload 事件和 jQuery ready 函数之间的主要区别是,前者除了要等待 DOM 被创建还要等到包括大型图片.音频.视频在内的所有外部资源都完全加载.如 ...

  7. 痞子衡嵌入式:Farewell, 我的2020

    -- 题图:苏州大学老校门 2020年的最后一天,痞子衡驱车300多公里从苏州赶回了苏北老家(扬州某边陲小镇),连镇铁路虽然新通车了,解决了苏南苏北多年的铁路不直通问题,但奈何痞子衡老家小镇离最近的火 ...

  8. HttpMessageConverter那回事

    相信使用过Spring的开发人员都用过@RequestBody.@ResponseBody注解,可以直接将输入解析成Json.将输出解析成Json,但HTTP 请求和响应是基于文本的,意味着浏览器和服 ...

  9. 【转载】VUE的背景图引入

    我现在的项目要将登录页面的背景引一图片做为背景图片,按原jsp中的写法,发现无法找到背景图片,最后从网上查资料,采用上面的写法,成功显示出背景图片,参考网址 https://blog.csdn.net ...

  10. LAMP搭建示例

    lamp介绍 其实就是由Linux+Apache+Mysql/MariaDB+Php/Perl/Python的一组动态网站或者服务器的开源软件,除Linux外其它各部件本身都是各自独立的程序,但是因为 ...