网络原理(三)—— 传输层 之 UDP 和 TCP协议

传输层

在传输层两大关键的协议就是UDP和TCP协议了,除此之外,还有别的传输层协议,本文章将介绍UDP和TCP协议,重点介绍TCP协议。

首先回顾TCP和UDP 的特点:
UDP:不可靠传输,面向数据包,全双工
TCP:可靠传输,面向字节流,全双工

UDP 协议

UDP报文格式:
在这里插入图片描述
源端口号和目的端口号耳熟能详了。

UDP长度是指整个UDP数据包的长度(报头 + 载荷),由于是16位的长度,所以整个UDP数据包最大的长度就是 2^16-1 个字节(单位是字节)即 64KB

16位UDP校验和是校验UDP数据包有没有出错,这和 https 的校验和不一样,https 是为了防止有人篡改数据,这里的UDP校验和是为了防止出现比特翻转(0->1,1->0),也就是防止原始数据发生比特翻转导致数据错误。

最后就是载荷内容

UDP 数据包的报头固定是64个比特位也就是8个字节。

由于UDP最大长度是68KB,在现在的互联网时代,远远不够用,所以引入了下面的 TCP 协议。

TCP 协议

TCP报文的格式:
在这里插入图片描述

32位序号:该报文的载荷数据的第一个字节的起始编号
32位确认序号:说明该报文的确认报文,确认序号说明自己已经接收到的最后一个数据包的最后一个字节的编号+1,也就是你下一个数据包发送的序号应该凑够这里开始。举个例子:假设一个数据包序号为1000,载荷数据占1000字节,对方正常接收,之后需要返回一个确认报文,该报文的确认序号应该是2001。说明2001前面的全部的数据包已经被接收了。

4位首部长度是指首部最大的长度是多少,单位是(4字节)。说明TCP报头的最大长度就是 (2^4 -1)* 4 = 60 字节

确认应答

确认应答是指当一方发送数据到达另一方之后,另一方需要返回一个确认数据包,这就是保证可靠传输的其中一种保证。

在TCP报头中我们发现一个有六个标志位的部分:
在这里插入图片描述
当 ack 为 1 的时候,说明这是一个确认应答的数据包。

超时重传

当一方发送完数据包之后,如果迟迟未等到确认应答的话,就会认为改数据包发生了丢包了,因此为了保证可靠传输,我们需要进行重新传输改数据包,这就是超时重传。

保证可靠传输的关键就在于确认应答和超时重传。

连接管理

三次握手

在客户端和服务器建立连接的时候,TCP使用的是三次握手的流程。

首先服务器是被动接收客户端的请求,因此建立连接的发起者一定是客户端,客户端首先发送一个同步报文,然后服务器接收到同步报文之后,就会返回一个确认应答和同步报文,最后客户端返回确认应答数据包。

在这里插入图片描述
同步报文的特点是 六个标志位里的 syn 是 1.

为什么是三次握手???
首先TCP是有连接的,具体体现在客户端和服务器分别保存了对端的信息。
连接的建立还需要确保双方的发送能力和接收能力都没问题,能正常进行数据通信。
因此客户端发送syn,如果服务器正常接收,说明客户端的发送能力没有问题,这时候服务器发送syn+ack,此时客户端如果额能正常接收的话,说明客户端知道服务器可以正常接收和发送数据,但是服务器这边不知道客户端是否能正常接收数据,因此客户端需要再次发送一个数据包也就是确认应答数据包ack,服务器接收完毕之后,双方就都确定了对方的接收和发送能力正常,也保存了对端的信息,可以开启会话。

由于我们把 syn 和 ack 合并在一起发送给客户端,所以只需要一次,而不是两次,因此四次握手就没有很大的必要了。两次握手又不足以验证双方各自的发送和接收能力正常

三次握手的作用:
首先初步验证通信链路是否是通畅的
验证双方各自的发送能力和接收能力是否正常(这就是为什么两次握手不行)
协商关键信息(序号是从哪里开始的)

