Loading... # TCP 数据包Packet是固定的,为1522字节,其中负载是1500字节,22字节为头信息Head | HEAD | HEAD | HEAD | DATA | | - | - | - | - | | 以太网 | IP | TCP | Application | IP数据包在以太网Packet中,其总负载为1500字节,其中20字节作为头信息,IP有效负载为1480字节 TCP数据包在IP数据包的负载中,其头信息也需要20字节,所以一个TCP数据包的有效负载为1460字节 由于 IP 和 TCP 协议往往有额外的头信息,所以 TCP 负载实际为1400字节左右。 ## SEQ编号 一个包可以有1400字节左右数据,如果一次性发生大量数据,就必须要分包,比如10MB需要(10 * 1024 * 1024) / 1400 个包 发送时TCP协议为每个包都有加编号,以便按顺序还原。 第一个包的编号是随机数 第二个包的编号是第一个包的编号+负载长度 如第一个包的编号为1,负载长度100字节,第二个包的编号则为101 ## 数据包分片 ``` ping -f -l 1500 192.168.1.1 ``` -f 禁止分片 -l 数据包负载1500字节 返回 ``` 需要拆分数据包但是设置 DF。 需要拆分数据包但是设置 DF。 需要拆分数据包但是设置 DF。 需要拆分数据包但是设置 DF。 ``` 改为 1472 可正常ping通 由于封包原因,1472应增加28,即MTU为1500,对应以太局域网 > 默认值:1500 > PPPoE/ADSL:1492 > Dial Up/Modem:576 20-byte for ip header 8-byte for icmp header  MTU: 定义IP数据包的最大字节数,包括IP标头,协议标头(TCP/UDP/ICMP)和有效载荷,协议头可以是不同标头的组合,如IPSec具有TCP或UCP,AH和ESP标头。 MSS: 定义协议标头后的最大字节数,即为单个数据包的最大有效负载。 ## TCP数据包组装 收到TCP数据包后,组装还原是操作系统完成的,应用程序不会直接处理TCP包。 TCP没有提供任何机制,表示源文件的大小,由应用层的协议来规定。 如HTTP头协议Content-Length即表示信息体的大小,对操作系统来说,只是持续接受TCP包并组装好。 当组装好TCP数据包,会将其转交给应用程序。 应用程序收到组装好的原始数据后,以HTTP为例,会根据HTTP协议的Content-Length读出一段段数据,即一次TCP通信可以包含多个HTTP通信。 ## ACK 一般情况下,接收方每收到两个TCP包就要发送一个确认("acknowledge")包,简称ACK包。 ACK携带两个信息 * 期待收到下一个数据包的编号 * 接收方接收窗口的剩余容量 ## 数据包遗失重发 TCP可以保证数据的完整性,借由SEQ编号,若下一个数据包没收到,ACK的编号就不会发生变化,如果此时收到了其他的SEQ编号,会发送带有对应SEQ的ACK。 如果发送方收到了三个连续重复ACK,或者超时还没有ACK,就会确认丢包,再次发送这个包。 ## 参考链接 [http://www.ruanyifeng.com/blog/2017/06/tcp-protocol.html](http://www.ruanyifeng.com/blog/2017/06/tcp-protocol.html) [https://support.citrix.com/article/CTX115434](https://support.citrix.com/article/CTX115434) 最后修改:2021 年 03 月 18 日 03 : 00 PM © 允许规范转载