【面试题12】HTTP协议三次握手和四次挥手分别是什么

news2024/11/14 11:08:15

文章目录

  • 一、概览
  • 二、三次握手
    • 2.1 第一步:客户端向服务端发送 SYN(同步)包
    • 2.2 第二步:服务端返回 ACK(确认)包和 SYN 包
    • 2.3 第三步:客户端返回 ACK(确认)包
  • 三、四次挥手
    • 3.1 第一步:客户端向服务器发送 FIN(结束)包
    • 3.2 第二步:服务端发送 ACK(确认)包
    • 3.3 第三步:服务端向客户端发送 FIN 包
    • 3.4 第四步:客户端发送 ACK(确认)包
  • 四、客户端和服务端谁主动断开连接
  • 总结


一、概览

本文已收录于PHP全栈系列专栏:PHP面试专区。
计划将全覆盖PHP开发领域所有的面试题,对标资深工程师/架构师序列,欢迎大家提前关注锁定。

HTTP 是一个客户端和服务端之间通信的协议,用于在 Web 上发送和接收数据。在 HTTP 通信过程中,客户端和服务端之间通过套接字建立连接。HTTP 协议是基于 TCP/IP 协议的,在传输数据的时候必须使用三次握手和四次挥手进行建立和关闭连接。在这篇文章中,我们将学习三次握手和四次挥手,以及它们各个步骤的状态,还会回答客户端和服务端谁主动断开连接的问题。

二、三次握手

在服务端和客户端之间建立连接时,需要进行三次握手过程来确保双方都已经准备好了进行通信。这个过程的目的是让服务端和客户端可以互相确认彼此的身份,并建立一个可靠的连接。以下是三次握手的步骤:

在这里插入图片描述

2.1 第一步:客户端向服务端发送 SYN(同步)包

当客户端想要和服务端建立连接时,将会发送一个 SYN 包给服务端。这个 SYN 包包含着客户端发送初始序列号的信息。

2.2 第二步:服务端返回 ACK(确认)包和 SYN 包

当服务端收到客户端的 SYN 包时,会向客户端发送一个 ACK 包进行响应。这个 ACK 包也会包含服务端的初始序列号。同时,服务端也会发送一个 SYN 包给客户端。

2.3 第三步:客户端返回 ACK(确认)包

当客户端收到服务端发送的 SYN 包时,会向服务端发送一个 ACK 包作出响应。此时,双方就已经进行了三次握手,建立了一个可靠的连接,可以开始进行通信。

三、四次挥手

在完成了数据传输之后,双方需要关闭连接。在 HTTP 协议中使用四次挥手来优雅的结束连接,使得双方都有足够的时间来处理未完成的数据传输。以下是四次挥手的步骤:

在这里插入图片描述

3.1 第一步:客户端向服务器发送 FIN(结束)包

当客户端想要关闭连接时,它会向服务端发送一个 FIN 包。FIN 包告诉服务端客户端将不再发送数据,但仍然可以继续接收数据。

3.2 第二步:服务端发送 ACK(确认)包

当服务端收到客户端发送的 FIN 包时,会向客户端发送一个 ACK 包作出响应。

3.3 第三步:服务端向客户端发送 FIN 包

一旦服务端也没有数据要发送给客户端了,它就会向客户端发送一个 FIN 包。这个 FIN 包表示服务端已经准备好关闭连接。

3.4 第四步:客户端发送 ACK(确认)包

当客户端收到服务端发送的 FIN 包时,会向服务端发送一个 ACK 包,并关闭连接。

四、客户端和服务端谁主动断开连接

在 HTTP 协议中,不管是客户端还是服务端都可以主动断开连接。通常情况下,客户端应该先发送 FIN 包来关闭连接。这是因为服务端的资源比客户端更有价值,如果客户端提前结束了连接,服务端还需要等待一段时间才能释放这些资源。

总结

