计算机网络③TCP 与 UDP

4、TCP 与 UDP

4.1、传输层的作用

  1. IP 首部:协议字段,标识在网络层的上一层所采用的传输层协议。

    计算机网络③TCP 与 UDP
  2. 传输层首部:根据端口号,标识在传输层的上一层应用层的具体应用程序。

  3. C/S 模式

    • Server:服务端,守护程序(daemon)提前启动,等待客户请求。提供服务的一方。
    • Client:客户端,使用服务的一方。
  4. 套接字(Socket)

    计算机网络③TCP 与 UDP

4.2、端口号

  • 数据链路层:MAC 地址
  • 网络层:IP 地址
  • 传输层:端口号
  1. 端口号:识别同一台计算机中进行通信的不同应用程序。
  2. TCP/IP 或 UDP/IP 通信:通常采用 5 个信息
    • 源主机 IP 地址
    • 目标主机 IP 地址
    • 协议号
    • 源主机端口号
    • 目标主机端口号
  3. 确定方式
    • 静态方法:每个应用程序指定端口号。
      • 知名端口号(Well-Known):0 到 1024 之间;
      • 应用程序应避免使用知名端口号:19152 到 65535 之间
    • 动态方法(时序分配法)
      • 服务器需要监听端口号,但客户端无需确定端口号;
      • 操作系统可以为每个应用程序分配互不冲突的端口号(如在之前分配号码的基础上加 1);
      • 取值在 49152 到 65535之间。
  4. 端口号由传输层协议决定,不同传输协议可以使用相同的端口号。
  5. 数据到达接收端 IP 层后,会先检查 IP 首部的协议号,再传给相应传输层协议的模块。

4.3、UDP

用户数据报协议(User Datagram Protocol)

面向无连接的,不可靠的数据报协议

  • 无连接:收到应用程序的数据时,立刻按照原样发送到网络上。
  • 不可靠性:不负责可靠的细节控制,若有需要则由采用 UDP 的应用程序处理。
  • 场景
    1. 包总量较少:DNS、SNMP 等;
    2. 即时通信:视音频等多媒体;
    3. 广播通信:广播、多播;
    4. 限定于 LAN 等特定网络的应用通信。

4.4、TCP

传输控制协议(Transmission Control Protocol)

面向连接的、可靠的流协议

  • 面向连接:确认通信对端存在时,才会发送数据。
  • 可靠性:实现了数据传输时的控制功能
    • 保序、重发、流量控制、拥塞控制、提高网络利用率等;
    • 通过检验和、序列号、确认应答、重发控制、连接管理、窗口控制等机制实现。

ACK & SEQ

  • ACK(Postive Acknowledgement):确认应答
  • SEQ(Sequence Number):序列号

TCP 通过 ACK 和 SEQ 实现可靠传输。

ACK

  1. 当发送端的数据到达接收端主机时,接收端主机会返回一个已收到的通知。

  2. 超时重发:在一定时间内没有收到 ACK,认为数据已丢失,进行重发。

    计算机网络③TCP 与 UDP

问题:ACK 可能在途中丢失或延迟到达。

  • 发送端主机只需重发数据;而接收端主机会反复收到相同的数据,并将其丢弃。
  • 需要一个机制:让接收端主机能识别是否已经接收数据,是否需要接收。
  • 这个机制就是序列号。

SEQ

  • 按顺序给发送数据的每个字节,都标上序号。

  • 接收端主机查询 TCP 首部中的序列号、数据长度;

  • 将确认应答号(自己下一步应该接收的序号)作为 ACK 返送给回去。

    计算机网络③TCP 与 UDP

重发超时

重发超时:在重发数据之前,等待 ACK 到来的时间间隔。

  • 每次发包时,都会计算 RTT 及其偏差。
    • RTT(Round Trip Time):报文端的往返时间
    • 偏差:RTT 的波动值,也称抖动。
  • 重发超时:比 RTT 和 偏差的总和稍大的值。
  • 最初的数据报没有 RTT,其重发超时设为 6s 左右。
  • 重发后还是收不到 ACK,则再次重发。达到一定次数后,判断网络或接收端主机异常,强制关闭连接。

连接管理:SYN & FIN

