draveness / blog-comments

面向信仰编程
https://draveness.me
140 stars 6 forks source link

为什么 TCP/IP 协议会拆分数据 · Why's THE Design? · /whys-the-design-tcp-segment-ip-packet #183

Closed draveness closed 2 years ago

draveness commented 4 years ago

https://draveness.me/whys-the-design-tcp-segment-ip-packet

当应用层协议使用 TCP/IP 协议传输数据时,TCP/IP 协议簇可能会将应用层发送的数据分成多个包依次发送,而数据的接收方收到的数据可能是分段的或者拼接的,所以它需要对接收的数据进行拆分或者重组。本文会分别从 IP 协议和 TCP 协议两个角度出发分析为什么应用层写入的数据包会被 TCP/IP 协议拆分发送。

polaris1119 commented 4 years ago

写的真好,通俗易懂

ralphal commented 4 years ago

TCP分段这里感觉写的有点问题: 1、IP分片不会导致TCP报文段乱序,因为IP包最终会重组; 2、TCP分段只能解决两端不分片,整个链路中还是可能会发生分片的,由链路中间节点的MTU决定。

draveness commented 4 years ago

@ralphal TCP分段这里感觉写的有点问题: 1、IP分片不会导致TCP报文段乱序,因为IP包最终会重组; 2、TCP分段只能解决两端不分片,整个链路中还是可能会发生分片的,由链路中间节点的MTU决定。

没太理解你的意思,TCP 的 MSS 会基于路径 MTU 确定啊

ralphal commented 4 years ago

@draveness

@ralphal TCP分段这里感觉写的有点问题: 1、IP分片不会导致TCP报文段乱序,因为IP包最终会重组; 2、TCP分段只能解决两端不分片,整个链路中还是可能会发生分片的,由链路中间节点的MTU决定。

没太理解你的意思,TCP 的 MSS 会基于路径 MTU 确定啊

PMTU的确能完美解决IP分片问题,不过只是理想状态,MSS协商跟PMTU并不是强相关

draveness commented 4 years ago

@ralphal

@draveness

@ralphal TCP分段这里感觉写的有点问题: 1、IP分片不会导致TCP报文段乱序,因为IP包最终会重组; 2、TCP分段只能解决两端不分片,整个链路中还是可能会发生分片的,由链路中间节点的MTU决定。

没太理解你的意思,TCP 的 MSS 会基于路径 MTU 确定啊

PMTU的确能完美解决IP分片问题,不过只是理想状态,MSS协商跟PMTU并不是强相关

你的意思是 MSS 可能会大于路径发现的 MTU 么,有相关的 RFC 或者 case 么

ArvonHuang commented 4 years ago

分段传输的 TCP 数据

20 字节 IP 头 + 20 字节 TCP 头 + 1460 字节数据

为什么TCP数据会携带IP头?

draveness commented 4 years ago

分段传输的 TCP 数据

20 字节 IP 头 + 20 字节 TCP 头 + 1460 字节数据

为什么TCP数据会携带IP头?

TCP 数据段会被打包成 IP 数据包

saruagithub commented 4 years ago

你好,想知道您的图怎么画的呢

draveness commented 4 years ago

你好,想知道您的图怎么画的呢

看下文章结尾

ralphal commented 4 years ago

@draveness

@ralphal

@draveness

@ralphal TCP分段这里感觉写的有点问题: 1、IP分片不会导致TCP报文段乱序,因为IP包最终会重组; 2、TCP分段只能解决两端不分片,整个链路中还是可能会发生分片的,由链路中间节点的MTU决定。

没太理解你的意思,TCP 的 MSS 会基于路径 MTU 确定啊

PMTU的确能完美解决IP分片问题,不过只是理想状态,MSS协商跟PMTU并不是强相关

你的意思是 MSS 可能会大于路径发现的 MTU 么,有相关的 RFC 或者 case 么

不是,我的意思是,在发送TCP报文前,不能保证一定能学习到PMTU,那么这个时候协商的MSS就可能大于PMTU

anjiadoo commented 4 years ago