三次握手的状态:
在这里插入图片描述

当服务器程序一启动,就会由 CLOSED 状态 切换为 LISTEN 状态。

LISTENED 状态:服务器已经启动,可以随时连接客户端

SYN_SEND 和 SYN_RCVD,分别是 syn 发送和接收状态,一般很难看到,因为TCP连接的建立很快就能发生。

ESTABLISHED:是连接建立完毕的状态,随时可以进行数据通信

四次挥手

首先明确一点就是客户端和服务器都可以主动断开连接。

断开连接一般是四次挥手:
在这里插入图片描述
主动申请断开连接的需要先发送一个 FIN 数据包(标识位FIN 为1)
然后接收到 FIN 数据包之后需要返回 ACK
接着发送 FIN
最后 返回ACK
TCP连接就会释放

为什么三次握手第二次的数据包SYN可以和ACK 一起,而四次挥手的中间的 FIN 和 ACK 不能合并呢?
因为三次握手的第二份数据包中SYN和ACK 是由内核决定的,当接收到客户端的SYN 之后,会立即返回syn+ack
然而四次挥手的ack 是由内核决定的,但是 FIN 是由应用程序的代码决定的,当程序执行到 socket.close 之后,才会发送 FIN 数据包

四次挥手的状态:
在这里插入图片描述
这里要注意的是:谁先发送 FIN,谁就会进入到 TIME_WAIT 状态
谁后发送FIN ,谁就会进入到 CLOSE_WAIT 状态

异常情况的处理

这里列出四种异常情况。

一、进程崩溃了
进程崩溃和主动退出没有本质区别,虽然进程崩溃了,但是只是应用层不行了,传输层的TCP连接还是存在的,因此这里会发生四次挥手来释放连接

二、主机正常关机了
正常的主机关机流程,关机需要一定的时间,在这段时间中可以进行四次挥手

三、不正常关机
如果是不正常关机,例如台式机断电,那么四次挥手可能就没有挥完。举个例子,如果A关机之前发送了一个FIN,在收到 B 的 FIN 之后,A已经关机了,这就意味着B是永远都收不到 ACK的了,那么由于 B 迟迟没有收到 ACK,那么首先会认为发生了丢包,进行超时重传,当超时重传几次之后还是没有收到ACK,就会认为对端发生了严重的错误,B就会主动放连接。
在这里插入图片描述

上面的情况是A发出去 FIN 之后,如果A突然断电,没有发送FIN:
1)接收方突然断电
那么这时候 发送方 发送的业务数据迟迟没有得到确认报文,那么 发送 首先会认为发生丢包开始进行超时重传,等到多次迟迟没有得到回应,这时候就会发触发 “重置TCP连接”,发送复位报文(标识位RST为1),【复位报文是指重新建立连接,从头来过发送数据】如果没有得到ACK,那么服务器会单方面断开连接。
2)发送方突然断电
这时候客户端不知道是服务器挂了还是服务器只是没有继续发送数据了,那么客户端就会先等着,等待到一定时间之后就会发送一个 “心跳包”,(心跳包只是为了触发ack,确认一下服务器是否存活,不携带任何业务数据)【这个也叫做保活机制,但是由于TCP发送心跳包的时间过长,一般我们会在应用层重新实现心跳包的逻辑代码】

四、网线断开了
这种情况,站在 A 的视角会认为是第三种情况,A最后会放弃连接
站在B 的视角会认为是第三种情况,B会主动放弃连接。

滑动窗口

由于TCP是可靠传输,那么必定会影响到传输的效率,相比于UDP来说,TCP的传输效率是远远小于UDP的。为了在可靠传输的基础上尽可能提高传输效率,我们使用滑动窗口的概念。

这里的窗口是指接收方的缓冲区的大小,最多可以容纳多少个TCP数据包,当接收方接收完数据后一般会返回ack,其中 ack 里面就会包含接收方剩余窗口容量(对应的就是16位窗口大小),这样发送方就可以根据窗口
大小来进行批量传输数据,就不用一个一个地慢慢传输了。

