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

【linux网络(4)】传输层协议详解(上)

目录

  • 前言
  • 1. UDP协议报文详解
  • 2. TCP协议的报文格式
  • 3. TCP的确认应答机制
  • 4. TCP的连接管理机制
    • 1. TCP三次握手的过程
    • 2. TCP四次挥手的过程
  • 5. 总结

前言

上一篇文章介绍了应用层中最重要的http协议,本篇文章将讲解传输层的两个协议: TCP和UDP. 由于UDP是一种简洁的协议,所以本篇文章的核心放在TCP协议上!

注: 如果对HTTP协议了解不深刻,建议先阅读这篇文章:HTTP协议详解

本章重点:

本篇文章会讲解UDP协议的报文格式, 深度解析UDP协议是怎样进行解包/封装的. 之后会讲解TCP的报文格式, 以及TCP协议中的确认应答机制,以及最重要的三次握手和四次挥手问题.

任务:

  1. 对于如何协议都要解决的问题: 如何分离(封装的逆过程), 如何分用?
  2. 理解协议的报文本身
  3. 详细的了解具体的报文字段及各种策略

1. UDP协议报文详解

直接上图:
在这里插入图片描述

1.如何将报头和有效载荷(数据)进行分离(封装)

udp采用固定长度,前8个字节就是它的报头,如何保证读到的报文是完整的呢?通过16位udp长度.

2.如何将有效载荷进行分用?

通过16位目的端口号。这个端口号就是我们上层服务绑定的端口号,根据这个端口号反向查表,找到各个进程,把有效载荷分用给各个进程。

UDP的特点和缓冲区:

注意UDP的最大数据是2^16-1. 也就是64K. 这里经常会在面试中被问到.

在这里插入图片描述

2. TCP协议的报文格式

直接上图:
在这里插入图片描述

1. 如何把报头和有效载荷(数据)进行分离?
在这里插入图片描述

2.如何将有效载荷进行分用?

根据目的端口。远端接收后,就能分析出报文里的目的端口,所以就能把报文交付给指定进程。

TCP报头的其他字段数据, 比如: 序号, 确认序号, 窗口大小, 6位标志位等. 就是TCP用来保证它的效率和可靠性时需要使用到的字段,下面就来边理解TCP的各种机制,边理解报头字段.

3. TCP的确认应答机制

在客户端和服务端基于TCP通信时:
在这里插入图片描述
以第二种方式为例,如果其中一个应答丢失了呢?
假设c发送了四个请求,但是只收到3个应答,但是对于c来说,是不知道对应那个请求的应答丢失的,所以就必须在报头中引入能够标识应答唯一性的字段:32位序号和32位确认信号

在我们发送出去的每一个报文中,都携带有一个序号,接收方收到报文给出应答时,就会在应答中携带确认序号,原则上它是我们收到的报文序号+1
比如3001表示: 3001之前的数据已经全部收到!
在这里插入图片描述

为什么协议报头里面是两个序号?
TCP是全双工的,上面的图只是单向通信的,如下图双向通信:
在这里插入图片描述
服务端除了给客户端应答外,也能给客户端发送数据,而双方在进行通信的时候,发送的是封装成报文(报头/报头+数据)的格式。在TCP中,如果服务器既要给应答,又要发数据,那服务器就有可能把应答数据这两个报文合并成一个报文,这叫做 捎带应答(后面会讲)。这是TCP当中提高传送效率的一个重要机制。

所以此时服务端也要维护自己的数据,这就要填32位序号,又要维护返回的应答,这就要填32位确认序号。
所以在TCP协议里面就要用2个序号。

又有问题了,在TCP通信的过程中,客户端肯定会有很多个,客户端也会发送各种类型的信息给服务端,服务端就会收到各种报文,那服务端怎么区分呢?(服务端到客户端也是如此)

为了区分报文的类型,在TCP报头中,就存在6个标记位(主要是URG,ACK,PSH,RST,SYN,FIN)(其实不止6个,这里主要讲6个)。
其中在确认应答机制中,ACK表示应答报文,只要是应答报文,ACK标记位就变为1,确认序号也要起作用。

