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

传输协议TCP-原理部分

传输控制协议TCP(Transmission Control Protocol)一种基于连接可靠稳定无重复的传输协议。

1、TCP头部信息

TCP协议头部信息如下:

一共占用20个字节

  • 16位源端口号:发送进程的主机端口
  • 16位目的端口号:接收主机中进程的端口号
  • 32为的序列号:每个包中都包含序列号,序列号被系统初始化为某个随机值ISN。后续的TCP报文段中的序列号应该加上改报文段所携带数据的第一个字节在整个字节流中的偏移。此处的报文段可以理解为字节流的一段数据包
  • 32位的确认号:目的主机返回确认号,使源主机知道某个或者几个报文段已被接收
  • 四位首部长度:由于TCP内包含一个长度可变的选项部分所以需要一个值来指定这个TCP报文段到底多长
  • URG标志:
  • ACK标志:表示确认号是否有效,携带ACK标识的TCP报文段位确认报文段
  • PSH标志:
  • RET标志:
  • SYN标志:表示建立请求连接。携带SYN标识的TCP报文段位同步报文段
  • FIN标志:标识通知对方本端要关闭连接了。携带FIN标识的TCP报文段位结束报文段
  • 16位窗口大小:是TCP流量控制的一个手段。这里说的窗口指的是接受通告窗口。他告诉对方本端的TCP接收缓冲区还能容纳多少个字节的数据,这样对方就可以控制发送数据的速度。
  • 16位校验和:
  • 16位紧急指针:
  • TCP头部选项:

2、TCP传输连接阶段

  • 建立TCP连接(三次握手)
  • 数据转送
  • 释放TCP连接

概念区分:

三报文握手 == 三次握手/三路握手

四报文挥手 == 四次挥手/四路握手

3、TCP连接的建立

        TCP建立连接需要解决三个问题:

  1. 双方能够知道对方的存在
  2. 双方能够协商一些参数(最大窗口值、是否使用窗口扩大选项、时间戳、服务质量等等)
  3. 双方能够对运输实体资源(例如:缓存大小、连接表中的项目等)进行分配

三次握手过程:

  • 最初两端的TCP进程都处于关闭状态,客户端的某个进程主动发起TCP连接建立
  • TCP服务其被动等待客户进程的TCP请求,所以TCP进入监听状态
  • TCP客户端向TCP服务器进程发送TCP连接请求报文,并且进入同步已发送状态
  • 请求报文的首部中的同步SYN被设置为1,表明这是一个TCP连接请求报文段,32位序列字段seq被设置了初始值,作为TCP客户端所选择的初始序号。
  • TCP服务器进程接收到TCP连接请求报文段后,如果同意建立连接,则向TCP客户进程发送TCP连接请求确认报文段,并且进入同步已接收状态,该报文段首部中的同步位SYN和确认位ACK都设置为1,表明这是一个TCP连接请求确认报文段。序号字段seq被设置了一个初始值y,作为TCP服务器进进程选择的初始序号,确认号字段ack的值被设置成x+1,表明接收到了TCP客户进程序号为x的报文。
  • TCP客户进程收到TCP连接请求确认报文段后,还要向TCP服务器进程发送一个普通的TCP确认报文段,并且进入连接已建立状态,报文段首部中的确认位ACK设置为1,表明这是一个普通的TCP确认报文段。序列号字段seq设置为x+1,确认号字段ack的值被设置成y+1,表明接收到了TCP服务进程序号为y的报文,TCP服务器进程收到该确认报文段后也进入连接已建立状态

上述文字如此繁琐,可以看下图:

常见面试题:假如TCP连接的监视使用的是两次握手而不是三次可以吗?

  • 假设TCP客户进程发送了一个TCP请求报文段,但是可报文段在网络结点中被长时间滞留,TCP客户采用超时重传机制重发TCP请求报文段并被TCP服务进程接收,TCP服务进程,发送一个TCP连接请求报文段确认报文段,然后TCP服务进程和客户可以进行信息传递,当数据转送完成的时候双方都处于关闭状态。
  • 随后滞留在网络结点中的哪个失效的TCP请求文段,被TCP服务进程接收,TCP服务进程又发送一个TCP服务进程又发送一个TCP连接请求确认报文段,并且进入连接已建立状态,由于TCP客户进程并没有发起新的TCP连接请求,并且已经处于关闭状态了,因此不会理会TCP服务器发送的报文段,但是TCP服务器进程已经进入了连接已建立状态,他认为新的TCP连接已经建立好了,就会一直等待TCP客户进程发来数据,将会浪费TCP服务器主机的很多资源。