SYN 和 FIN 各占一个序列号(SEQ)。

  • SYN(Synchronize):同步序列号;
  • FIN(Finish):断开序列号。
  • SYN:建立连接的请求。

    • 若对端发来 ACK,认为可以进行数据通信。
    • 若对端 ACK 未到达,则不会进行数据通信。
  • FIN:断开连接。

  • 三次握手,四次挥手

    计算机网络③TCP 与 UDP

MSS

最大消息长度(Maximum Segment Size)

  • TCP 传送数据,以 MSS 的大小将数据进行分割发送(包括重发)。

  • MSS 在三次握手时,在两端主机之间计算得出。

    • 发出建立连接请求时,会在 TCP 首部中写入 MSS 项;
    • 在二者之间选择一个较小的值作为 MSS。

    计算机网络③TCP 与 UDP

窗口控制

  1. 如果每发一个段(segment)就进行一次 ACK 的处理,会降低通信性能。

    计算机网络③TCP 与 UDP
  2. 窗口:ACK 不是以段为单位,而是以窗口大小为单位。

  3. 窗口大小:无需等待 ACK 而可以发送数据的最大值。

    计算机网络③TCP 与 UDP
  4. 缓冲区(Buffer)

    • 发送端:在收到数据对应的 ACK 之前,在缓冲区中存储这部分数据。
    • 接收端:在收到不按顺序的数据时,在缓冲区存储这部分数据。
  5. 滑动窗口控制

    1. 在窗口内的数据即使没有收到 ACK,也可以继续发送;
    2. 收到 ACK 后,将窗口滑动到 ACK 中确认应答号的位置;
    3. 按顺序地将多个段同时发送,以提高通信性能。

    计算机网络③TCP 与 UDP

重发控制

  1. 窗口控制中未收到 ACK 的情况
    1. ACK 未能返回:ACK 在途中丢失,但发送的数据已到达对端,无需重发。
    2. 报文端丢失
  2. 高速重发控制
    1. 接收端主机如果收到一个应接受的序号以外的数据,会针对当前为止收到的数据返回 ACK。
    2. 在窗口比较大,出现报文端丢失的情况下,同一个序号的 ACK 会重复返回;
    3. 发送端主机如果连续 3 次收到同一个 ACK,会将对应数据进行重发。

流量控制

  1. 流量控制(流控制):发送端根据接收端的实际接收能力,控制发送的数据量。
    • 接收端主机向发送端主机通知主机可以接收的数据的大小(窗口大小);
    • 发送端发送的数据不会超过窗口大小。
  2. 窗口大小(Windows Size):TCP 首部中的字段
    • 接收端主机可以将自己的接收缓冲区的大小,放入该字段,通知发送端。
    • 值越大说明网络吞吐量越高。
    • 当缓冲区面临数据溢出,窗口大小的值也会减小,从而控制数据发送量。
  3. 窗口探测:仅含一个字节
    • 当接收端主机缓冲区满时,发送端主机会暂停发送数据,等待接收端主机的窗口更新通知。
    • 超过重发超时后还未收到通知,发送端主机会时不时地发送一个窗口探测的数据段,以获取最新的窗口大小信息。

拥塞控制

  • 拥塞窗口(CWND)
  • 慢启动算法
    1. 慢启动时,将 CWND 设为 1MSS;
    2. 发送数据时,比较 CWND 与接收端主机通知的窗口大小;选择较小的值,发送还要小的数据量。
    3. 每收到一次 ACK,将 CWND 加一。
  • 慢启动阈值:当 CWND 大于阈值,每收到一次 ACK 只允许按比例扩大 CWND。
    • TCP 通信开始时,没有设置慢启动阈值。
    • 超时重传:阈值设为 CWND 的一半。
    • 重复收到三次 ACK:阈值设为当前窗口大小的一半毛病将窗口设为(阈值 + 3MSS)

提高网络利用率

  1. Nagle 算法:发送端的还有少部分数据待发送时,延迟发送。
  2. 延迟确认应答
  3. 捎带应答:应用层发出的消息到达对端,对端处理后返回一个回执。

4.5、首部

UDP 首部

计算机网络③TCP 与 UDP

TCP 首部

计算机网络③TCP 与 UDP

上一篇:C语言:自定义中间截取函数


下一篇:Tomcat启动报错:因为在清除过期缓存条目后可用空间仍不足 - 请考虑增加缓存的最大空间