所以在确认应答机制中,我们学习了以下几个字段:

  • 32位序号
  • 32位确认序号
  • ACK标记位

在这里插入图片描述

4. TCP的连接管理机制

在这个机制中涉及TCP的三次握手和四次挥手!!

在正常情况下,TCP要经过三次握手建立连接,四次挥手断开连接:

1. TCP三次握手的过程

要明确一点, 三次握手的目的是为了建立连接. 在TCP报头中的六位标记位中, 有一个标记位是SYN. 它代表请求建立连接, TCP三次握手离不开SYN标记位.
在这里插入图片描述

TCP三次握手的过程可以总结为: 客户端向服务器发送一个SYN标记位置1的报文. 服务器收到此报文后, 向客户端发送一个包含了ACK和SYN标记位置1的报文, 标识着服务器收到了客户端的SYN, 并且服务器也想和客户端建立连接. 客户端收到此报文后, 会再给服务端发送一个ACK, 一旦发送此ACK后, 客户端就已经建立好了连接. 同理, 服务器收到此ACK后也就建立好的连接.

可以在图中看到,connect函数发起了三次握手,connect只是要求客户端向服务端发送SYN,从此往后三次握手的具体过程,由双方的oS自动协商.服务器在listen状态时会收到客户端的SYN报文, 对应在代码中也就是使用listen函数进行监听. TCP三次握手建立连接的过程和accept函数是没有关系的, accept函数负责当连接建立好后, 将连接拿到内存当中!

这里又有两个问题:

1. 那如果最后一次客户端对服务端的ACK应答真的丢失了呢?

就要使用RST:reset 连接重置标志位.
收到该标志位的主机,要对异常连接重新释放,重新建立,重新进行三次握手.

2. 为什么是三次握手?其它次数行不行?
这个问题分为奇数次握手和偶数次握手来讲解:
1.偶数次握手

拿四次握手为例, 只要是偶数次握手, 那么最后一个ACK报文一定是服务器发送给客户端的. 此时就会有一个问题: 服务器发送了ACK之后, 就认为建立好连接了. 但是我们知道, 维护连接是有成本的, 如果我们发送回去的ACK报文, 客户端不进行处理, 但是我们又为它建立了连接, 这不是浪费资料了吗? 是的, 不仅如此, 如果使用偶数次握手, 客户端可以无脑向服务器发送SYN报文, 并且收到服务器的ACK报文后不建立连接. 这样就可以低成本的攻击一台服务器, 让它维护的连接数过大, 从而把这个服务挂掉. 而奇数次握手, 一定是客户端最后一个发送ACK, 一旦客户端发送了ACK后就会进行连接状态, 服务器会收到ACK后才会建立连接, 可以防止别人无成本攻击你的主机.

在这里插入图片描述

2. 偶数次握手

很明显奇数次握手肯定是比偶数次握手好的, 那么现在来分析一下, 为什么奇数次握手是三次, 不是一次也不是五次? 很明显一次握手是无法完成建立连接这个任务的. 那么五次握手行不行呢? 当然是可以的, 但是三次握手就足够建立连接, 五次, 七次也能建立连接, 但是三次是最优解.

2. TCP四次挥手的过程

四次挥手的目的是为了断开连接. 在TCP的六位标记位中有一个叫FIN的标记位, 它代表要和对端断开连接. 四次挥手离不开这个标记位.
在这里插入图片描述

TCP四次挥手的过程可以总结为:客户端会先给服务器发送一个带有FIN标志位置1的报文, 服务器收到此请求后会给客户端返回一个ACK, 并且会将没发完的数据发给客户端. 发完后会给客户端发送FIN,标识我的数据已经给你发完, 可以关闭连接了. 此时客户端收到此消息后给服务器发送一个ACK就断开连接了.

对TIME_WAIT状态的理解
连接断开后, 会维持一段时间的TIME_WAIT状态, 在此期间, 不能重新在同样的端口启动服务.
在这里插入图片描述

