计算机网络(自顶向下)-- 读书笔记(Chaptor03)

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连接的步骤

  1. 首先客户端会向服务端发送一个特殊的报文段,将首部的一个标志位(SYN比特)置为1,这个报文段被称为SYN报文段;同时,还会随机选择一个初始序号(client_isn)放置在首部的序号字段中
  2. 服务端在接收到SYN报文段之后,会为这个连接分配缓存和变量,并向客户端发送允许连接的报文段。那么这个报文段的首部,SYN比特置1, 首部的确认号字段为client_isn + 1, 然后服务端选择自己的初始序号(server_isn)放置在序号字段中,这个特殊报文段被称为SYNACK报文段。
  3. 客户端收到这个SYNACK报文段之后,也会为这个连接分配缓存和变量。然后客户端会发送最后一个报文段,确认收到SYNACK, 首先需要将首部的确认号字段填写为server_isn + 1, 因为连接已经建立,所以SYN比特置0, 然后在报文段的负载上可以携带应用层的数据了。

关闭连接的步骤

  1. 客户端想要关闭连接,会向服务端发送一个特殊的报文段。首先将首部的标志字段的FIN比特置1
  2. 服务端收到该特殊报文段之后,会回送一个确认报文段ACK
  3. 然后服务端会发送自己的FIN特殊报文段
  4. 客户端会回送一个ACK报文段
    然后双方的资源(缓存和变量)都会清除

客户端TCP连接状态(生命周期)

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

服务端TCP连接状态(生命周期)

特殊情况

  • 当服务端接收到一个SYN,但是服务端并没有监听相应的port,那么服务端会发送一个特殊的报文段RST,该报文段会将首部的标志字段的RST比特置1,告诉客户端,服务端没有这个报文段的socket,请不要继续发送
  • 那么客户端发起连接请求的时候,就会有三种情况
    1. 接收到SYNACK,正常建立连接
    2. 接收到RST,目的端口没有使用
    3. 什么都没有收到,可能是被防火墙拦下了
posted @   huang1993  阅读(10)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示