计算机网络基础基础知识系列:tcp模型状态下的三次握手链接,四次挥手断开链接过程分析
tcp/ip模型是计算机网络中的经典模型相对于osi模型tcp/ip模型是实际实现了的网络模型。
- 相对于osi模型的七层结构,tcp/ip模型总共只分为了四层
osi | tcp/ip | 功能 | tcp/ip协议族 | 相关设备 | 传输单位 |
---|---|---|---|---|---|
应用层 | 应用层 | 文件传输,电子邮件,文件服务等 | Http、FTP、等 | 终端、服务器 | - |
表示层 | 数据格式化,代码转换,数据加密等 | LPP、GIF、JPEG等 | 终端、服务器 | - | |
会话层 | 通讯管理,建立或者断开通信链接 | RPC、SSL、TLS | 终端、服务器 | - | |
传输层 | 传输层 | 管理两个网络终端之间的数据传输 | TCP,UDP等 | 终端、服务器 | 段 |
网络层 | 网络层 | 网络地址管理和路由选择 | IPV4/IPv6、ICMP等 | 路由器、三层交换机 | 分组,包 |
数据链路层 | 网络接口层 | 互联设备之间传送和识别数据帧 | ARP、PARP等 | 网桥、二层交换机 | 帧 |
物理层 | 比特流与电子信号之间的转换 | IEEE 802.3/802.2 | 网卡、网线、集线器、中继器、调制解调器 | 比特位 |
由上表可以其实可以看出tcp协议是工作在tcp/ip模型的传输层的,它主要的功能是负责通讯管理,建立链接或者断开链接。那么它是如何建立链接,和断开链接的呢?下面我们就来分析分析
tcp的三次握手建立链接
过程分析
- 第一次握手:建立链接客户端发送:SYN包[seq=x]到服务器,并进入SYN_SEND状态,等待服务器确定;
- 第二次握手:服务器收到SYN包,必须确定客户的SYN[ack=x+1] 同时自己也发送一个SYN包(seq=y),即SYN+ACK包,此时服务器进入SYN_RECV状态。
- 第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确定包ACK(ack=y+1),此包发送完毕,客户端和服务器进入ESTABLSHED状态,完成三次握手。
这个过程非常形象,
通俗的来说就是-
客户端问服务器:听得到吗? 服务器回答:听得到,你呢? 客户端回答:我也听得到
-
补充扩展知识:
如果第一次握手后,服务器收到了客户端发来的SYN,并且回复了SYN-ACK,
这时候客户端突然挂了,这就会导致服务器再没有收到客户端的响应,就会重发SYN-ACK,
一般再linux系统下默认为重发五次,五次的时间间隔是前一次时间间隔的2倍,
在第五次发出后还需要等待32秒,才能够判定超时,所以总共需要63秒,如果客户端还没有响应,则服务器就会断开链接。
这就导致了服务器的SYN风险,即恶意向服务器发送SYN。
另外如果建立链接后客户端出现故障,tcp协议还提供了一个保活机制,即向对方发送保活探测报文,如果未收到响应则继续发送。
直到发送探测报文的次数达到保活探测数,这时对方主机将被确认为不可到达,连接也将被中断。
以上就是三次握手的过程,经历过三次握手后服务器和客户端就能建立连接,然后就可以进行数据的传输了
tcp的四次挥手断开链接
过程分析
- 第一次挥手:客户端发送一个FIN,用来关闭客户端到服务端的数据传输,客户端进入FIN_WAIT_1状态
- 第二次挥手:服务器收到FIN后,发送一个ACK给客户端,确定序号为手到序号+1(与SYN相同,一个ACK给客户端,确定序列号为收到序列号+1,同样与SYN相同,一个FIN占用一个序号)服务器端进入CLOSE_WAIT状态。
- 第三次挥手:服务器发送一个FIN,用来关闭服务器到客户端的数据传输,服务器进入LAST_ACK状态;
- 第四次挥手:客户端收到FIN后,客户端进入TIME_WAIT状态接着发送一个ACK给服务器,确定序号为收到序号+1,服务器进入CLOSED状态,完成四次握手链接断开。
这个过程非常形象,
通俗的来说就是
客户端对服务器说:我说完了
服务器说:我知道你说完了,容我再说两句,
服务器说:(最后的两句)说完了咱们断了吧
客户端:断开链接。
扩充知识
在四次挥手时客户端在TIME_WAIT状态时后等待2msl:
之所以等待完全是因为确保服务器有足够的时间收到ACK包,还有就是避免新旧连接的混淆。
为什么需要四次握手才能断开连接:
因为tcp协议下的连接都是全双工的,这就要求发送方和接收方都需要FIN报文和ACK报文。
服务器出现大量CLOSE_WAIt状态的原因:
1.代码问题,一般出现这种情况都是程序中没有释放资源导致的
2.配置问题:如果程序释放了资源,那就有可能是处理请求的线程配置有不合理的设计,可以重点检查一下