为什么是TIME_WAIT的时间是2MSL?
在这里插入图片描述

若c端发送FIN时, s端恰好也想和c端断开连接, 那么s端可以把FIN和ACK一起发送给c端. 所以四次挥手在某种情况下也是三次挥手.

为什么一般情况下是四次挥手?

使用最小的通信成本,建立了断开连接的共识。
双方都不和对方通信了,并且也知道对方也不和我通信了!

所以在连接管理机制中,我们学习了以下几个字段:

  • SYN标记位
  • RST标记位
  • FIN标记位

5. 总结

本篇文章介绍的两种机制是TCP协议保证自身数据传输时的可靠性和效率性的.其中TCP的三次握手和四次挥手是在面试过程中网络部分考察的最高频的问题,一定要捋清楚它们的过程.

相关文章:

【linux网络(4)】传输层协议详解(上)

目录 前言1. UDP协议报文详解2. TCP协议的报文格式3. TCP的确认应答机制4. TCP的连接管理机制1. TCP三次握手的过程2. TCP四次挥手的过程 5. 总结 前言 上一篇文章介绍了应用层中最重要的http协议,本篇文章将讲解传输层的两个协议: TCP和UDP. 由于UDP是一种简洁的协…...

【Docker】dockerfile识别当前构建的镜像平台

在编写dockerfile的时候,可能会遇到需要针对不同平台进行不同操作的时候,这需要我们对dockerfile进行针对性修改。 比如opencv的依赖项libjasper-dev在ubuntu18.04上就需要根据不同的平台做不同的处理,关于这个库的安装在另外一篇博客里面有…...

【esp32-uniapp】uniapp小程序篇02——引入组件库

一、引入组件库(可自行选择其他组件库) 接下来介绍colorUI、uview plus的安装,其他的安装可自行查找教程 1.colorUI weilanwl/coloruicss: 鲜亮的高饱和色彩,专注视觉的小程序组件库 下载之后解压,将\coloruicss-ma…...

使用C# 如何获取本机连接的WIFI名称[C# ---1]

前言 楼主最近在写一个WLAN上位机,遇到了使用C#查询SSID 的问题。CSDN上很多文章都比较老了,而且代码过于复杂。楼主自己想了一个使用CMD来获得SSID的方法 C#本身是没有获得WINDOWS网路信息的能力,必须要用系统API,WMI什么的&…...

机器学习优化算法:从梯度下降到Adam及其实验改进

机器学习优化算法:从梯度下降到Adam及其实验改进 在机器学习和深度学习领域,模型的训练过程本质上是一个优化问题。优化算法的作用是通过调整模型参数,使得模型在给定的数据 集上实现最优性能。而优化算法的效率和效果直接决定了模型的收敛速度和最终表现。 一、优化算法的…...

K8s 中 Ingress-Nginx 结合负载均衡器(Ingress nginx combined with load balancer)

K8s 中 Ingress-Nginx 结合负载均衡器(LB)的部署全解析 在 K8s的世界里,有效地管理和路由进入集群的外部流量是至关重要的。Ingress-Nginx 作为一款强大的 Ingress 控制器,搭配负载均衡器(LB),…...

MATLAB中savefig函数用法

目录 语法 说明 示例 将当前图窗保存到 FIG 文件 将多个图窗保存到 FIG 文件 使用 compact 选项保存图窗 savefig函数的功能是将图窗和内容保存到 FIG 文件。 语法 savefig(filename) savefig(H,filename) savefig(H,filename,compact) 说明 savefig(filename) 将当前…...

Windows系统中Docker可视化工具对比分析,Docker Desktop,Portainer,Rancher

Docker可视化工具对比分析,Docker Desktop,Portainer,Rancher Windows系统中Docker可视化工具对比分析1. 工具概览2. Docker Desktop官网链接:主要优点:主要缺点:版本更新频率: 3. Portainer官网…...

创业项目怎么找?

