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 属于传输层,你可以把每一层想像成粽子的粽叶,包裹了七层的粽子最外面的就是物理层, ...
随机推荐
- springBoot整合Sentinel实现降级限流熔断
由于hystrix的停止更新,以及阿里Sentinel在历年双十一的贡献.项目中使用了Sentinel,今天我们来讲讲Sentinel的入门教程,本文使用1.6.3版本进行讲解 本文通过Sentine ...
- 什么是ZooKeeper?ZooKeeper分布式事务详解
前言 上一章我们了解了zookeeper到底是什么,这一章重点来看zookeeper当初到底面临什么问题? 而zookeeper又是如何解决这些问题的? 实际上zookeeper主要就是解决分布式环境 ...
- 本地TOMCAT启动打包项目(WAR)
首先打个包,右击项目-->Export... 选择WEB-->WAR file-->Next 选个放置地址,勾选红框处-->finish 找到自己的tomcat目录 ...
- 简单web页面第一步---表单
1 <%@ page language="java" contentType="text/html; charset=UTF-8" 2 pageEncod ...
- erlang开发环境(IDE)搭建
1.首先推荐:intellij idea http://www.open-open.com/news/view/44c90e 2.webstorm: http://plugins.jetbrains. ...
- Asp.net Core 2.0 实现Cookie会话
与1.0版本相比微软做了一些调整.详细请参考官方文档,我这里就讲2.0的吧 1.首先要在 根目录下 Startup.cs 类中启用 cookie会话,有两处要配置 第一处在 public void ...
- 浅谈connect,withRouter,history,useState,useEffect
1.connect in umi connect 可以链接不同的组件,从而在这个组件中使用其他组件的参数,常用于获取redux中存取的值. 2.withRouter in umi withRouter ...
- Linux下的upx命令学习
upx学习 今天我们来学习一款给应用加壳的软件,叫做upx(the Ultimate Packer for eXecutables) 首先我们先看下它**百科的释义: UPX (the Ultimat ...
- SpringBoot2.+restful风格请求方式设置以及表单中日期格式设置
1).SpringBoot在自动配置很多组件的时候,先看容器中有没有用户自己配置的(@Bean.@Component)如果有就用用户配置的,如果没有,才自动配置:如果有些组件可以有多个(ViewR ...
- pidof
pidof 服务名称,就可以查看到服务占用的进程号