TCP 三次握手
文章汇总 : 分享汇总 (计算机网络系列文章持续更新)
三次握手主要指 TCP 在建立连接时候的一系列过程
其他阅读地址
握手目的
- 同步 Sequence 序列号
- 初始序列号 ISN
- 交换 TCP 通信的一些信息
- 如 MSS, 窗口大小,指定校验和算法等
Sequence 序列号是什么?因为 TCP 需要有确认,并且需要防止上次连接的迟到的报文被接收,所以需要对每个报文打上一个标记,用来防止失序的,或者上一次连接的报文被接收
握手过程
假设两台主机 A 和 B,A 首先建立连接
- A 发送一个 SYN 报文,进入 SYN_SENT 状态
- B 接收到了之后,发送一个 SYN + ACK,进入 SYN_RCVD 状态
- A 再回一个 ACK ,进入 ESTABLISHED 状态
- B 收到 ACK 之后,也进入 ESTABLISHED 状态
抓包分析
这是我用 Wireshark 抓到的三次握手的数据包,绿色 框起来的是三次握手相关的报文。我们来具体分析一下这三个报文
SYN 报文
下面图片里的红色框起来的是关键字段 :triangular_flag_on_post:
这就是主动连接的一方发送的 SYN 报文,注意这个报文的 Flags 的 Syn 字段被设置为 1,并且带了一个初始的 Sequence number:306621534,记住这个数字, 这样 A 就将自己的序列号发送给了 B
SYN + ACK 报文
这个报文是 B 在收到 SYN 之后,对 A 的回应。作用是确认 A 发送来的 SYN,并将自己的序列号同步给 A 。
注意这里的 Acknowledgment number 是 306621535, 正好是 A 发来的 SYN 的序列号 + 1,这不是巧合,ACK 报文的确认号是 x ,意味着 序列号小于 x 的报文都收到了。
ACK 报文
这个报文是 A 对收到的 SYN+ACK 的确认。这里的 Acknowledgment number 也正好是 B 发送的报文的序号 + 1。
一些面试题目
现在三次握手相关知识都基本讲完了,来看几道面试题吧。
- 可以两次握手吗
不可以,因为会导致已经失效的连接请求的报文段又传到了服务端。并且两次握手也不能保证双方都互换了序列号
- 如果 A 发送给 B 的 ACK 中途丢失,会怎么样?
如果双方都没有数据发送, B 会周期重传 SYN + ACK ,直到 A 确认。如果 A 又数据发送,B 收到 A 的 Data + ACK ,会直接进入 ESTABLISHED 状态
TCP好像有点东西,我看东哥小抄里也添加了这个
哈哈
东哥小抄是啥 给个地址?
据说是LC国区很火的一个刷题指南和讲解
https://labuladong.gitbook.io/algo/labuladong-he-ta-de-peng-you-men
可以的