16 位窗口大小并不是窗口大小的极限值,在TCP报头里还有一个叫做选项的数值,里面有一个数值是窗口扩展因子,假设窗口扩展因子为2,那么窗口大小要左移( << )两位

滑动窗口不能无限大,大了会影响传输效率。

快速重传

由于接收方有窗口(缓冲区),所以如果其中有一个数据包发生了丢包就会触发快速重传那个丢失的数据包,然后继续之前的传输。因为数据包已经在缓冲区排列好了,不需要重新重传已经发送过的数据包

在这里插入图片描述

流量控制

流量控制是调整发送方的传输速率,避免接收方不能及时处理数据就导致丢包,那么我们就会引入流量控制。

当接收方处理不过来的时候,发送方会降低发送的速率;当接收方还可以继续处理更多的数据的时候,发送方会提高传输的速率,这就是流量控制。

拥塞控制

由于传输效率还与当前网络的链路有关,如果当前网络占用率高,那么发送方就要降低发送速率,如果当前网络链路占用率低,可以提高发送速率。

在这里插入图片描述
慢启动目前已经被弃用,现在使用的是快启动。

首先有一个窗口的阀门值,先发送一个数据包,每轮传输的数据包数量等于前一轮传输的数据包数量 * 2,直到达到窗口的阀门值,之后每轮传输的数据包会 + 1,也就是开始是指数增长的,达到阀门值之后就变成线性增长了。

假设当前窗口大小调整到了24,如上图所示,这时候已经到了网络链路的极限的时候,也就是发生了丢包,发送方收到了连续的 3 个 ack 之后,就会进行快启动,现在窗口阀门值会变成当前窗口的 1/2 也就是 24 / 2 = 12,发送数据量会降到新的阀门值,之后继续进行 + 1 的线性增长

如果是慢启动,新的窗口阀门值还是当前极限窗口的 1/2 也就是12 ,这时候传输的数据包的数量降为1,重新开始 * 2 的指数增长到达阀门值然后进行 + 1 的线性增长

从快启动和慢启动的区别来看,快启动会效率高一些,所以现在我们使用的是快启动。

窗口的实际大小等于 MIN(流量控制的窗口值,拥塞控制的窗口值)

延迟应答

当接收到数据的时候不立即返回 ack,而是等一会再返回 ack,这就是延迟应答

延迟应答可以让接收方有一些时间先处理一下缓冲区(窗口)的数据,这样等一会,窗口就会变得大一些,那么 ack 返回的窗口的大小就可以大一些,那么发送方就可以批量传输更多的数据了,再一定程度上提高了传输效率。

捎带应答

就是在返回 ack 的时候顺便把业务数据也一起带上,捎带应答是配合延迟应答使用的,延迟应答一般是等到接收方需要发送业务数据的时候把 ack 一起带上,这样可以减少网络开销,在一定程度上提高了传输效率。

面向字节流 —— 粘包问题

由于TCP是面向字节流的,所以在拆包之后,数据可能发生粘包问题,就是拆完包之后分不出哪些数据是一组,哪些数据是另一组。

举个例子,发送方发送 aaa, bbb, ccc 这三个数据包,在接收方的传输层里进行拆包然后数据就可能变成这样 aaabbbccc,交给应用层的时候就无法区分了,这就是粘包问题。

要解决粘包问题需要在应用层处理,在传输层是无解的,在设计应用层协议的时候,我们需要定义好如何区分这些数据,可以像之前我们写TCP回显服务器和客户端一样,使用 \n 这个换行符来进行数据的分割,或者其他的分割方法。

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

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

相关文章

针对服务器磁盘爆满,MySql数据库始终无法启动,怎么解决

