当前位置: 首页 > news >正文

TCP三次握手与四次挥手(一次明白)

TCP基本信息

默认端口号:80

LINUX中TIME_WAIT的默认时间是30s

TCP三次握手

三次握手过程:每行代表发起握手到另一方刚刚收到数据包时的状态
客户端服务端客户端状态服务端状态
握手前CLOSELISTEN
客户端发送带有SYN标志的数据包到服务端一次握手SYN_SENDLISTEN
二次握手服务端发送带有SYN/ACK标志的数据包到客户端SYN_SENDSYN_RCVD
客户端发送带有ACK标志的数据包到服务端三次握手ESTABLISHEDSYN_RCVD
握手结束ESTABLISHEDESTABLISHED

img

为什么是三次握手,两次不行吗?

三次握手主要是为了建立可靠的通信信道,是客户端和服务端同时具有发送和接收数据的能力.

两次握手只能保证单向连接是畅通的.(为了实现可靠数据传输,TCP协议的通信双方,都必须维护一个序列号,已标志发送出去的数据包中,哪些是已经被对方接收了的.三次握手的过程即是通信双方互相告知序列号起始值,并确认对方已经收到了序列号起始值的毕竟步骤;如果只是两次握手,至多只有连接发起放的起始序列号能够被确认,另一方选择的序列号则得不到确认)

三次握手能防止已经失效的连接请求又传到服务端,建立多余的连接,浪费系统资源.(假设客户端第一次握手时发送的请求报文SYN_1超时,携带Seqnum=90,客户端再次发起第一次握手请求报文SYN_2,携带Seqnum=100,若此时SYN_1先于SYN_2到达客户端.若为两次握手,此时服务端发送SYN_ACK_1到客户端,携带Seqnum=91,建立连接.SYN_2到达客户端,再建立一个连接,因此会造成资源浪费.若使用三次握手,客户端接收到SYN_ACK_1后发现其携带的Seqnum不对,便将其废弃,知道SYN_ACK_2到达,发现其符合条件,发送ACK到服务端,建立连接)

TCP四次挥手

四次挥手过程:

客户端服务端客户端状态服务端状态
挥手前ESTABLISTEDESTABLISTED
客户端发送带有FIN标志的数据包到服务端一次挥手FIN-WAIT-1ESTABLISTED
二次挥手服务端收到这个FIN,它发回一个ACK,确认序号为收到的序号+1FIN-WAIT-1CLOSED-WAIT
三次挥手服务端发送一个FIN数据包到客户端,关闭与客户端的连接FIN-WAIT-2LAST_ACK
客户端收到这个FIN,发挥ACK报文确认,并将确认序号设置为收到的序号+1四次挥手TIME-WAITLAST_ACK
经过2MSL挥手完成CLOSECLOSE

CLOSED-WAIT:表示等待关闭

TIME-WAIT:为了解决网络的丢包和网络不稳定所带来的其他问题,确保连接方能在时间范围内,关闭自己的连接.

  • 挥手前,客户端和服务端的状态都是ESTABLISHED(连接建立)
  • 第一次挥手,客户端发送带有FIN标志的数据包给服务端,客户端状态变为FIN-WAIT-1.
  • 第二次挥手,服务端收到客户端的数据包后,发送ACK确认帧给客户端,服务端状态变为CLOSED-WAIT.
  • 第三次挥手,客户端收到服务端的ACK确认帧后,状态变为FIN-WAIT-2.此时服务端可能有些数据还未处理完,待服务端处理完数据会发送带有FIN的数据包到客户端,此时服务端状态变更为LAST-ACK.
  • 第四次挥手,客户端收到服务端FIN报文后,回应一个ACK确认报文,此时客户端状态变更为TIME-WAIT.服务端收到ACK确认报文后状态变更为CLOSE,至此服务端完成连接的关闭.客户端等待2MSL时间后,自动进入CLOSE状态,至此客户端关闭连接.

参考文章

TCP三次握手

TCP四次挥手

http://www.lryc.cn/news/38933.html

相关文章:

  • pyside6@Mouse events实例@QApplication重叠导致的报错@keyboardInterrupt
  • 订单30分钟未支付自动取消怎么实现?
  • < 开源项目框架:推荐几个开箱即用的开源管理系统 - 让开发不再复杂 >
  • 内网渗透-基础环境
  • Go语言学习的第一天(对于Go学习的认识和工具选择及环境搭建)
  • C和C++到底有什么关系
  • 14个Python处理Excel的常用操作,非常好用
  • async/await 用法
  • 好意外,发现永久免费使用的云服务器
  • VSCode使用技巧,代码编写效率提升2倍以上!
  • SQL执行过程详解
  • 【物联网NodeJs-5天学习】第四天存储篇⑤ ——PM2,node.js应用进程管理器
  • 【C++学习】【STL】deque容器
  • 当 App 有了系统权限,真的可以为所欲为?
  • vue3.js的介绍
  • 【Three.js】shader特效 能量盾
  • 【6000字长文】需求评审总是被怼?强烈推荐你试试这三招
  • Hive介绍及DDL
  • Simulink 自动代码生成电机控制:在某国产ARM0定点MCU上实现自动代码生成无感电机控制
  • MySQL基本查询
  • 你需要知道的 7 个 Vue3 技巧
  • 行政区划获取
  • 让ChatGPT介绍一下ChatGPT
  • 【Redis】Redis 主从复制 + 读写分离
  • 2023届秋招,鬼知道我经历了什么
  • ChatGPT助力校招----面试问题分享(一)
  • CSS媒体查询@media (prefers-color-scheme:dark)判断系统白天黑夜模式
  • 运行YOLOv8实现识别
  • 如何在Linux中优雅的使用 head 命令,用来看日志简直溜的不行
  • Nginx.conf 配置详解