所以要TCP连接的建立采用三次握手:

四次挥手过程:

TCP通过四次挥手来释放连接,数据通信传输完成之后TCP双方都可以释放连接

  • 假设由客户主动关闭TCP连接,
  • 客户进程发送连接释放报文段 ,并且进入终止等待1状态 ,该报文段中的首部终止位FIN设置位1,ACK设置为1,表明这是一个连接释放报文段,同时也对之前接收的报文段进行确认, seq=u表示TCP客户进程之前已发送过的数据的最后一个字节的序号+1,ack=v表示客户进程之前已收到的数据的最后一个字节的序号+1。
  • 服务器进程接收到TCP连接释放报文段后,会发送一个普通的TCP确认报文段并且进入关闭等待状态,此时TCP客户进程到服务器进程这个方向的连接就释放了,这时的TCP连接属于半关闭状态, 也就是TCP客户进程已经没有数据要发送了,但是TCP服务器进程如果还有数据需要发送,客户进程则还需要接收,这个状态可能会持续一段时间,直到TCP服务器进程将数据发送完毕。
  • TCP客户进程收到TCP确认报文段后就进入终止等待2状态,等待TCP服务器进程发出的TCP连接释放报文段。
  • 当TCP服务器进程的没有数据要发送了后,释放连接(被动关闭), FIN=1,ACK=1表明这是一个连接释放报文段,seq=w,ack=u+1同时也对之前收到的报文段进行确认。
  • TCP客户进程收到TCP连接释放报文段后,必须针对该报文段发送普通的TCP确认报文段,之后进入时间等待状态。
  • TCP服务器进程收到该报文段后就进入关闭状态。

  • 而TCP客户进程还需要经过2MSL后才能进入关闭状态。MSL(Maximum Segment Lifetime)意思是最长报文段寿命,RFC793建议为2分钟

这个等待2MSL是为了保证普通的TCP确认报文段能够被TCP服务端接收到。

相关文章:

传输协议TCP-原理部分

传输控制协议TCP(Transmission Control Protocol)一种基于连接的可靠的稳定的无重复的传输协议。 1、TCP头部信息 TCP协议头部信息如下: 一共占用20个字节 16位源端口号:发送进程的主机端口16位目的端口号:接收主机…...

【android】设置背景图片

改变值&#xff0c;可显示zai在 在theves下面的两个value都要增加名字代码 <item name"windowActionBar">false</item><item name"android:windowNoTitle">true</item><item name"android:windowFullscreen">tru…...

Java微服务实战:使用Spring Boot构建高效服务

引言 在当今的软件开发实践中&#xff0c;微服务架构已成为推动快速开发和部署的关键因素之一。与传统的单体应用相比&#xff0c;微服务架构提供了更高的灵活性和可维护性。本文将探讨如何使用Java和Spring Boot来构建一个微服务应用&#xff0c;介绍基本概念&#xff0c;并通…...

【大模型】基于Hugging Face调用及微调大模型(1)

文章目录 一、前言二、Transformer三、Hugging Face3.1 Hugging Face Dataset3. 2 Hugging Face Tokenizer3.3 Hugging Face Transformer3.4 Hugging Face Accelerate 四、基于Hugging Face调用模型4.1 调用示例4.2 调用流程概述4.2.1 Tokenizer4.2.2 模型的加载4.2.3 模型基本…...

书生·浦语大模型全链路开源体系-笔记作业4

XTuner 微调 LLM:1.8B、多模态、Agent 引自&#xff1a;Tutorial/xtuner/personal_assistant_document.md at camp2 InternLM/Tutorial GitHub 1. XTuner介绍 引自&#xff1a;欢迎来到 XTuner 的中文文档 — XTuner 0.1.18.dev0 文档 1.1. 什么是 XTuner &#xff1f; X…...

chrome调试手机网页

前期准备 1、 PC端安装好chrmoe浏览器 2、 安卓手机安装好chrmoe浏览器 3、 数据线 原文地址&#xff1a;https://lengmo714.top/343880cb.html 手机打开调试模式 进入手机设置&#xff0c;找到开发者模式&#xff0c;然后启用USB调试 打开PC端chrome调试功能 1、点击chr…...

Halcon 双相机标定与拼图(一)

一、概述 最近有一个多相机标定的项目&#xff0c;大概是4个相机来标定&#xff0c;同一坐标系&#xff0c;然后拼接图&#xff0c;之前双相机标定的时候也大概看看&#xff0c;所以今天就找了那个halcon 案例多学一下&#xff0c;后面我打算做一个对位贴合的东西&#xff0c;…...

