TCP

一、TCP 和 UDP 的区别
TCP 和 UDP 都是传输层协议,不同点在于:
- TCP 是 面向连接的、可靠的、面向字节流 的
- UDP 是 面向无连接 的
TCP 的三大核心特性
1、面向连接
在客户端和服务器互相通信之前,TCP 需要三次握手建立连接,而 UDP 不需要
2、可靠性
TCP 的可靠性体现在有状态、可控制。
(1)有状态
TCP 会记录发送的数据,以及其中被接收和未被接收的数据,并保证数据包按序到达
(2)可控制
当意识到丢包或网络不佳,TCP 会根据情况调整自身行为,控制发送速度或者重发
3、面向字节流
UDP 的数据传输是基于数据报的,这仅仅继承了 IP 层的特性;而 TCP 为了维护状态,将 IP 包变成了字节流
二、TCP 三次握手过程 & 为什么是三次
1、流程
发送与接收方需要确认双方的两种能力:发送和接收,于是会有三次握手的过程:

(1)服务器变为 LISTEN
起初双方都处于 CLOSED 状态。服务端开始监听某个端口,进入 LISTEN 状态
(2)客户端变为 SYN-SENT
客户端主动发起连接,发送 SYN,并进入 SYN-SENT 状态
其中 seq=x,表示客户端告诉服务端,我发送的首个数据包 序列号从 x 开始
(3)服务端变为 SYN-REVD
服务端接收到,返回 SYN 和 ACK(对应客户端发来的 SYN),并进入 SYN-REVD 状态
其中 seq=y,ack=x+1,seq=y 表示服务端的初始序列号是 y ,ack=x+1 表示服务端告诉客户端:已收到从序列号 x 开始的数据包,期望下次发送从序列号 x+1 开始的数据包
(4)客户端变为 ESTABLISHED
客户端再发送 ACK 给服务端,并进入 ESTABLISHED 状态
其中 seq=x+1 ,ack=y+1 。seq=x+1 表示客户端按照服务端的期望,从序列号 x+1 开始发送数据包,ack=y+1 表示客户端告诉服务端:已收到从序列号 y 开始的数据包,期望下次发送从序列号 y+1 开始的数据包
服务端收到 ACK 之后,也进入 ESTABLISHED 状态
注意:凡是需要对端确认的,一定会消耗 TCP 报文的序列号。
SYN 需要对端的确认,而 ACK 不需要,因此 SYN 消耗一个序列号,下次发送对应的 ACK 序列号要加 1,而 ACK 不需要。
2、为什么不是两次握手
根本原因:没有第三次握手,服务端无法确认客户端的接收能力
如果是两次,客户端发送 SYN 报文试图和服务端建立连接,但是这个包发生了滞留;一段时间后,客户端未收到服务端响应,以为丢了包,于是重传,两次握手建立好了连接。
但是在连接关闭后,如果滞留的包到达了服务端,这时由于是两次握手,服务端只要接收到、并给客户端发送了相应的数据包,就默认建立连接,但是此时客户端已经断开,这就带来了资源的浪费。
3、三次握手过程中可以携带数据么
第三次握手可以携带数据,前两次握手不能携带
如果前两次握手能够携带数据,一旦有人想攻击服务器,只需要在第一次握手中的 SYN 报文中放大量数据,服务器势必会消耗更多的时间和内存空间去进行处理,增大了服务器被攻击的风险
第三次握手时,客户端已处于 ESTABLISHED 状态,并且能够确认服务器的接收、发送能力正常,这时相对安全,可以携带数据
三、TCP 四次挥手的过程
- Title: TCP
- Author: Gabrielle
- Created at : 2024-11-05 17:31:10
- Updated at : 2025-05-20 10:47:28
- Link: https://zoella-w.github.io/2024/11/05/29-TCP/
- License: This work is licensed under CC BY-NC-SA 4.0.