【TCP】为什么三次握手四次挥手

关于 TCP 三次握手四次挥手的过程已在 【网络通信】传输控制层 – TCP 协议介绍,这里将不再赘述。

TCP 连接到断开过程,如下图:

image

三次握手

image

TCP 的定位是全双工的、支持半关闭的、可靠的传输协议。但是,我们知道,网络信道是不可靠的,随时都有可能丢包、错包、乱序。TCP 怎么在不可靠的网络上实现可靠的传输协议呢?

对于丢包,TCP 的解决方案很简单,就是超时重传

对于错包,TCP 通过检查出错误后直接丢弃(丢包)。

所以问题来了,TCP 怎么知道哪些包需要重传呢?TCP 又是怎么解决包乱序到达的问题呢?

这两个问题都是通过 seq 来实现的,三次握手的过程就是双方协商好初始的seq

解决乱序:通过 seq 确定顺序。

确定重传:接收方在 ACK 里带上 seq 告诉发送方收到了哪些数据包。发送方超时就重发没收到 ACK 的包。

通信双方协商好一个初始 seq ,至少需要一次 SYN 和 一次 ACK

由于 TCP 是全双工的,所以 TCP 要协商两个初始 seq ,所以双方各需要一次 SYN 和一次 ACK

简单优化,可以将中间的 ACK + SYN 合并,以最低限度地 确认全双工信道 建立连接。

四次挥手

image

关闭连接:防止数据丢失;与应用层交互

上面讲到,三次握手其实是由“四次握手”合并二、三次握手优化而来的。那为什么第二次挥手和第三次挥手不能像握手协议中进行合并呢?

client 发送 FIN 包, Server 收到 FIN 包后,操作系统内核会自动回复一个 ACK 确认包, 为什么 不把 server的 FIN包一起返回呢?因为 server 要等 待应用程序关闭,然后发送其 FIN包告诉 client,我要断开连接。

参考文档

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