TCP/IP中的Payload概念以及由此引申出的一些问题
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概念以及由此引申出的一些问题的更多相关文章
- TCP/IP中链路层的附加数据(Trailer数据)和作用
1.TCP/IP中链路层的附加数据是什么 在用wireshark打开报文时,链路层显示的Trailer数据就是附加数据,如图 2.如何产生 1.例如以太网自动对小于64字节大小的报文进行填充(未实验) ...
- TCP/IP中最高大上的链路层简介(二)
引言 对于程序猿来讲,似乎越接近底层,就越显得高大上.这也算是程序猿们的共同认知吧,虽然不是所有人.今天LZ就和各位一起探讨一下TCP/IP中最高大上的一层,也就是最底层的链路层. 这一层LZ了解的还 ...
- TCP/IP协议原理与应用笔记11:TCP/IP中地址与层次关系
1. 网络中常用的地址: 2. TCP/IP中地址与层次关系 :
- TCP/IP 物理层卷一 -- 基本概念
一.基本概念: 物理层:TCP/IP 协议簇的最底层,物理层所需要考虑的是如何在连接计算机的传输媒体上传输数据的比特流,而不是连接计算机的具体物理设备. 信号:数据的电气或电磁表现,是数据在传输媒体上 ...
- TCP/IP详解系列 --- 概念总结01
UDP协议 .vs. TCP协议: 原理上:(TCP报文段. vs . UDP用户数据报) TCP协议的特性: TCP是面向连接的运输层协议,应用程序在使用TCP协议之前,必须先建立TCP连接. ...
- TCP/IP 协议大致的概念
最近在看<图解HTTP>和<HTTP权威指南>,对TCP/IP大致过了一下. TCP/IP 不仅仅是TCP 和 IP TCP/IP 是协议族,与之相对的事IEEE等标准组织设 ...
- TCP/IP中你不得不知的十大秘密
这段时间 有一点心很浮躁,不过希望自己马上要矫正过来.好好学习编程!这段时间我想好好地研究一下TCP/IP协议和网络传输这块!加油 一.TCP/IP模型 TCP/IP协议模型(Transmission ...
- TCP/IP中的传输层协议TCP、UDP
TCP提供可靠的通信传输,而UDP则常用于让广播和细节控制交给应用的通信传输. 传输层协议根据IP数据报判断最终的接收端应用程序. TCP/IP的众多应用协议大多以客户端/服务端的形式运行.客户端是请 ...
- tcp/ip 中的分组和分片
osi 大家应该都知道osi七层模型吧,物理层 链路层 网络层 传输层 会话层 表示层 应用层ip 属于网络层,tcp 属于传输层,你可以把每一层想像成粽子的粽叶,包裹了七层的粽子最外面的就是物理层, ...
随机推荐
- js--数组的reduce()方法的使用介绍
前言 阅读文章之前先来考虑一个问题,如何去实现迭代一个数组,并且把它累加到一个值中?首先能够想到的是设置一个初始值,然后通过循环遍历这个数组,将数组中的值一项一项累加起来,然后返回这个设置的值就是最终 ...
- 向Docker告别的时候到了
在容器的远古时期(大约4年前),Docker是容器游戏中仅有的参与者.但是现在情况不一样了,Docker不再是唯一的一个了,只是另一个容器引擎而已.Docker允许我们构建,运行,拉取,上传,查看容器 ...
- Java学习日报7.18
/** * *//** * @author 86152 * */ package trangle;import java.util.Scanner; public class Trangle{ pub ...
- 01 . Go之从零实现Web框架(框架雏形, 上下文Context,路由)
设计一个框架 大部分时候,我们需要实现一个 Web 应用,第一反应是应该使用哪个框架.不同的框架设计理念和提供的功能有很大的差别.比如 Python 语言的 django和flask,前者大而全,后者 ...
- 介绍一个新库: Norns.Urd.HttpClient
Norns.Urd.HttpClient Norns.Urd.HttpClient 基于AOP框架 Norns.Urd实现, 是对 System.Net.Http下的 HttpClient封装,让大家 ...
- 在php里做js操作
'echo <script>js_operation</script>';
- [ABP教程]第二章 图书列表页面
Web应用程序开发教程 - 第二章: 图书列表页面 关于本教程 在本系列教程中, 你将构建一个名为 Acme.BookStore 的用于管理书籍及其作者列表的基于ABP的应用程序. 它是使用以下技术开 ...
- 风炫安全WEB安全学习第二十二节课 DOM型XSS讲解
风炫安全WEB安全学习第二十二节课 DOM型XSS讲解 Dom型XSS演示 通过Javascript,可以重构整个HTML文档,你可以添加.移除.改变或重排页面上的项目 要改变页面的某个东西,Java ...
- 多年经验,教你写出最惊艳的 Markdown 高级用法
点赞再看,养成习惯,微信搜索[高级前端进阶]关注我. 本文 GitHub https://github.com/yygmind 已收录,有一线大厂面试完整考点和系列文章,欢迎 Star. 最近在学习的 ...
- linux kernel操作GPIO函数
一.头文件 #include <asm/gpio.h> 二.注册 GPIO int gpio_request(unsigned gpio, const char *label) 功能:申请 ...