计算机网络学习记录 应用层 Day6

你好,我是Qiuner. 为记录自己编程学习过程和帮助别人少走弯路而写博客 这是我的 github https://github.com/Qiuner ⭐️ ​ gitee https://gitee.com/Qiuner &#x1f339; 如果本篇文章帮到了你 不妨点个赞吧~ 我会很高兴的 &#x1f604; (^ ~ ^) 想看更多 那就点个关注吧 我…...

如何编辑pdf文件内容?3种PDF编辑方法分享

如何编辑pdf文件内容&#xff1f;在当今数字化时代&#xff0c;PDF文件因其跨平台兼容性和保持原样不变的特点&#xff0c;在办公、学习、生活等多个领域得到了广泛应用。然而&#xff0c;PDF文件的不可编辑性也让许多用户感到困扰。你是否曾经遇到过需要修改PDF文件内容&#…...

汇总!7种大模型的部署方法!

我们如何在本地部署运行私有的开源大型语言模型&#xff08;LLMs&#xff09;呢&#xff1f;本文将向您梳理七种实用的方法及如何选择。 Hugging Face的Transformers 这是一个强大的Python库&#xff0c;专为简化本地运行LLM而设计。其优势在于自动模型下载、提供丰富的代码片段…...

什么是函数?在C语言中如何定义一个函数

函数是编程中用于执行特定任务的一组指令的集合。它有一个名称&#xff08;即函数名&#xff09;&#xff0c;可以通过该名称在程序中多次调用该函数以执行相同的任务。这有助于提高代码的可重用性和可维护性。 在C语言中&#xff0c;函数的定义通常包括以下几个部分&#xff…...

Stable Diffusion——四种模型 LoRA(包括LyCORIS)、Embeddings、Dreambooth、Hypernetwork

目前 Stable diffusion 中用到主要有四种模型&#xff0c;分别是 Textual Inversion &#xff08;TI&#xff09;以 Embeddings 为训练结果的模型、Hypernetwork 超网络模型、LoRA&#xff08;包括 LoRA 的变体 LyCORIS&#xff09;模型、Dreambooth 模型。 视频博主 koiboi 用…...

MySQL深分页,limit 100000,10 优化

文章目录 一、limit深分页为什么会变慢二、优化方案2.1 通过子查询优化&#xff08;覆盖索引&#xff09;回顾B树结构覆盖索引把条件转移到主键索引树 2.2 INNER JOIN 延迟关联2.3 标签记录法&#xff08;要求id是有序的&#xff09;2.4 使用between...and... 我们日常做分页需…...

Windows defender 开启时无法访问共享文件夹,禁用时却可以的解决方法

...

Linux[高级管理]——使用源码包编译安装Apache网站

&#x1f3e1;作者主页&#xff1a;点击&#xff01; &#x1f468;‍&#x1f4bb;Linux高级管理专栏&#xff1a;点击&#xff01; ⏰️创作时间&#xff1a;2024年5月31日14点20分 &#x1f004;️文章质量&#xff1a;96分 在Linux系统上编译和安装Apache HTTP Server是…...

Docker+JMeter+InfluxDB+Grafana 搭建性 能监控平台

JMeter原生报告的缺点&#xff1a; 无法实时共享 报告信息的展示不美观 需求方案 为了解决上述问题&#xff0c;可以通过 InfluxDB Grafana解决 &#xff1a; InfluxDB &#xff1a;是一个开源分布式指标数据库&#xff0c;使用 Go 语言编写&#xff0c;无需外部依赖 应用&am…...

NoSQL实战(MongoDB搭建主从复制)

什么是复制集&#xff1f; MongoDB复制是将数据同步到多个服务器的过程&#xff1b; 复制集提供了数据的冗余备份并提高了数据的可用性&#xff0c;通常可以保证数据的安全性&#xff1b; 复制集还允许您从硬件故障和服务中断中恢复数据。 保障数据的安全性 数据高可用性 (2…...

【讯为Linux驱动开发】3.内核空间和用户空间

【问】内存空间的组成部分&#xff1f;&#xff1f; 内存空间分为内核空间和用户空间 1.内核空间控制硬件资源&#xff0c;提供系统调用接口&#xff0c;保护系统自身安全稳定 2.用户空间实现业务逻辑 【问】如何进入内核空间使用硬件资源&#xff1f; 1.系统调用 2.软中断 3.…...

AI论文:一键生成论文的高效工具

