3.2 多路复用与多路分解
- 将传输层报文段中的数据交付到正确的socket的工作称为多路分解
- 在主机中从不同的socket中收集数据块,并封装上首部信息从而生成报文段,然后将报文段传递到网络层,这称为多路复用
- UDP通过远端port和目的端port确认一个socket做多路分解
- TCP通过远端IP/port和目的端IP/port这个四元组确认一个socket做多路分解
- UDP报文段结构
- TCP报文段结构
- 源端口号
- 目的端口号
- 检验和
- 32bit 序号(用于实现可靠传输服务)
- 32bit 确认号(用于实现可靠传输服务)
- 16bit 接收窗口(用于实现流量控制)
- 4bit 首部长度字段
- 6bit 标记
- 序号字段
TCP为每一个字节做编号,例如500000字节文件编号,MSS为1000字节,那么会有500个报文段切分,给第一个报文段序号0,
给第二个报文段序号1000,以此类推
- 确认号字段
在双向交流中,主机A已经接收到了来自主机B的0-536字节的报文段,假设A打算准备发送给B一个报文段,那么在确认号字段中会填写536,代表A期望从B接收的下一个字节的序号
- 接收窗口
用于给发送方一个提示,接收方的缓存还有多少可用空间。
- 主机A通过两个变量LastByteRcvd、LastByteRead计算还没读取的字节数,再用RcvdBuffer减去这部分,得出窗口。
- 主机B通过两个变量LastByteSend、LastByteAck计算出已知在路上的数据是多少,只要保证这个值比窗口小,就不会发生缓存溢出
3.5.6 连接管理
建立TCP连接的步骤
- 首先客户端会向服务端发送一个特殊的报文段,将首部的一个标志位(SYN比特)置为1,这个报文段被称为SYN报文段;同时,还会随机选择一个初始序号(client_isn)放置在首部的序号字段中
- 服务端在接收到SYN报文段之后,会为这个连接分配缓存和变量,并向客户端发送允许连接的报文段。那么这个报文段的首部,SYN比特置1, 首部的确认号字段为client_isn + 1, 然后服务端选择自己的初始序号(server_isn)放置在序号字段中,这个特殊报文段被称为SYNACK报文段。
- 客户端收到这个SYNACK报文段之后,也会为这个连接分配缓存和变量。然后客户端会发送最后一个报文段,确认收到SYNACK, 首先需要将首部的确认号字段填写为server_isn + 1, 因为连接已经建立,所以SYN比特置0, 然后在报文段的负载上可以携带应用层的数据了。
关闭连接的步骤
- 客户端想要关闭连接,会向服务端发送一个特殊的报文段。首先将首部的标志字段的FIN比特置1
- 服务端收到该特殊报文段之后,会回送一个确认报文段ACK
- 然后服务端会发送自己的FIN特殊报文段
- 客户端会回送一个ACK报文段
然后双方的资源(缓存和变量)都会清除
客户端TCP连接状态(生命周期)

- 客户TCP开始时的状态是CLOSED状态
- 当客户TCP发起一个连接时,会向服务端发送一个SYN报文段,发送之后,客户端的TCP连接处在SYN_SENT的状态,它在等待服务端的SYNACK报文段
- 当收到了来自服务端的SYNACK报文段之后,客户端TCP连接会变成ESTABLISHED状态,客户端就可以发送带有payload的报文了
- 假设客户端想要关闭连接了,这会引起客户端的TCP连接向服务端发送一个FIN报文段,客户端TCP连接会进入FIN_WAIT_1状态,并等待来自服务端的带有确认的报文段
- 当收到服务端的确认报文段,客户端TCP连接进入FIN_WAIT_2状态,并等待服务端的FIN报文段
- 当收到服务端的FIN报文段之后,客户端会回送一个确认报文段,并进入TIME_WAIT状态,假如ACK报文段丢失,那么客户端会重传这个ACK报文段
- 在TIME_WAIT一段时间之后(30s或者其他),连接正式关闭,客户端会释放所有资源
服务端TCP连接状态(生命周期)

特殊情况
- 当服务端接收到一个SYN,但是服务端并没有监听相应的port,那么服务端会发送一个特殊的报文段RST,该报文段会将首部的标志字段的RST比特置1,告诉客户端,服务端没有这个报文段的socket,请不要继续发送
- 那么客户端发起连接请求的时候,就会有三种情况
- 接收到SYNACK,正常建立连接
- 接收到RST,目的端口没有使用
- 什么都没有收到,可能是被防火墙拦下了
posted @
2022-05-22 11:06
huang1993
阅读(
10)
评论()
编辑
收藏
举报
点击右上角即可分享
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?