面试实战 问题三十 HTTP协议中TCP三次握手与四次挥手详解

HTTP协议中TCP三次握手与四次挥手详解

在HTTP协议中,连接建立和断开依赖于底层的TCP协议。虽然HTTP本身不定义握手过程,但所有HTTP通信都通过TCP三次握手建立连接,通过四次挥手断开连接。以下是详细解析:


一、TCP三次握手(连接建立)
客户端服务器SYN=1, seq=x (请求同步)SYN_SENT状态SYN=1, ACK=1, seq=y, ack=x+1 (确认请求)SYN_RCVD状态ACK=1, seq=x+1, ack=y+1 (确认响应)ESTABLISHED状态ESTABLISHED状态客户端服务器
  1. 第一次握手(SYN)

    • 客户端发送SYN=1标志的TCP包,携带随机初始序列号seq=x
    • 客户端进入SYN_SENT状态
    • 目的:检测客户端的发送能力
  2. 第二次握手(SYN+ACK)

    • 服务器返回SYN=1ACK=1标志的包
    • 携带自己的序列号seq=y和确认号ack=x+1
    • 服务器进入SYN_RCVD状态
    • 目的:检测服务器的收发能力
  3. 第三次握手(ACK)

    • 客户端发送ACK=1标志的包
    • 携带seq=x+1ack=y+1
    • 双方进入ESTABLISHED状态
    • 目的:确认客户端接收能力正常

为什么需要三次握手?

  • 防止历史连接干扰(两次握手时失效请求可能建立无效连接)
  • 最小化握手次数保证可靠性(四次握手会降低效率)
  • 避免资源浪费:$ \text{可靠性} \propto \frac{1}{\text{握手次数}} $(三次是最优解)