三次握手和四次挥手在 HTTP 通信中扮演着非常重要的角色,用于建立和关闭连接。虽然这些过程看起来很简单,但它们确保了连接的可靠性。在这篇文章中,我们学习了三次握手和四次挥手的各个步骤及状态,以及客户端和服务端哪一个应该先发送 FIN 包。了解这些知识可以帮助我们更好地理解 HTTP 协议,从而更好地构建 web 应用程序。

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

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

相关文章

今日分享:音频格式转换软件

小林最近特别喜欢唱歌,不过总是遇到一些麻烦,例如自己录制的音频格式无法在其他设备上播放,或者想把某个歌曲转成适合自己播放的格式。这时候就需要一个好用的音频格式转换器啦!小林找了一圈,终于找到了几款可爱又好用…

大数据应用——工程实践III

任务一:完成Hadoop集群部署前环境的准备工作 1.1 虚拟机环境准备 1. 安装虚拟机 2. 克隆虚拟机 3. 修改网络配置 4. 修改主机名和映射 5. 关闭防火墙 1.2 安装JDK 1.3 安装Hadoop 1.4 集群配置 1. 编写集群分发脚本xsync 2. 集群部署规划 表 1.1 hadoop101 …

一份老网工珍藏多年的网络配置笔记

我的网工朋友大家好 俗话说得好,好记性不如烂笔头。 学生时代,我们考试前最喜欢看的就是学霸笔记,但工作之后,却没有人会愿意借给你他们的珍藏笔记了。 今天,想给你分享一个老网工分享在网上的精选笔记,…

java 8 新特性讲解Optional类--Fork/Join 框架--新时间日期API--以及接口的新特性和注解

Optional类 到目前为止,臭名昭著的空指针异常是导致Java应用程序失败的最常见原因。以前,为了解决空指针异常,Google公司著名的Guava项目引入了Optional类,Guava通过使用检查空值的方式来防止代码污染,它鼓励程序员写…

六、Docker容器数据卷

学习参考:尚硅谷Docker实战教程、Docker官网、其他优秀博客(参考过的在文章最后列出) 目录 前言一、容器数据卷1.1 容器数据卷1.2 怎么用1.3 能干什么 二、实践案例2.1 启动ubuntu容器实例,挂载目录:2.2 在ubuntu容器实例的/tmp/docker_data中…

Android 组件化架构思路

作者:往事一块六毛八 为什么要模块化/组件化 随着APP版本不断的迭代,新功能的不断增加,业务也会变的越来越复杂,APP业务模块的数量有可能还会继续增加,而且每个模块的代码也变的越来越多,这样发展下去单一…

GNS3报错“unable to open TAP device tap0 (No such file or directory)”解决

系统:MacOS 13.4 GNS3版本:2.2.35.1 Tunnelblick:3.8.8b 起因 在gns3中使用cloud节点创建 tap 接口连接路由器报错: 解决办法 借助 Tunnelblick工具创建 Tap 虚拟网卡。Tunnelblick下载地址: https://tunnelblic…

Kubernetes入门实战课-初始容器

Kubernetes入门实战课-初始容器 文章目录 Kubernetes入门实战课-初始容器课前准备初始容器Docker 的形态Docker 的安装Docker 的架构 容器的本质隔离原因与虚拟机区别隔离是怎么实现的 镜像创建容器镜像:如何编写正确、高效的Dockerfile镜像的内部机制是什么Dockerf…

MySQL数据库连接查询和存储过程

MySQL数据库连接查询和存储过程 一、连接查询1、内连查询2、左连接3、右链接 二、存储过程1、存储过程简介2、存储过程的优点3、语法3.1 参数分类3.2 不加参数的存储过程3.3 带参数的存储过程3.4删除存储过程3.5 事务和存储过程有什么区别? 三、总结1、连接查询2、存…

【Java项目中 利用Redis实现数据缓存】

