TCP学习(1) | 青训营笔记

142 阅读4分钟

TCP/IP学习 | 青训营笔记

这是我参与「第四届青训营」笔记创作活动的第6天。
参考书籍:《图解网络》v3.0

ISO.png

什么是TCP?

IP 层是不可靠的,它不保证网络包的交付、不保证网络包的按序交付、也不保证网络包中的数据的完整性;如果需要保障网络数据包的可靠性,那么就需要由上层(传输层)的 TCP 协议来负责。 TCP 是面向连接的、可靠的、基于字节流的传输层通信协议。 UDP 不提供复杂的控制机制,利⽤ IP 提供面向无连接的通信服务。

UDP和TCP的区别?

  1. 连接
  • TCP 是面向连接的传输层协议,传输数据前先要建立连接。
  • UDP 是不需要连接,即刻传输数据。
  1. 服务对象
  • TCP 是一对一的两点服务,即⼀条连接只有两个端点。
  • UDP ⽀持一对一、一对多、多对多的交互通信。
  1. 可靠性
  • TCP 是可靠交付数据的,数据可以无差错、不丢失、不重复、按需到达。
  • UDP 是尽最大努力交付,不保证可靠交付数据。
  1. 拥塞控制、流量控制
  • TCP 有拥塞控制和流量控制机制,保证数据传输的安全性。
  • UDP 则没有,即使网络非常拥堵了,也不会影响 UDP 的发送速率。
  1. 首部开销
  • TCP 首部长度较长,会有⼀定的开销,首部在没有使⽤选项字段时是 20 个字节,如果使用了选项字段则会变长。
  • UDP ⾸部只有 8 个字节,并且是固定不变的,开销较小。
  1. 传输⽅式
  • TCP 是流式传输,没有边界,但保证顺序和可靠。
  • UDP 是⼀个包⼀个包的发送,是有边界的,但可能会丢包和乱序。
  1. 分片不同
  • TCP 的数据大小如果大于 MSS 大小,则会在传输层进行分片,目标主机收到后,也同样在传输层组装 TCP 数据包,如果中途丢失了⼀个分片,只需要传输丢失的这个分片。
  • UDP 的数据大小如果大于 MTU 大小,则会在 IP 层进行分片,目标主机收到后,在 IP 层组装完数据,接着再传给传输层,但是如果中途丢了⼀个分片,在实现可靠传输的 UDP 时则就需要重传所有的数据包,这样传输效率会很差,所以通常 UDP 的报文应该小于 MTU。
  1. 头部格式
    TCP头部格式: TCP.png
  • 序列号:用来解决网络包乱序问题。

  • 确认应答号:用来解决不丢包的问题。

  • 控制位:

    • ACK:该位为 1 时,「确认应答」的字段变为有效。
    • RST:该位为 1 时,表示 TCP 连接中出现异常必须强制断开连接。
    • SYN:该位为 1 时,表示希望建⽴连接,并在其「序列号」的字段进⾏序列号初始值的设定。
    • FIN:该位为 1 时,表示今后不会再有数据发送,希望断开连接。

    UDP头部格式: UDP协议非常简单,头部只有8个字节(64位),UDP 的头部格式如下: UDP.png

TCP建立连接

通过三次握手初始化Socket、序列号和窗口大小并建立 TCP 连接。 建立连接.png

  1. 客户端向服务器发送一个 SYN 包,并等待服务器确认;
    • 标志位为 SYN,表示请求建立连接;
  2. 服务器接收到客户端发来的 SYN 包后,对该包进行确认后结束 LISTEN 阶段,并返回一段 TCP 报文;
    • 标志位为 SYN 和 ACK,表示确认客户端的报文 Seq 序号有效,服务器能正常接收客户端发送的数据,并同意创建新连接;
  3. 客户端接收到发送的 SYN + ACK 包后,明确了从客户端到服务器的数据传输是正常的,从而结束 SYN-SENT 阶段。并返回最后一段报文。
    • 标志位为 ACK,表示确认收到服务器端同意连接的信号;
  4. 当服务器端收到来自客户端确认收到服务器数据的报文后,结束 SYN-RECV 阶段,进入 ESTABLISHED 阶段,完成三次握手。

TCP连接断开

通过四次挥手断开TCP连接。 连接断开.png

  1. 客户端打算关闭连接,此时会发送⼀个 FIN 报文,客户端进入 FIN_WAIT_1 状态。
  2. 服务端收到该报文后,就向客户端发送 ACK 应答报文,服务端进入 CLOSED_WAIT 状态。 客户端收到服务端的 ACK 应答报文后,进入 FIN_WAIT_2 状态。
  3. 等待服务端处理完数据后,也向客户端发送 FIN 报文,服务端进入 LAST_ACK 状态。
  4. 客户端收到服务端的 FIN 报⽂后,回⼀个 ACK 应答报文,进入 TIME_WAIT 状态 ; 服务器收到了 ACK 应答报文后,就进入了 CLOSED 状态,服务端已经完成连接的关闭。客户端在经过 2MSL 一段时间后,自动进入 CLOSED 状态,客户端也完成连接的关闭。

参考资料

深入浅出TCP三次握手 (多图详解) - 掘金 (juejin.cn) 深入浅出TCP四次挥手 (多图详解) - 掘金 (juejin.cn)