有个疑问:如果PMTUD发现了链路最小的MTU,如果在传输的过程中这条链路比较拥挤,是不是会选择另外一条链路,这时的最小MTU可能会变,这个时候怎么办呀?

GavinCruise commented 4 years ago

有个疑问:如果PMTUD发现了链路最小的MTU,如果在传输的过程中这条链路比较拥挤,是不是会选择另外一条链路,这时的最小MTU可能会变,这个时候怎么办呀?

最小 MTU 变了会再走一次 Path MTU Discovery

dawncold commented 4 years ago

"TCP 协议无法的接收"


2020-05-15 UPDATES:已修复

dawncold commented 4 years ago

网络这一部分,再来一两篇讲一下链路、和物理层就全了

draveness commented 4 years ago

网络这一部分,再来一两篇讲一下链路、和物理层就全了

后面有链路层相关的

draveness commented 4 years ago

@draveness

分段传输的 TCP 数据 20 字节 IP 头 + 20 字节 TCP 头 + 1460 字节数据 为什么TCP数据会携带IP头?

TCP 数据段会被打包成 IP 数据包

20 字节 IP 协议头 + 8 字节 UDP 协议头 + 1472 字节数据; 为什么UDP 的1500 没有算上IP头 而 TCP 的 1500包含了 IP头?

可以详细描述下你的问题么,我没有理解你的问题

TigerZhag commented 4 years ago
  1. TCP协议中,如果MSS大于MTU,除了第一个数据包有TCP header,跟着的都没有,即使不丢包,包顺序也不乱,接收方该如何组装数据呀,就凭接受的顺序来拼接吗

  2. UDP数据包大小如果超过了MTU,接收方又是怎么拼接多个数据包的呢

draveness commented 4 years ago
  1. TCP协议中,如果MSS大于MTU,除了第一个数据包有TCP header,跟着的都没有,即使不丢包,包顺序也不乱,接收方该如何组装数据呀,就凭接受的顺序来拼接吗
  2. UDP数据包大小如果超过了MTU,接收方又是怎么拼接多个数据包的呢

IP 数据头里有偏移量,可以搜一下 IP 分片与重组

0xFE2018 commented 4 years ago

@draveness

@ralphal

@draveness

@ralphal TCP分段这里感觉写的有点问题: 1、IP分片不会导致TCP报文段乱序,因为IP包最终会重组; 2、TCP分段只能解决两端不分片,整个链路中还是可能会发生分片的,由链路中间节点的MTU决定。

没太理解你的意思,TCP 的 MSS 会基于路径 MTU 确定啊

PMTU的确能完美解决IP分片问题,不过只是理想状态,MSS协商跟PMTU并不是强相关

你的意思是 MSS 可能会大于路径发现的 MTU 么,有相关的 RFC 或者 case 么

我理解三次握手的时候双方发送的MSS是根据本机的MTU算的吧,网络中如果有较小的mtu的设备,两边的主机会知道么,没发现三次握手前会探测PMTU

TarryHoo commented 4 years ago

看了几遍,有些地方不能理解: 如果一个MSS 的大小 小于 MTU 大小 会直接发送给对方吗? 比如 MSS = 600,MTU = 800

draveness commented 4 years ago

看了几遍,有些地方不能理解: 如果一个MSS 的大小 小于 MTU 大小 会直接发送给对方吗? 比如 MSS = 600,MTU = 800

MSS 和 MTU 是固定值,这两个是不同层协议的设置

TarryHoo commented 4 years ago

@draveness

看了几遍,有些地方不能理解: 如果一个MSS 的大小 小于 MTU 大小 会直接发送给对方吗? 比如 MSS = 600,MTU = 800

MSS 和 MTU 是固定值,这两个是不同层协议的设置

也就是说 MSS只要不超过MTU 就没问题, 那么一个MTU 内部 会包含多个MSS么 不考虑 协议头大小, MTU=2*MSS 我发送3个MSS大小的包给对方, 会发送三个MTU 还是 2个MTU

draveness commented 4 years ago

@draveness

看了几遍,有些地方不能理解: 如果一个MSS 的大小 小于 MTU 大小 会直接发送给对方吗? 比如 MSS = 600,MTU = 800