&#xff08;点击即可进入聊天助手&#xff09; 很多站长在运营网站的过程当中都会遇到一个问题,就是网站突然无法打开,数据一直无法启动 无论是强制重启还是,删除网站内的所有应用,数据库一直无法启动 这个时候,就需要常见的运维手段了,需要对服务器后台各个资源,进行逐一排查…

高性能现代PHP全栈框架 Spiral

概述 Spiral Framework 诞生于现实世界的软件开发项目是一个现代 PHP 框架&#xff0c;旨在为更快、更清洁、更卓越的软件开发提供动力。 特性 高性能 由于其设计以及复杂精密的应用服务器&#xff0c;Spiral Framework框架在不影响代码质量以及与常用库的兼容性的情况下&a…

【STM32-学习笔记-6-】DMA

文章目录 DMAⅠ、DMA框图Ⅱ、DMA基本结构Ⅲ、不同外设的DMA请求Ⅳ、DMA函数Ⅴ、DMA_InitTypeDef结构体参数①、DMA_PeripheralBaseAddr②、DMA_PeripheralDataSize③、DMA_PeripheralInc④、DMA_MemoryBaseAddr⑤、DMA_MemoryDataSize⑥、DMA_MemoryInc⑦、DMA_DIR⑧、DMA_Buff…

SQL Server中可以通过扩展事件来自动抓取阻塞

在SQL Server中可以通过扩展事件来自动抓取阻塞&#xff0c;以下是详细流程&#xff1a; 开启阻塞跟踪配置&#xff1a; • 执行以下SQL语句来启用相关配置&#xff1a; EXEC sp_configureshow advanced options, 1; RECONFIGURE; EXEC sp_configure blocked process thresh…

【爬虫】单个网站链接爬取文献数据:标题、摘要、作者等信息

源码链接&#xff1a; https://github.com/Niceeggplant/Single—Site-Crawler.git 一、项目概述 从指定网页中提取文章关键信息的工具。通过输入文章的 URL&#xff0c;程序将自动抓取网页内容 二、技术选型与原理 requests 库&#xff1a;这是 Python 中用于发送 HTTP 请求…

关于扫描模型 拓扑 和 传递贴图工作流笔记

关于MAYA拓扑和传递贴图的操作笔记 一、拓扑低模: 1、拓扑工作区位置: 1、准备出 目标 高模。 (高模的状态如上 ↑ )。 2、打开顶点吸附,和建模工具区,选择四边形绘制. 2、拓扑快捷键使…

解决无法远程管理Windows Server服务器核心安装

问题 有时&#xff0c;人们会为了节省运算资源&#xff0c;例如运行Hyper-V虚拟机&#xff0c;而选择Windows Server核心安装&#xff0c;即无图形化界面。这时&#xff0c;我们就只能通过Powershell命令对其进行操控&#xff0c;或为了获得图形化界面而使用远程服务器管理工具…

【计算机网络】lab7 TCP协议

&#x1f308; 个人主页&#xff1a;十二月的猫-CSDN博客 &#x1f525; 系列专栏&#xff1a; &#x1f3c0;计算机网络_十二月的猫的博客-CSDN博客 &#x1f4aa;&#x1f3fb; 十二月的寒冬阻挡不了春天的脚步&#xff0c;十二点的黑夜遮蔽不住黎明的曙光 目录 1. 实验目的…

JavaRestClient 客户端初始化+索引库操作

1. 介绍 ES官方提供了各种不同语言的客户端&#xff0c;用来操作ES。这些客户端的本质就是组装DSL语句&#xff0c;通过http请求发送给ES。 Elasticsearch目前最新版本是8.0&#xff0c;其java客户端有很大变化。不过大多数企业使用的还是8以下版本 2. 客户端初始化 在elastic…

【JVM-2.2】使用JConsole监控和管理Java应用程序:从入门到精通

在Java应用程序的开发和运维过程中&#xff0c;监控和管理应用程序的性能和资源使用情况是非常重要的。JConsole是Java Development Kit&#xff08;JDK&#xff09;自带的一款图形化监控工具&#xff0c;它可以帮助开发者实时监控Java应用程序的内存、线程、类加载以及垃圾回收…

