TCP 的三次握手和四次挥手

Java 面试题

TCP 三次握手

第一次握手 :客户端向服务端发送SYN包。报文中标志位SYN=1,序列号seq=x(x为随机整数)。此时客户端进入了 SYN_SEND同步已发送状态。

第二次握手 :服务端回复客户端SYN+ACK包。报文中标志位SYN=1,标志位ACK=1,序列号seq=y(y为随机整数),确认号ack=x+1(x为客户端发送过来的序列号seq)。此时服务端进去SYN_RECV状态。

第三次握手 :客户端回复服务端ACK包。确认报文的标志位ACK=1,确认号ack=y+1(y为第二次握手时服务端生成的序列号seq),序列号seq=x+1(x为第一手握手时客户端生成的序列号seq)。此时客户端和服务器进入ESTABLISHED状态,客户端与服务端成功建立了TCP连接。

TCP 四次挥手

第一次挥手 :客户端数据传输完成后或准备终止发送数据时,会向服务端发送FIN包。报文中标志位FIN=1,序列号seq=u。此时客户端进入FIN_WAIT_1状态。

第二次挥手 :服务端回复客户端ACK包。确认报文中标志位ACK=1,确认号ack=u+1,序列号seq=v。此时服务端进入close_wait 关闭等待状态,客户端接受到ack应答包后,进入FIN_WAIT_2状态。

第三次挥手 :等服务端数据发送完毕后会向客户端发送FIN包。报文中标志位FIN=1,标志位ACK=1,确认号ack=u+1,序列号seq=w。此时服务端进入LAST_ACK状态。

第四次挥手 :客户端回复服务端ACK包。确认报文中的标志位ACK=1,确认号ack=w+1,序列号seq=u+1。此时客户端进入TIME_WAIT阶段。服务端收到确认报文后会立马释放TCP连接,而客户端发出报文后经过最长报文段寿命的2倍时长后释放TCP连接。

标志位、序列号、确认号

如果对标志位、序列号、确认号等不理解的,可以参考下面这篇博文,图片是引用此博文的。

计算机网络 之 TCP协议报文结构

相关推荐
摇滚侠几秒前
在 SpringBoot 项目中,开发工具使用 IDEA,.idea 目录下的文件需要提交吗
java·spring boot·intellij-idea
云姜.5 分钟前
java多态
java·开发语言·c++
李堇8 分钟前
android滚动列表VerticalRollingTextView
android·java
泉-java28 分钟前
第56条:为所有导出的API元素编写文档注释 《Effective Java》
java·开发语言
zfoo-framework1 小时前
帧同步和状态同步
java
charlotte102410241 小时前
高并发:关于在等待学校教务系统选课时的碎碎念
java·运维·网络
亓才孓1 小时前
[JDBC]PreparedStatement替代Statement
java·数据库
_F_y1 小时前
C++重点知识总结
java·jvm·c++
打工的小王1 小时前
Spring Boot(三)Spring Boot整合SpringMVC
java·spring boot·后端
毕设源码-赖学姐1 小时前
【开题答辩全过程】以 高校体育场馆管理系统为例,包含答辩的问题和答案
java·spring boot