MSS 和 MTU 是固定值,这两个是不同层协议的设置

也就是说 MSS只要不超过MTU 就没问题,

对,其实超过也没问题,只是 TCP 的数据会被分成多个数据包发送,然后其中任意一个丢了 IP 协议都会重传所有的数据包

那么一个MTU 内部 会包含多个MSS么

一个 IP 数据包可能包含多个 TCP 数据段(Segment)

不考虑 协议头大小, MTU=2*MSS 我发送3个MSS大小的包给对方, 会发送三个MTU 还是 2个MTU

我觉得这个问题意义不大,而且这个问题自己应该可以想明白,再看下 TCP 和 IP 的协议头

monkback commented 4 years ago

UDP和TCP报文因为MTU分片时,好像不太一样,UDP的情况下,第二个分片里面不包含UDP的首部8字节,但是TCP的第二个分片里是包含了TCP的首部20字节的

ermazi commented 3 years ago

默认mss会自动协商,除非遇到某些不支持自动协商的终端设备且链路中存在overlap,举个栗子:通过openvpn/ipsec组网访问阿里云的SLB :D,就会有问题。

caopeirui commented 3 years ago

这个总结很到位!

yixy commented 3 years ago

@ralphal

@draveness

@ralphal

@draveness

@ralphal TCP分段这里感觉写的有点问题: 1、IP分片不会导致TCP报文段乱序,因为IP包最终会重组; 2、TCP分段只能解决两端不分片,整个链路中还是可能会发生分片的,由链路中间节点的MTU决定。

没太理解你的意思,TCP 的 MSS 会基于路径 MTU 确定啊

PMTU的确能完美解决IP分片问题,不过只是理想状态,MSS协商跟PMTU并不是强相关

你的意思是 MSS 可能会大于路径发现的 MTU 么,有相关的 RFC 或者 case 么

不是,我的意思是,在发送TCP报文前,不能保证一定能学习到PMTU,那么这个时候协商的MSS就可能大于PMTU

个人理解,不知道是否有误:

按博主文章里的描述,TCP连接建立时可以通过PMTUD(Path MTU Discovery)协商MSS,理论上可以保证MSS小于PMTU,这点看到在TCP/IP卷1点24.2里也有提到。不过因为网络层路由线路是动态变化的,有可能变小,所以实际上还是有可能发生分片,但是这种情况应该也比不采用PMTUD会好一些。

sidnvy commented 3 years ago

文末总结部分:

IP 协议拆分数据是因为物理设备的限制,一次能够传输的数据由路径上 MTU 最小的设备决定,一旦 IP 协议传输的数据包超过 MTU 的限制就会发生丢包

这里应该是发生分片吧,丢包应该设置了DF才会发生吧


2021-03-15 UPDATES:已修复

stefanxfy commented 3 years ago

IP 协议传输数据丢包是什么概念,是不传直接丢弃了吗

dawncold commented 3 years ago

比如某个路由器处理不过来了,就丢弃了…很无情

On Tue, Jul 27, 2021 at 11:13 AM stefan @.***> wrote:

IP 协议传输数据丢包是什么概念,是不传直接丢弃了吗

— You are receiving this because you commented. Reply to this email directly, view it on GitHub https://github.com/draveness/blog-comments/issues/183#issuecomment-887173927, or unsubscribe https://github.com/notifications/unsubscribe-auth/AAD2YSA72LU7BRKLELNIZYLTZYP4HANCNFSM4KTTMXRA .

-- Zhen Tian

tcitry commented 3 years ago

@ralphal TCP分段这里感觉写的有点问题: 1、IP分片不会导致TCP报文段乱序,因为IP包最终会重组; 2、TCP分段只能解决两端不分片,整个链路中还是可能会发生分片的,由链路中间节点的MTU决定。

写的应该没问题,IP 包是会重组。 而作者意思是有丢包风险,会带来了更多额外的重传和重组开销。

zhouguoqionghai commented 2 years ago

根据我自己的抓包情况,UDP包在IP层被分片,其实是最后一个分片拥有UDP头部。文中提到 2000 字节的UDP包,是第一个IP分片拥有UDP头,这里是否有问题?