寻找创业项目需要系统的方法和策略,以下是一些有效的途径和方法,帮助你找到合适的创业项目: 1. 从自身出发 兴趣爱好:选择自己感兴趣的领域,更容易坚持并投入热情。例如,如果你对网络购物感兴趣&#xff0…...

【机器学习】自定义数据集,使用scikit-learn 中K均值包 进行聚类

一、K 均值算法简介 K 均值算法的目标是将数据集划分为 K 个簇,使得每个数据点属于离它最近的簇中心(centroid)所代表的簇。 K均值聚类算法步骤 ① 初始化: 随机选择原始数据的K个数据点作为初始质心(聚类中心&…...

RocketMQ 系列文章

目录 使用RocketMQ 的业务系统怎么处理消息的重试? 使用RocketMQ 的业务系统怎么保证消息处理的幂等性? 使用RocketMQ 的业务系统怎么处理消息的积压? RocketMQ 怎么保证消息的可靠性? RocketMQ 怎么保证消息的顺序性的? RocketMQ 的 Topic 和消息队列MessageQueue信…...

进阶数据结构——高精度运算

目录 前言一、高精度运算的定义与背景二、高精度运算的实现方式三、高精度运算的算法实现四、高精度运算的应用场景五、代码模版(c)六、经典例题1.[高精度加法](https://www.lanqiao.cn/problems/1516/learning/?page1&first_category_id1&name…...

42【语言的编码架构】

不同语言采用的编码架构不一样 火山采用:UTF-16 易语言采用:GBK php采用:UTF-8 这个编码架构指的就是文本所代表的字节集,比如易语言中“你好”表示的就是{196,227,186,195} 窗口程序集名保 留 保 留备 注窗口程序集_启动窗口 …...

设计模式Python版 原型模式

文章目录 前言一、原型模式二、原型模式示例三、原型管理器 前言 GOF设计模式分三大类: 创建型模式:关注对象的创建过程,包括单例模式、简单工厂模式、工厂方法模式、抽象工厂模式、原型模式和建造者模式。结构型模式:关注类和对…...

用 JavaScript 打造交互式表格:添加与删除行功能

前言 在网页开发中,创建交互式表格是很常见的。今天我们通过一个示例,来展示如何使用 HTML、CSS 和 JavaScript 实现一个能够动态添加和删除行的表格,并详细解释其中 JavaScript 部分的代码逻辑。 功能展示 初始状态:页面加载后…...

Linux02——Linux的基本命令

目录 ls 常用选项及功能 综合示例 注意事项 cd和pwd命令 cd命令 pwd命令 相对路径、绝对路径和特殊路径符 特殊路径符号 mkdir命令 1. 功能与基本用法 2. 示例 3. 语法与参数 4. -p选项 touch-cat-more命令 1. touch命令 2. cat命令 3. more命令 cp-mv-rm命…...

服务器虚拟化实战:架构、技术与最佳实践

📝个人主页🌹:一ge科研小菜鸡-CSDN博客 🌹🌹期待您的关注 🌹🌹 1. 引言 服务器虚拟化是现代 IT 基础设施的重要组成部分,通过虚拟化技术可以提高服务器资源利用率、降低硬件成本&am…...

.Net WebAPI -[HttpPut(“{fileServiceId:int}“)]

[HttpPut("{fileServiceId:int}")] 这个写法是 ASP.NET Core 中的一个路由特性,用于定义一个 HTTP PUT 请求的路由,并指定路由参数的类型。 解析 HttpPut [HttpPut]: 这是一个 ASP.NET Core 的路由特性,用于标记一个方…...

AI大模型开发原理篇-1:语言模型雏形之N-Gram模型

N-Gram模型概念 N-Gram模型是一种基于统计的语言模型,用于预测文本中某个词语的出现概率。它通过分析一个词语序列中前面N-1个词的出现频率来预测下一个词的出现。具体来说,N-Gram模型通过将文本切分为长度为N的词序列来进行建模。 注意:这…...

[250201] isd v0.3.0 发布:全新快捷键逻辑及其他改进 | Puma 6.6.0 版本发布

目录 isd v0.3.0 发布:全新快捷键逻辑及其他改进Puma 6.6.0 版本发布🆕 新特性🛠️Bug 修复💪 性能改进🔄 代码重构 isd v0.3.0 发布:全新快捷键逻辑及其他改进 isd (Interactive Systemd) 是一款文本用户…...

修改题注标签

为了防止原博主删帖,故转到自己账号中,出处如下 转载:(152条消息) 修改题注标签_Z_shsf的博客-CSDN博客_seq图arabic怎么解决 问题:论文中存在 标签图1- 和标签图 ,如何合并两种标签 成为图 并一起计数 按 AltF9 查…...

pytorch实现循环神经网络

人工智能例子汇总:AI常见的算法和例子-CSDN博客 PyTorch 提供三种主要的 RNN 变体: nn.RNN:最基本的循环神经网络,适用于短时依赖任务。nn.LSTM:长短时记忆网络,适用于长序列数据,能有效解决…...

Python从零构建macOS状态栏应用(仿ollama)并集成AI同款流式聊天 API 服务(含打包为独立应用)

在本教程中,我们将一步步构建一个 macOS 状态栏应用程序,并集成一个 Flask 服务器,提供流式响应的 API 服务。 如果你手中正好持有一台 MacBook Pro,又怀揣着搭建 AI 聊天服务的想法,却不知从何处迈出第一步,那么这篇文章绝对是你的及时雨。 最终,我们将实现以下功能: …...

leetcode 2080. 区间内查询数字的频率

题目如下 数据范围 示例 这题十分有意思一开始我想对每个子数组排序二分结果超时了。 转换思路:我们可以提前把每个数字出现的位置先记录下来形成集合, 然后拿着left和right利用二分查找看看left和right是不是在集合里然后做一个相减就出答案了。通过…...

深入了解 SSRF 漏洞:原理、条件、危害

目录 前言 SSRF 原理 漏洞产生原因 产生条件 使用协议 使用函数 漏洞影响 防御措施 结语 前言 本文将深入剖析 SSRF(服务端请求伪造)漏洞,从原理、产生原因、条件、影响,到防御措施,为你全面梳理相关知识&am…...

11.QT控件:输入类控件

1. Line Edit(单行输入框) QLineEdit表示单行输入框,用来输入一段文本,但是不能换行。 核心属性: 核心信号: 2. Text Edit(多行输入框) QTextEdit表示多行输入框,也是一个富文本 & markdown编辑器。并且能在内容超…...

Cesium+Vue3教程(011):打造数字城市

文章目录 Cesium打造数字城市创建项目加载地球设置底图设置摄像头查看具体位置和方向添加纽约建筑模型并设置样式添加纽约建筑模型设置样式划分城市区域并着色地图标记显示与实现实现飞机巡城完整项目下载Cesium打造数字城市 创建项目 使用vite创建vue3项目: pnpm create v…...

Windows系统本地部署deepseek 更改目录

本地部署deepseek 无论是mac还是windows系统本地部署deepseek或者其他模型的命令和步骤是一样的。 可以看: 本地部署deepsek 无论是ollama还是部署LLM时候都默认是系统磁盘,对于Windows系统,我们一般不把应用放到系统盘(C:)而是…...

基于Python的药物相互作用预测模型AI构建与优化(下.代码部分)

四、特征工程 4.1 分子描述符计算 分子描述符作为量化分子性质的关键数值,能够从多维度反映药物分子的结构和化学特征,在药物相互作用预测中起着举足轻重的作用。RDKit 库凭借其强大的功能,为我们提供了丰富的分子描述符计算方法,涵盖了多个重要方面的分子性质。 分子量…...

[Python学习日记-79] socket 开发中的粘包现象(解决模拟 SSH 远程执行命令代码中的粘包问题)

[Python学习日记-79] socket 开发中的粘包现象(解决模拟 SSH 远程执行命令代码中的粘包问题) 简介 粘包问题底层原理分析 粘包问题的解决 简介 在Python学习日记-78我们留下了两个问题,一个是服务器端 send() 中使用加号的问题&#xff0c…...