基于html5实现音乐录音播放动画源码

源码介绍 基于html5实现音乐录音播放动画源码是一款类似Shazam的UI&#xff0c;点击按钮后&#xff0c;会变成为一个监听按钮。旁边会有音符飞入这个监听按钮&#xff0c;最后转换成一个音乐播放器。 效果预览 源码获取 基于html5实现音乐录音播放动画源码

《自动驾驶与机器人中的SLAM技术》ch1:自动驾驶

目录 1.1 自动驾驶技术 1.2 自动驾驶中的定位与地图 1.1 自动驾驶技术 1.2 自动驾驶中的定位与地图 L2 在技术实现上会更倾向于实时感知&#xff0c;乃至可以使用感知结果直接构建鸟瞰图&#xff08;bird eye view, BEV&#xff09;&#xff0c;而 L4 则依赖离线地图。 高精地…

【LeetCode】:删除回文子数组【困难】

class Solution { public:// 思考:能否用滚动数组进行优化int minimumMoves(vector<int>& arr) {// 定义状态dp[i][j]为i-j的最小步数int n arr.size();vector<vector<int>> dp(n, vector<int>(n, 1e9 7));// 可以把这 1 次理解为一种 最小操作单…

ChatGPT入门之文本情绪识别:先了解LSTM如何处理文字序列

文章目录 0. 首先聊聊什么是RNN1. 理解LSTM&#xff0c;从数据如何喂给 LSTM开始2. LSTM每个门是如何处理序列数据的&#xff1f;2.1 遗忘门&#xff08;Forget Gate&#xff09;&#xff1a;该忘掉哪些信息&#xff1f;2.2 输入门&#xff08;Input Gate&#xff09;&#xff…

AI学习路线图-邱锡鹏-神经网络与深度学习

1 需求 神经网络与深度学习 2 接口 3 示例 4 参考资料

C#用直线和曲线抗锯齿

使用 GDI 绘制一条线时&#xff0c;要提供线条的起点和终点&#xff0c;但不必提供有关线条上各个像素的任何信息。 GDI 与显示驱动程序软件协同工作&#xff0c;确定将打开哪些像素以在特定显示设备上显示该线条。 效果对比 代码实现 关键代码 e.Graphics.SmoothingMode Sm…

【opencv】第8章 图像轮廓与图像分割修复

8.1 查找并绘制轮廓 一个轮廓一般对应一系列的点&#xff0c;也就是图像中的一条曲线。其表示方法可能 根据不同的情况而有所不同。在OpenCV 中&#xff0c;可以用findContours()函数从二值图 像中查找轮廓 8.1.1 寻找轮廓&#xff1a; findContours() 函数 findContours) 函…

Unity 大地图功能 离线瓦片地图

不使用第二个摄像机实现类似开放世界的大地图功能。 功能如下&#xff1a; 按下M键打开/关闭大地图功能 打开大地图时&#xff0c;默认玩家位置居中 大地图支持拖拽&#xff0c;可调节拖拽速度&#xff0c;支持XY轴翻转 支持大地图设置边缘偏移量 可设置是否启动拖拽边界 …

Bootstrap 前端 UI 框架

Bootstrap官网&#xff1a;Bootstrap中文网 铂特优选 Bootstrap 下载 点击进入中文文档 点击下载 生产文件是开发响应式网页应用&#xff0c;源码是底层逻辑代码&#xff0c;因为是要制作响应式网页&#xff0c;所以下载开发文件 引入 css 文件&#xff0c; bootstrap.css 和 …

error: linker `link.exe` not found

开始学习rust&#xff0c;安装好rust的环境&#xff0c;开始从hello world开始&#xff0c;结果用在win10环境下&#xff0c;使用vs code或cmd窗口编译rust报错&#xff1a; PS E:\study_codes\rust-demo\chart01> rustc hello.rs error: linker link.exe not found| note:…