二、TCP四次挥手(连接断开)
客户端服务器FIN=1, seq=u (请求断开)FIN_WAIT_1状态ACK=1, seq=v, ack=u+1 (确认请求)CLOSE_WAIT状态FIN_WAIT_2状态FIN=1, ACK=1, seq=w, ack=u+1 (准备断开)LAST_ACK状态ACK=1, seq=u+1, ack=w+1 (最终确认)TIME_WAIT状态(2MSL)CLOSED状态客户端服务器
  1. 第一次挥手(FIN)

    • 主动关闭方(如客户端)发送FIN=1标志的包,序列号seq=u
    • 进入FIN_WAIT_1状态
  2. 第二次挥手(ACK)

    • 被动关闭方(如服务器)返回ACK=1标志的包
    • 携带确认号ack=u+1和自身序列号seq=v
    • 服务器进入CLOSE_WAIT状态,客户端进入FIN_WAIT_2状态
  3. 第三次挥手(FIN)

    • 服务器处理完剩余数据后发送FIN=1ACK=1标志的包
    • 携带新序列号seq=w和确认号ack=u+1
    • 服务器进入LAST_ACK状态
  4. 第四次挥手(ACK)

    • 客户端发送ACK=1标志的包(确认号ack=w+1
    • 客户端进入TIME_WAIT状态(等待2MSL时间)
    • 服务器收到后立即关闭连接

关键设计解析

  1. 四次挥手的必要性:TCP连接是全双工的,需独立关闭两个方向的数据流
  2. TIME_WAIT状态的作用:
    • 确保最后一个ACK到达服务器(未到达时会重传FIN)
    • 防止旧连接数据包干扰新连接
    • 等待时间:$ 2 \times \text{MSL} $(默认60秒,MSL=30秒)
  3. 服务器CLOSE_WAIT状态:处理遗留数据的关键阶段

三、HTTP协议与TCP的关系
阶段HTTP行为TCP状态变化
请求发起浏览器发送HTTP请求触发三次握手
数据传输通过已建立的TCP连接传输HTTP报文ESTABLISHED状态
连接关闭短连接:每次请求后关闭
长连接:复用
触发四次挥手
错误处理连接超时/重置TCP重传机制激活
  • HTTP/1.0:默认短连接(每次请求完成即四次挥手)
  • HTTP/1.1+:默认长连接(复用TCP连接,减少握手挥手开销)

四、Java网络编程验证
  1. 触发三次握手

    try (Socket socket = new Socket("www.example.com", 80)) {// 连接建立时自动完成三次握手
    }  // 退出try-block时自动触发四次挥手
    
  2. 观察TCP状态(Linux)

    netstat -nat | grep ESTABLISHED
    netstat -nat | grep TIME_WAIT
    
  3. 模拟连接重置

    // 设置SO_LINGER强制关闭连接
    socket.setSoLinger(true, 0);  // 发送RST而非FIN
    

五、面试高频问题
  1. 为什么连接建立是三次握手,断开却要四次挥手?

    • 建立连接时服务器可将SYN+ACK合并发送
    • 断开连接时服务器需等待数据处理完毕才能发FIN
  2. TIME_WAIT状态过多会导致什么问题?如何解决?

    • 问题:耗尽端口资源(Linux默认端口范围:net.ipv4.ip_local_port_range
    • 解决方案:
      // Java中启用端口复用
      socket.setReuseAddress(true);
      
  3. TCP握手能保证100%可靠吗?

    • 不能!三次握手比两次更可靠,但网络本质不可靠(如握手成功后断网)
  4. Wireshark抓包如何识别握手过程?

    • SYN包:Flags [S]
    • SYN+ACK包:Flags [S.]
    • FIN包:Flags [F]

总结

过程关键特征设计目的
三次握手SYN → SYN+ACK → ACK最小代价验证双向通信能力
四次挥手FIN → ACK → FIN → ACK安全关闭双向数据流
TIME_WAIT等待2MSL(60秒)容错处理+防止旧数据干扰

核心结论:HTTP通信建立在TCP连接之上,理解三次握手和四次挥手是优化网络性能(如连接复用)和调试网络问题的基石


相关问题

  1. TCP半连接(SYN Flood)攻击的原理是什么?Java如何防御?
  2. 为什么HTTP/2需要多路复用?这与TCP握手有什么关系?
  3. Java中Socket.close()Socket.shutdownOutput()在挥手过程中的区别?
  4. 如何通过Wireshark抓包分析HTTPS连接的TLS握手过程?
  5. TCP的Keep-Alive机制如何影响HTTP长连接的超时管理?

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/93160.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/93160.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

读《精益数据分析》:双边市场的核心指标分析

双边市场数据分析指南:从指标体系到实战落地(基于《精益数据分析》框架)在互联网平台经济中,双边市场(如电商、出行、外卖、自由职业平台等)的核心矛盾始终是"供需平衡与效率优化"。这类平台连接…

Queue参考代码

queue.c #include "queue.h" #include "stdlib.h" // 初始化循环队列 void initializeCircularQueue(CircularQueue *cq, uint8_t *buffer, uint32_t size) {cq->front 0;cq->rear 0;cq->count 0;cq->size size;cq->data buffer; }…

通过时间计算地固系到惯性系旋转矩阵

通过时间计算地固系到惯性系旋转矩阵 1. 引言 在航天工程和卫星导航领域,经常需要在地固坐标系(ECEF)和惯性坐标系(ECI)之间进行转换。本文将详细介绍如何根据UTC时间计算这两个坐标系之间的旋转矩阵,并提供完整的C语言实现。 2. 基本概念 2.1 坐标系定义…

【Datawhale AI 夏令营】金融文档分析检索增强生成系统的架构演变与方法论进展

# **金融文档分析检索增强生成系统的架构演变与方法论进展****第一部分:基础原则和基线系统分析****第一部分:金融领域检索增强生成范式的解构****第二部分:基线剖析:流水线的二分法****同步轨迹 (SimpleRAG)****异步改进 (AsyncS…

C语言相关简单数据结构:顺序表

目录 1.顺序表的概念及结构 1.1 线性表 如何理解逻辑结构和物理结构? 1.2 顺序表分类 顺序表和数组的区别: 顺序表分类: 静态顺序表 动态顺序表 1.3 动态顺序表的实现 初始化 尾插 头插 尾删 头删 在指定位置之前插入数据 删…

nginx配置代理服务器

Nginx 作为代理服务器时,主要用于反向代理(最常用,转发客户端请求到后端服务)或正向代理(较少用,为客户端提供访问外部网络的代理)。以下是两种场景的具体配置示例: 一、反向代理配置…

MySQL数据库知识体系总结 20250813

一、数据库的原理 1.数据库的分类 我们可以根据数据的结构类型,将数据分成三类,分别是:结构化数据,半结构化数据,非结构化数据。 要点:对于结构化数据来讲通常是先有结构再有数据。要点:对于半…

C++ 中构造函数参数对父对象的影响:父子控件管理机制解析

文章目录C 中构造函数参数对父对象的影响:父子控件管理机制解析1. Qt 中的父对象管理机制2. 构造函数传递父对象的不同方式2.1. 父控件是 QWidget parent(通用方式)分析:2.2. 父控件是 Books_Client parent(限制父控件…

直播美颜SDK开发实战:高性能人脸美型的架构与实现

在直播行业里,美颜已经不再是锦上添花,而是标配中的标配。无论是游戏主播、带货达人,还是唱歌、跳舞的才艺主播,直播美颜SDK往往决定了用户的第一印象和停留时长。尤其是高性能人脸美型技术,不仅能让主播的五官更加自然…

JavaWeb(苍穹外卖)--学习笔记18(Apache POI)

前言 本篇文章是学习B站黑马程序员苍穹外卖的学习笔记📑。我的学习路线是Java基础语法-JavaWeb-做项目,管理端的功能学习完之后,就进入到了用户端微信小程序的开发,用户端开发的流程大致为用户登录—商品浏览(其中涉及…

OpenJDK 17 源码 安全点轮询的信号处理流程

OpenJDK 17 源码,安全点轮询的信号处理流程如下(重点分析安全点轮询相关部分):核心信号处理流程信号触发:当线程访问安全点轮询内存页时(SafepointMechanism::is_poll_address),会触…

InfluxDB 在工业控制系统中的数据监控案例(一)

工业控制系统数据监控的重要性**在工业领域,生产过程的复杂性和连续性使得数据监控成为保障生产稳定运行的关键环节。通过实时收集、处理和分析生产数据,企业能够及时掌握设备运行状态、产品质量信息以及生产流程的各项参数,从而为生产决策提…

嵌入式学习(day26)frambuffer帧缓冲

一、UI技术: User interface(1)framebuffer: 帧缓冲、帧缓存技术 Linux内核专门为图形化显示提供的一套应用程序接口。流程如下:1. 打开显示设备 (/dev/fb0) 2. 获取显示设备相关参数(分辨率,像素格式)---》…

408每日一题笔记 41-50

答案:A 解析:CSMA/CD 协议里,“争用期” 就是信号在总线上最远两个端点之间往返传输的时间,也叫冲突窗口,选 A。

【物联网】基于树莓派的物联网开发【26】——树莓派开启串口并配置串口助手Minicom

串口配置 (1)打开串口,终端输入命令: sudo raspi-config (2)串口设置选择Interfacing Options→Serial port→No→Yes→ok(3)设置开启,打开串口 (4&#xff0…

考研/考公知识共享平台的设计与实现-项目分享

考研/考公知识共享平台的设计与实现-项目分享项目介绍项目摘要学生前台用例图管理员用例图系统流程图系统功能结构图实体图学生信息实体图资料信息管理实体图报考指南管理写在最后项目介绍 使用者:管理员、学生前台、学生后台 开发技术:MySQLJavaSpring…

一键设置 NTP 时区的脚本(亲测,适用于部署 K8S 的前置环境)

文章目录一、时区和时间同步的配置命令二、完整脚本ntp_timezone_setup.sh三、使用方法3.1、创建脚本3.2、赋予执行权限3.3、运行脚本3.4、验证一、时区和时间同步的配置命令 整理用于做时区和时间同步的配置几条命令分别如下: 1️⃣ 编辑 chrony 配置 vim /etc/…

BPMN编辑器技术实现总结AI时代的工作流编辑器

项目概述 基于 diagram.js 的 BPMN 流程设计器,通过依赖注入(DI)实现模块化扩展,自定义模块扩展与SVG图形渲染。后端工作流引擎自定义统一任务调度函数,实现异构模型统一调用。 核心技术架构 1. diagram.js 架构基础 核心模块组成 Canv…

两阶段最小二乘法(2SLS)与 工具变量(IV)模型

以下是关于两阶段最小二乘法(2SLS)与工具变量(IV)模型关系的系统解析,结合计量经济学理论与论文上下文进行说明:一、核心关系:2SLS是IV模型的实现方法 1. IV模型:解决内生性的理论框…

熬夜面膜赛道跑出的新物种

在快节奏的现代生活中,熬夜已成为都市人群的常态,深夜11点后的朋友圈总是一片“失眠”哀嚎。随之而来的是“熬夜肌”问题的激增——暗沉、干燥、屏障受损等诉求催生了庞大的熬夜面膜市场。2025年,中国面膜线上规模已达484亿元,其中…