TCP 协议的三次握手,传输确认,四次挥手


# 一.TCP 三次握手

刚开始由客户端 1 发送给服务端 2
SYN 包,询问服务端是否能与其建立练接。服务端同意后回了
SYN+ACK 包给客户端 3,客户端 3 再回 ACK 包给服务端 4,三次握手建立,连接成功。

# 二。传输确认

1
个人理解认为,传输确认这一步骤很大原因是为了防止丢包,保证TCP协议的稳定可靠性。

发送缓冲区:0 1 2 3 4 5 6 7 8 9 10 11 12

发送报文:序列号 + 长度 + 发送缓冲区中的数据内容

回复确认:ACK = 序列号 + 长度 = 下一包的起始序列号

1
由三次握手可以确认客户端与服务端传输的是同一次的包,防止丢包现象的发生,同时也因为拥有数据内容,客户端也可以传输数据片段给服务端,服务端再根据数据片段重新拼装成完整的数据内容。(同时这也可以让服务端确认缺失了哪一段数据,要求客户端重新发送)

# 三。四次挥手

ps:客户端与服务端都可以发起关闭请求

四次挥手流程:

1->2:客户端向服务端发送了 FIN 包然后进入了 3(终止等待 1 状态)

2->3:服务端回了 ACK 包给 3 后进入了 4(关闭等待状态),而 3 收到了 ACK 包以后进入了 5(终止等待 2 状态)

(此时服务端还能发送数据,客户端还能接收数据,待数据传输完成后开始下一步。)

4->5:确认传输完成后 4 会向 5 发送 FIN 包,然后进入 6(最后的确认状态)

5->6:5 收到来自 4 的 FIN 包以后会向 6 发送 ACK 包,然后进入超时等待状态

6->8:当 6 收到来自 5 的 ACK 包后会立马进入 8(也就是立马关闭)

7->9:经过超时时间后会自动关闭也就是 7->9

ps:为什么要有超时等待状态:

(一句话概括就是为了确保服务端关闭)

详:是为了确认服务端收到 ACK 包(如不等待且服务端没有收到 ACK 包,那么服务端就会停留在最后的确认状态)。等待时,如服务端未收到 ACK 包,那么就会重复 4->5,服务端重新发送 FIN 包,而客户端收到后也就会重新发送 ACK 包(超时等待时间也会被重新刷新)。

# UDP 协议(非连接)

简单封装数据包并从网卡发出,数据包间无状态上的联系

因此推出 UDP 的特征:1. 性能损耗少 2. 资源占用少 3. 稳定性弱


TCP 与 UDP 差异:

1.TCP 面向连接,UDP 面向报文

2.TCP 对系统资源要求较多,UDP 结构相对简单

3.TCP 稳定可靠,UDP 传输数据快

TCP 用于传输文件,发送邮件,浏览网页等

(用于对传输质量要求较高的地方)

UDP 用于域名查询,语音通话,视频直播等

还可以用于隧道网络:VPN,VXLAN

(用于对速度要求高,但是对少量丢包没有太大要求的场景)