Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

TCP 三次握手的过程 #11

Open
wangzitiansky opened this issue Oct 3, 2020 · 0 comments
Open

TCP 三次握手的过程 #11

wangzitiansky opened this issue Oct 3, 2020 · 0 comments
Labels
计算机网络:electric_plug: 包括TCP IP HTTP HTTPS

Comments

@wangzitiansky
Copy link
Owner

wangzitiansky commented Oct 3, 2020

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 状态

三次握手.png

抓包分析

抓包三次握手.png

这是我用 Wireshark 抓到的三次握手的数据包,绿色 🌱 框起来的是三次握手相关的报文。我们来具体分析一下这三个报文

SYN 报文

	下面图片里的红色框起来的是关键字段 :triangular_flag_on_post:

SYN.png

这就是主动连接的一方发送的 SYN 报文,注意这个报文的 Flags 的 Syn 字段被设置为 1,并且带了一个初始的 Sequence number:306621534,记住这个数字, 这样 A 就将自己的序列号发送给了 B

SYN + ACK 报文

SYN + ACK.png

这个报文是 B 在收到 SYN 之后,对 A 的回应。作用是确认 A 发送来的 SYN,并将自己的序列号同步给 A 。

注意这里的 Acknowledgment number 是 306621535, 正好是 A 发来的 SYN 的序列号 + 1,这不是巧合,ACK 报文的确认号是 x ,意味着 序列号小于 x 的报文都收到了。

ACK 报文

ACK.png

这个报文是 A 对收到的 SYN+ACK 的确认。这里的 Acknowledgment number 也正好是 B 发送的报文的序号 + 1。

一些面试题目

现在三次握手相关知识都基本讲完了,来看几道面试题吧。

  • 可以两次握手吗

    不可以,因为会导致已经失效的连接请求的报文段又传到了服务端。并且两次握手也不能保证双方都互换了序列号

  • 如果 A 发送给 B 的 ACK 中途丢失,会怎么样?

    如果双方都没有数据发送, B 会周期重传 SYN + ACK ,直到 A 确认。如果 A 又数据发送,B 收到 A 的 Data + ACK ,会直接进入 ESTABLISHED 状态

参考 🔖
@wangzitiansky wangzitiansky added the 计算机网络:electric_plug: 包括TCP IP HTTP HTTPS label Oct 3, 2020
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
计算机网络:electric_plug: 包括TCP IP HTTP HTTPS
Projects
None yet
Development

No branches or pull requests

1 participant