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

TCP和Http协议

TCP 三次握手:

第一次握手 :

  • 初始状态:开始时,客户端处于 CLOSED(关闭)状态服务端处于 LISTEN(监听)状态,等待客户端的连接请求。
  • 客户端发送请求:客户端向服务端发送一个 SYN(Synchronize Sequence Numbers,同步序列号)报文,该报文将 SYN 标志位置为 1,表示这是一个连接请求报文。同时,客户端会随机初始化一个序列号(seq=x,这里的 x 是一个随机生成的数值),并将此序列号置于 TCP 首部的「序号」字段中。此报文不包含应用层数据,发送完后,客户端进入 SYN_SENT(已发送 SYN 报文等待确认)状态。

第二次握手 :

  • 服务端接收并响应:服务端收到客户端的 SYN 报文后,知道客户端想要建立连接。服务端会以自己的 SYN 报文作为应答,并且也随机初始化自己的序号(seq=yy 也是一个随机生成的数值),将此序号填入 TCP 首部的「序号」字段中。同时,把客户端的 seq 值加 1(即 ack=x+1作为 ACK(Acknowledgment,确认)的值,表示自己已经收到了客户端的 SYN,接着把 SYN 和 ACK 标志位置为 1
  • 服务端发送报文:最后把该报文发给客户端,此报文也不包含应用层数据。发送完这个报文后,服务端进入 SYN_RCVD(已收到 SYN 报文等待客户端确认)状态。

第三次握手

  • 客户端确认:客户端收到服务端的 SYN+ACK 报文后,会对服务端的 SYN 分组进行确认。客户端将 ACK 标志位置为 1,确认序号 ack=y+1(这里的 y 是服务端在第二次握手中发送的序列号),并且把自己的序列号加 1(即 seq=x+1,这里的 x 是客户端在第一次握手中发送的序列号),然后将该报文发送给服务端。此报文可以携带客户到服务端的数据,但如果不携带数据,则不消耗序号。
  • 连接建立:服务端收到客户端的确认报文后,也进入 ESTABLISHED(已建立连接)状态。至此,客户端和服务端都完成了三次握手,双方的 TCP 连接正式建立,之后就可以开始相互发送数据了。

第一次握手断开:客户端会在一段时间后超时并重传 SYN 报文,以尝试重新建立连接。

第二次握手断开:客户端也会进行重传 SYN 报文。而服务器端在发送 SYN-ACK 报文后,会进入 SYN_RCVD(已收到 SYN 报文等待客户端确认)状态,并等待客户端的 ACK 报文。如果服务器端在一段时间内没有收到客户端的 ACK 报文,也会认为连接建立失败,并释放为此次连接申请的资源。

第三次握手断开服务器端由于没有收到客户端的确认报文,会多次重传 SYN-ACK 报文,等待客户端的回应。最终会认为连接建立失败,并释放相关资源。客户端在发送 ACK 报文后,会认为连接已经建立成功。当客户端后续向服务器发送数据时,服务器会以 RST(复位)包响应客户端,客户端收到 RST 包后,就会意识到连接出现了问题。

TCP 四次挥手:

第一次挥手 客户端发出连接释放报文,并且停止发送数据。

第二次挥手 服务器端接收到连接释放报文后,发出确认报文,服务端就进入了CLOSE-WAIT 关闭等待状态

第三次挥手 客户端接收到服务器端的确认请求后,客户端就会进入FIN-WAIT-2(终止等待2)状态,等待服务器发送连接释放报文,服务器将最后的数据发送完毕后,就向客户端发送连接释放报文,服务器就进入了LAST-ACK(最后确认)状态,等待客户端的确认

第四次挥手 客户端收到服务器的连接释放报文后,必须发出确认,ACK=1,ack=w+1,而自己的序列号是seq=u+1,此时,客户端就进入了TIME-WAIT(时间等待)状态,但此时TCP连接还未终止,必须要经过2MSL后(最长报文寿命),当客户端撤销相应的TCB后,客户端才会进入CLOSED关闭状态,服务器端接收到确认报文后,会立即进入CLOSED关闭状态,到这里TCP连接就断开了,四次挥手完成

相关文章:

  • import requests Pycharm 报错
  • 什么是向量化?ElasticSearch如何存储向量化?
  • fedora 安装 ffmpeg 过程记录
  • CUDA 安装 一直卡在Installing Nsight Visual Studio Edition
  • 在 Java 中解析 JSON 数据
  • 读写分离/双主双从
  • springboot中配置logback-spring.xml
  • [特殊字符] LeetCode 62. 不同路径 | 动态规划+递归优化详解
  • Canva迁移策略深度解析:应对每日5000万素材增长,从MySQL到DynamoDB的蜕变
  • Go 错误处理与调试:面向对象的入门教程
  • ubuntu20.04重启后不显示共享文件夹
  • 【C】队列与栈的相互转换
  • Python微博动态爬虫
  • python——Django 框架
  • 零基础学习AI开发项目到项目实战的系统学习路径和推荐案例
  • OpenGauss MySQL兼容库迁移
  • 抽象类和接口
  • 量子计算驱动的金融衍生品定价革命:突破传统蒙特卡洛模拟的性能边界
  • C++ 中的互斥锁
  • 2通道12bit 10G USB高速示波器采集卡
  • “大鼻子情圣”德帕迪约因性侵被判缓刑,还有新的官司等着他
  • 第78届戛纳电影节开幕,罗伯特·德尼罗领取终身成就奖
  • 北斗专访|特赞科技范凌:现在AI主要是“说话”,接下来要“干活”了
  • 上海团队在医学顶刊连发两文,率先提出“证据污染”循证概念
  • 市场监管总局等五部门约谈外卖平台企业
  • 山东省市监局“你点我检”专项抽检:一批次“无抗”鸡蛋农兽药残留超标