文章目录 Java SpringBoot项目中 用Redis实现数据缓存1 环境搭建1.1 maven坐标1.2 配置文件1.3 配置类 2 实现缓存短信验证码3 缓存菜品数据4 Spring Cache 缓存框架4.1 Spring Cache介绍4.2 Spring Cache常用注解4.3 Spring Cache使用方式 Java SpringBoot项目中 用Redis实现数…

一文了解Moonbeam互连合约

什么是互连合约Connected Contracts 简单来说,互连合约是通过Moonbeam连接其他区块链上的一个或多个智能合约,其允许目标链上的用户通过跨链消息传递协议在一个应用中操作不同链上的资产或是服务。 通过互连合约方案,不同迥异的公链技术架构…

计算机内部总线详解

文章目录 总线概述地址总线位宽 数据总线位宽CPU性能指标 例题 总线概述 众所周知,总线就是用来帮助连接两个或多个计算机组件,用于数据传输,计算机内部存在三种类型的总线: 地址总线:用于传输指示计算机中的内存或外…

【uboot1】常用指令

文章目录 1.U-Boot命令之常用命令:7.U-Boot命令之EMMC和SD卡操作命令:一般EMMC和SD卡是同一个东西,没特殊说明,统一MMC来代指EMMC和SD卡8.U-Boot命令之内存操作命令:直接对DRAM进行读写操作,uboot命令中的数…

MySQL数据库高级查询语句

MySQL数据库高级查询语句 一、语句SELECT ----显示表格中一个或数个字段的所有数据记录DISTINCT ----不显示重复的数据记录WHERE ----有条件查询AND OR ----且 或IN ----显示已知的值的数据记录BETWEEN ----显示两个值范围内的数据记录通配符 ----通常通配符都是跟 LIKE 一起使…

强化学习从基础到进阶-案例与实践[5]:梯度策略、添加基线(baseline)、优势函数、动作分配合适的分数(credit)

【强化学习原理项目专栏】必看系列:单智能体、多智能体算法原理项目实战、相关技巧(调参、画图等、趣味项目实现、学术应用项目实现 专栏详细介绍:【强化学习原理项目专栏】必看系列:单智能体、多智能体算法原理项目实战、相关技巧…

解决关于msvcp120.dll丢失的问题(解决方法)

msvcp120.dll是微软软件包的一部分。它是一个库文件,可用于支持软件运行时,msvcp120.dll的作用是提供计算机程序所需的标准库,msvcp120.dll还负责管理堆内存、线程和异常处理函数等。在使用windows编写的应用程序中,通常需要使用此…

【新星计划·2023】Linux系统的架构和组件讲解

作者:Insist-- 个人主页:insist--个人主页 作者会持续更新网络知识和python基础知识,期待你的关注 前言 本文将讲解Linux系统的架构和组件。 目录 一、Linux系统的架构 1、硬件层 2、内核层 3、进程管理子系统 4、内存管理子系统 5、…

JDBC和数据库应用总结

文章目录 1. JDBC介绍2. 相关jar包引入3. JDBC与数据库基本连接4. JDBC API 详解4.1 Connection 接口4.2 Statement 接口4.3 ResultSet 5. PreparedStatement 详解 1. JDBC介绍 JDBC是一套标准接口,这套接口用于操作所有的数据库,不同的数据库厂商对迎合…

在C#下运行Python:IronPython和Pythonnet

在C#下运行Python可能有不同的原因。其中一些原因包括: 使用C#应用程序中不可用的特定Python功能或库。结合Python的简单性和表现力以及C#的性能和稳健性,完成不同任务。与基于Python的系统或服务进行集成。 为实现Python和C#之间的互操作性&#xff0…

Java日志框架介绍

​今天来聊一聊 Java 日志框架,不管是在项目开发阶段的调试,还是项目上线后的运行,都离不开日志。日志具有处理历史数据、定位程序问题、理解程序运行过程等重要作用。在 Spring 项目开发过程中我们常见的日志框架可能就是 logback、log4j2 和…