Pre
计网 - 传输层协议 TCP:TCP 为什么握手是 3 次、挥手是 4 次?
导图
过程分析
第一次握手:客户端将请求报文标志位 SYN 置为 1,请求报文的 Sequence Number 字段(简称 seq)中填入一个随机值 J,并将该数据包发送给服务器端,客户端进入 SYN_SENT 状态,等待服务器端确认。
第二次握手:服务器端收到数据包后由请求报文标志位 SYN=1 知道客户端请求建立连接,服务器端将应答报文标志位 SYN 和 ACK 都置为 1,应答报文的 Acknowledgment Number字段(简称 ack)中填入 ack=J+1,应答报文的 seq 中填入一个随机值 K,并将该数据包发送给客户端以确认连接请求,服务器端进入 SYN_RCVD 状态。
第三次握手:客户端收到应答报文后,检查 ack 是否为 J+1,ACK 是否为 1,如果正确则将第三个报文标志位 ACK 置为 1,ack=K+1,并将该数据包发送给服务器端,服务器端检查 ack 是否为 K+1,ACK 是否为 1,如果正确则连接建立成功,客户端和服务器端进入ESTABLISHED 状态,完成三次握手,随后客户端与服务器端之间可以开始传输数据了。
第三次握手是可以携带数据的,前两次握手是不可以携带数据的 。
一旦完成三次握手,双方都处于 ESTABLISHED 状态,此时连接就已建立完成,客户端和服务端就可以相互发送数据了
抓包实战
按照 tcp 三次握手的规则,三次握手包含一个 SYN 包、 一个 SYN/ACK 包和 一个 ACK包
我们用wireshark 抓一下
第一次握手
【数据链路层 】
从这里我们可以看出,这是数据链路层相关的信息,source 部分的地址和机器上的mac 地址一模一样
【IP层】
接下来,就是 IP 层的相关信息,其中表明了它的上一层协议是 TCP,同时本地和远程服务器的 IP 地址:
【TCP】
接下来,就是 TCP 层的相关信息,其中包括了本地端口和远程服务端口,既然是 syn 包,里面当然会带上 seq 值,本次通信是 1979849485,tcp 报文格式中的 syn 字段被设置为 1,用来表明这是一个 syn 包
第二次握手
数据链路层和 IP 层的报文我们不再查阅,直接看 TCP 层的报文,很明显,这是服务器给客户端的 ACK 报文,其中依然包括了远程服务端口和本地端口
- 同时服务器要把自己端的 seq 值告诉客户端,我们看到实际值是 3366556883。
- 同时服务器要把客户端传给自己的seq 值做个应答确认,所以我们看见 Acknowledgment number 字段值是 1979849486,刚好是第一次握手中,客户端传递给服务端的 seq 值 1979849485 加 1。
- 同时 tcp 报文格式中的syn 字段被设置为 1,Acknowledgment 字段被设置为 1,用来表明这是一个 syn/ack 包
第三次握手
客户端收到应答报文后,检查 ack 是否为 J+1,ACK 是否为 1,如果正确则将第三个报文标志位 ACK 置为 1,ack=K+1,并将该数据包发送给服务器端,服务器端检查 ack 是否为 K+1,ACK 是否为 1,如果正确则连接建立成功,客户端和服务器端进入ESTABLISHED 状态,完成三次握手,随后客户端与服务器端之间可以开始传输数据了。
Java 面试宝典是大明哥全力打造的 Java 精品面试题,它是一份靠谱、强大、详细、经典的 Java 后端面试宝典。它不仅仅只是一道道面试题,而是一套完整的 Java 知识体系,一套你 Java 知识点的扫盲贴。
它的内容包括:
- 大厂真题:Java 面试宝典里面的题目都是最近几年的高频的大厂面试真题。
- 原创内容:Java 面试宝典内容全部都是大明哥原创,内容全面且通俗易懂,回答部分可以直接作为面试回答内容。
- 持续更新:一次购买,永久有效。大明哥会持续更新 3+ 年,累计更新 1000+,宝典会不断迭代更新,保证最新、最全面。
- 覆盖全面:本宝典累计更新 1000+,从 Java 入门到 Java 架构的高频面试题,实现 360° 全覆盖。
- 不止面试:内容包含面试题解析、内容详解、知识扩展,它不仅仅只是一份面试题,更是一套完整的 Java 知识体系。
- 宝典详情:https://www.yuque.com/chenssy/sike-java/xvlo920axlp7sf4k
- 宝典总览:https://www.yuque.com/chenssy/sike-java/yogsehzntzgp4ly1
- 宝典进展:https://www.yuque.com/chenssy/sike-java/en9ned7loo47z5aw
目前 Java 面试宝典累计更新 400+ 道,总字数 42w+。大明哥还在持续更新中,下图是大明哥在 2024-12 月份的更新情况:
想了解详情的小伙伴,扫描下面二维码加大明哥微信【daming091】咨询
同时,大明哥也整理一套目前市面最常见的热点面试题。微信搜[大明哥聊 Java]或扫描下方二维码关注大明哥的原创公众号[大明哥聊 Java] ,回复【面试题】 即可免费领取。