TCP/IP学习 | 青训营笔记
这是我参与「第四届青训营」笔记创作活动的第6天。
参考书籍:《图解网络》v3.0
什么是TCP?
IP 层是不可靠的,它不保证网络包的交付、不保证网络包的按序交付、也不保证网络包中的数据的完整性;如果需要保障网络数据包的可靠性,那么就需要由上层(传输层)的 TCP 协议来负责。 TCP 是面向连接的、可靠的、基于字节流的传输层通信协议。 UDP 不提供复杂的控制机制,利⽤ IP 提供面向无连接的通信服务。
UDP和TCP的区别?
- 连接
- TCP 是面向连接的传输层协议,传输数据前先要建立连接。
- UDP 是不需要连接,即刻传输数据。
- 服务对象
- TCP 是一对一的两点服务,即⼀条连接只有两个端点。
- UDP ⽀持一对一、一对多、多对多的交互通信。
- 可靠性
- TCP 是可靠交付数据的,数据可以无差错、不丢失、不重复、按需到达。
- UDP 是尽最大努力交付,不保证可靠交付数据。
- 拥塞控制、流量控制
- TCP 有拥塞控制和流量控制机制,保证数据传输的安全性。
- UDP 则没有,即使网络非常拥堵了,也不会影响 UDP 的发送速率。
- 首部开销
- TCP 首部长度较长,会有⼀定的开销,首部在没有使⽤选项字段时是 20 个字节,如果使用了选项字段则会变长。
- UDP ⾸部只有 8 个字节,并且是固定不变的,开销较小。
- 传输⽅式
- TCP 是流式传输,没有边界,但保证顺序和可靠。
- UDP 是⼀个包⼀个包的发送,是有边界的,但可能会丢包和乱序。
- 分片不同
- TCP 的数据大小如果大于 MSS 大小,则会在传输层进行分片,目标主机收到后,也同样在传输层组装 TCP 数据包,如果中途丢失了⼀个分片,只需要传输丢失的这个分片。
- UDP 的数据大小如果大于 MTU 大小,则会在 IP 层进行分片,目标主机收到后,在 IP 层组装完数据,接着再传给传输层,但是如果中途丢了⼀个分片,在实现可靠传输的 UDP 时则就需要重传所有的数据包,这样传输效率会很差,所以通常 UDP 的报文应该小于 MTU。
- 头部格式
TCP头部格式:
-
序列号:用来解决网络包乱序问题。
-
确认应答号:用来解决不丢包的问题。
-
控制位:
- ACK:该位为 1 时,「确认应答」的字段变为有效。
- RST:该位为 1 时,表示 TCP 连接中出现异常必须强制断开连接。
- SYN:该位为 1 时,表示希望建⽴连接,并在其「序列号」的字段进⾏序列号初始值的设定。
- FIN:该位为 1 时,表示今后不会再有数据发送,希望断开连接。
UDP头部格式: UDP协议非常简单,头部只有8个字节(64位),UDP 的头部格式如下:
TCP建立连接
通过三次握手初始化Socket、序列号和窗口大小并建立 TCP 连接。
- 客户端向服务器发送一个 SYN 包,并等待服务器确认;
- 标志位为 SYN,表示请求建立连接;
- 服务器接收到客户端发来的 SYN 包后,对该包进行确认后结束 LISTEN 阶段,并返回一段 TCP 报文;
- 标志位为 SYN 和 ACK,表示确认客户端的报文 Seq 序号有效,服务器能正常接收客户端发送的数据,并同意创建新连接;
- 客户端接收到发送的 SYN + ACK 包后,明确了从客户端到服务器的数据传输是正常的,从而结束 SYN-SENT 阶段。并返回最后一段报文。
- 标志位为 ACK,表示确认收到服务器端同意连接的信号;
- 当服务器端收到来自客户端确认收到服务器数据的报文后,结束 SYN-RECV 阶段,进入 ESTABLISHED 阶段,完成三次握手。
TCP连接断开
通过四次挥手断开TCP连接。
- 客户端打算关闭连接,此时会发送⼀个 FIN 报文,客户端进入 FIN_WAIT_1 状态。
- 服务端收到该报文后,就向客户端发送 ACK 应答报文,服务端进入 CLOSED_WAIT 状态。 客户端收到服务端的 ACK 应答报文后,进入 FIN_WAIT_2 状态。
- 等待服务端处理完数据后,也向客户端发送 FIN 报文,服务端进入 LAST_ACK 状态。
- 客户端收到服务端的 FIN 报⽂后,回⼀个 ACK 应答报文,进入 TIME_WAIT 状态 ; 服务器收到了 ACK 应答报文后,就进入了 CLOSED 状态,服务端已经完成连接的关闭。客户端在经过 2MSL 一段时间后,自动进入 CLOSED 状态,客户端也完成连接的关闭。
参考资料
深入浅出TCP三次握手 (多图详解) - 掘金 (juejin.cn) 深入浅出TCP四次挥手 (多图详解) - 掘金 (juejin.cn)