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

news2025/2/2 6:04:14

目录

  • 前言
  • 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的三次握手和四次挥手是在面试过程中网络部分考察的最高频的问题,一定要捋清楚它们的过程.

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

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

相关文章

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

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

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

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

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

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

设计模式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…

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

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

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…

origin如何在已经画好的图上修改数据且不改变原图像的画风和格式

例如我现在的.opju文件长这样 现在我换了数据集,我想修改这两个图表里对应的算法里的数据,但是我还想保留这图像现在的形式,可以尝试像下面这样做: 右击第一个图,出现下面,选择Book[sheet1] 选择工作簿 出…

5.3.2 软件设计原则

文章目录 抽象模块化信息隐蔽与独立性衡量 软件设计原则:抽象、模块化、信息隐蔽。 抽象 抽象是抽出事物本质的共同特性。过程抽象是指将一个明确定义功能的操作当作单个实体看待。数据抽象是对数据的类型、操作、取值范围进行定义,然后通过这些操作对数…

【ArcGIS遇上Python】批量提取多波段影像至单个波段

本案例基于ArcGIS python,将landsat影像的7个波段影像数据,批量提取至单个波段。 相关阅读:【ArcGIS微课1000例】0141:提取多波段影像中的单个波段 文章目录 一、数据准备二、效果比对二、python批处理1. 编写python代码2. 运行代码一、数据准备 实验数据及完整的python位…

Spring Security(maven项目) 3.0.2.9版本 --- 改

前言: 通过实践而发现真理,又通过实践而证实真理和发展真理。从感性认识而能动地发展到理性认识,又从理性认识而能动地指导革命实践,改造主观世界和客观世界。实践、认识、再实践、再认识,这种形式,循环往…