谈谈你对 TCP 三次握手和四次挥手的理解
字段 | 含义 |
---|---|
URG | 紧急指针是否有效。为 1,表示某一位需要被优先处理 |
ACK | 确认号是否有效,一般置为 1 |
RSH | 提示接收端应用程序立即从 TCP 缓冲区把数据读走 |
RST | 对方要求重新建立连接,复位 |
SYN | 请求建立连接,并将其序列号的字段进行序列号的初始值设定。建立连接,设置为 1 |
FIN | 希望断开连接 |
三次握手
- 第一次握手 :建立连接时,客户端发送 syn 包(syn=j)到服务器,并进入 SYN_SENT 状态,等待服务器确认;SYN:同步序列编号
- 第二次握手 :服务器收到 syn 包,必须确认客户的 SYN(ack=j+1),同时自己也发送一个 SYN 包(syn=k),即 SYN+ACK 包,此时服务器进入 SYN_RECV 状态;
- 第三次握手 :客户端收到服务器的 SYN+ACK 包,向服务器发送确认包 ACK(ack=k+1),此包发送完毕,客户端和服务器进入 ESTABLISHED(TCP 连接成功)状态,完成三次握手。
四次挥手
- A :B,不好意思,我这边需要关闭连接了,你准备一下?(发了一个 fin 信号给 B,等待回应)
- B :好的 A,我收到你的关闭信号了,我还有数据没发好,你等我下(回应 A,带回去 ACK 的最后一个信息,失败可以重发)
- B :A 老弟,我好了,我可以关闭了,给你最后说一下,等下你回应我的话,我就直接关了;
- A :好的老哥,我回应你一下,你收到就关闭吧,不用理我(发完这条信息后,进入 time_wait 状态)。
B 收到 ack 信息,直接就关闭了,此过程不产生数据的交互
A 等待 2MSL(最大报文段生存时间) 后,B 没东西给过来,我也关了
为什么握手需要三次,而挥手却需要四次?
握手的时候,A 和 B 打个招呼,B 可以直接把自己的 SYN 信息和对 A 的回应 ACK 信息一起带上,但是挥手的时候,A 说我要断开了,B 还没发完最后的数据,因此需要先回应一下 A,我收到你的断开的请求了,但是你要等我把最后的内容给你,所以这里分开了 2 步: (1)回应 A; (2)发送自己的最后一个数据
为什么 A 进入 TIME_WAIT 需要等待最大报文段生存的时间后,才能关闭?
原因是,担心网络不可靠而导致的丢包,最后一个回应 B 的 ACK 万一丢了怎么办,在这个时间内,A 是可以重新发包的,但是超过了最大等待时间的话,就算收不到也没用了,所以就可以关闭了。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论