说到这个问题&#xff0c;那真的得看你对“靠谱”的定义是怎样的啦&#xff1f; 众所周知&#xff0c;写论文是一项极其耗时间的事情&#xff0c;从开始的选题到文献资料搜索查阅&#xff0c;大纲整理等等一大堆的繁杂工作是极艰辛的。用AI写论文就不一样了&#xff0c;自动化…...

申请医疗设备注册变更时,需要补充考虑网络安全的情况有哪些?

在申请医疗器械设备注册变更时&#xff0c;需要补充网络安全的情况主要包括以下几点&#xff1a; 网络安全功能更新&#xff1a;如果医疗器械的自研软件发生网络安全功能更新&#xff0c;或者合并网络安全补丁更新的情形&#xff0c;需要单独提交一份自研软件网络安全功能更新…...

【网络】每天掌握一个Linux命令 - iftop

在Linux系统中&#xff0c;iftop是网络管理的得力助手&#xff0c;能实时监控网络流量、连接情况等&#xff0c;帮助排查网络异常。接下来从多方面详细介绍它。 目录 【网络】每天掌握一个Linux命令 - iftop工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景…...

QMC5883L的驱动

简介 本篇文章的代码已经上传到了github上面&#xff0c;开源代码 作为一个电子罗盘模块&#xff0c;我们可以通过I2C从中获取偏航角yaw&#xff0c;相对于六轴陀螺仪的yaw&#xff0c;qmc5883l几乎不会零飘并且成本较低。 参考资料 QMC5883L磁场传感器驱动 QMC5883L磁力计…...

Axios请求超时重发机制

Axios 超时重新请求实现方案 在 Axios 中实现超时重新请求可以通过以下几种方式&#xff1a; 1. 使用拦截器实现自动重试 import axios from axios;// 创建axios实例 const instance axios.create();// 设置超时时间 instance.defaults.timeout 5000;// 最大重试次数 cons…...

css3笔记 (1) 自用

outline: none 用于移除元素获得焦点时默认的轮廓线 broder:0 用于移除边框 font-size&#xff1a;0 用于设置字体不显示 list-style: none 消除<li> 标签默认样式 margin: xx auto 版心居中 width:100% 通栏 vertical-align 作用于行内元素 / 表格单元格&#xff…...

项目部署到Linux上时遇到的错误(Redis,MySQL,无法正确连接,地址占用问题)

Redis无法正确连接 在运行jar包时出现了这样的错误 查询得知问题核心在于Redis连接失败&#xff0c;具体原因是客户端发送了密码认证请求&#xff0c;但Redis服务器未设置密码 1.为Redis设置密码&#xff08;匹配客户端配置&#xff09; 步骤&#xff1a; 1&#xff09;.修…...

uniapp 开发ios, xcode 提交app store connect 和 testflight内测

uniapp 中配置 配置manifest 文档&#xff1a;manifest.json 应用配置 | uni-app官网 hbuilderx中本地打包 下载IOS最新SDK 开发环境 | uni小程序SDK hbulderx 版本号&#xff1a;4.66 对应的sdk版本 4.66 两者必须一致 本地打包的资源导入到SDK 导入资源 | uni小程序SDK …...

NPOI Excel用OLE对象的形式插入文件附件以及插入图片

static void Main(string[] args) {XlsWithObjData();Console.WriteLine("输出完成"); }static void XlsWithObjData() {// 创建工作簿和单元格,只有HSSFWorkbook,XSSFWorkbook不可以HSSFWorkbook workbook new HSSFWorkbook();HSSFSheet sheet (HSSFSheet)workboo…...

rknn toolkit2搭建和推理

安装Miniconda Miniconda - Anaconda Miniconda 选择一个 新的 版本 &#xff0c;不用和RKNN的python版本保持一致 使用 ./xxx.sh进行安装 下面配置一下载源 # 清华大学源&#xff08;最常用&#xff09; conda config --add channels https://mirrors.tuna.tsinghua.edu.cn…...

Python异步编程:深入理解协程的原理与实践指南

&#x1f49d;&#x1f49d;&#x1f49d;欢迎莅临我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 持续学习&#xff0c;不断…...

JUC并发编程(二)Monitor/自旋/轻量级/锁膨胀/wait/notify/锁消除

目录 一 基础 1 概念 2 卖票问题 3 转账问题 二 锁机制与优化策略 0 Monitor 1 轻量级锁 2 锁膨胀 3 自旋 4 偏向锁 5 锁消除 6 wait /notify 7 sleep与wait的对比 8 join原理 一 基础 1 概念 临界区 一段代码块内如果存在对共享资源的多线程读写操作&#xf…...