TCP在三次握手过程中做了什么?
本文只介绍三次握手过程中做了哪些事,至于和握手相关联的问题这里就不展开了。
先来看几张图,我们都知道OSI七层模型、TCP/IP四层模型,它们的对应关系如下:
以太网帧格式如下:
看完图之后我们来说说MTU、MSS。
MTU:
最大传输单元(Maximum Transmit Unit),以太网对数据帧长度有个限制,即物理接口(数据链路层)对IP层(网络层)的一个限制,这个限制大小一般是1500Byte。如果IP层有一个数据包要传,若这个数据报长度 <= 1500,则IP层不需要分片,一个数据报即可传出,若这个数据报长度 > 1500,那这个数据报就要分成若片,这样每一片都不大于1500,这些分片的IP Header ID相同。所以MTU是IP层(网络层)的概念。
MSS:
最大报文段长度(Maximum Segment Size),表示TCP层传往另一端的最大块数据长度。表示范围参考上图的以太网帧格式。针对以太网接口来说,MTU = 1500 Byte,则MSS = 1500 - 20(IP Header) - 20(TCP Header) = 1460 Byte。若应用层发送2000Byte数据,则要分两个数据段发送,第一个数据段 = 1460,第二个数据段 = 540。所以MSS是TCP层(传输层)的概念。
说完概念之后,大家看看常见的握手流程:
至此,看了这么多图以后,总结下三次握手阶段主要是协商确定一些数据,确定的数据如下:
- Socket:由IP地址和端口号组成。
- 序列号:用来解决乱序问题等。
- 窗口大小:用来做流量控制,严格来说是确定双方的窗口放大因子(Window size scaling factor),因为窗口大小在后续的交互中还会变。
- MSS:最大数据报文长度,防止IP层分片,提升传输效率。
这里针对TCP窗口着重提下两点:
- 接收缓存的大小是该连接上所能够通道的最大窗口大小。
- 发送缓存 > 接收方响应的窗口 > 已发送字节。
理论说完了,我们再看看握手过程中的实际抓包图
抓包概略图
【A->B: SYN】
Win:8192,
MSS:1460,
WS:4
A端通知B端我的窗口是8192Byte。
【B->A: SYN + ACK】
Win:29200
MSS:1460
WS:32
B端通知A端我的窗口是29200Byte。
【A->B: ACK】
Win:17520
A端最后确认通知B端我的窗口是17520Byte。
另外有一点,这个窗口在后期的通信交互中是可动态变大变小的。
参考
https://www.jianshu.com/p/c48c61b164e9
https://blog.csdn.net/qq_34827674/article/details/105331617