网络原理(三)—— 传输层 之 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 这个换行符来进行数据的分割,或者其他的分割方法。

面试题:如何让UDP 实现可靠传输??
参考 TCP ,例如:添加序号,确认序号,引入确认应答,超时重传…

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

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

相关文章

MySQL素材怎么导入Navicat???

不管用什么方法都要先关掉MySQL服务&#xff0c;并且提前备份数据&#xff01; 1.有sql文件时候。 打开navicat&#xff0c;运行sql文件 然后点击后面三个点&#xff0c;选中要运行的sql文件&#xff0c;开始。 鼠标右键刷新一下&#xff0c;就能看到sql文件中的表了 2.没有s…

Windows安装ES单机版设置密码

下载ES ES下载链接 我用的是7.17.26 启动前配置 解压之后打开D:\software\elasticsearch-7.17.26\bin\elasticsearch-env.bat 在elasticsearch-env.bat文件中修改jdk的路径 修改前 修改内容 if defined ES_JAVA_HOME (set JAVA"D:\software\elasticsearch-7.17.26\…

mac intel芯片下载安卓模拟器

一、调研 目前主流两个模拟器&#xff1a; 雷神模拟器 不支持macosmumu模拟器pro版 不支持macos intel芯片 搜索到mumu的Q&A中有 “Intel芯片Mac如何安装MuMu&#xff1f;” q&a&#x1f517;&#xff1a;https://mumu.163.com/mac/faq/install-on-intel-mac.html 提…

系统看门狗配置--以ubuntu为例

linux系统配置看门狗 以 ubuntu 系统配置看门狗为例 配置看门狗使用的脚本文件&#xff0c;需要使用管理员权限来执行&#xff1a; 配置是&#xff1a;系统每 30S 喂一次狗&#xff0c;超过 60S 不进行投喂&#xff0c;就会自动重启。 1. 系统脚本内容&#xff1a; #!/bin/b…

每天五分钟深度学习框架pytorch:快速搭建VGG网络的基础模块VGG块

本文重点 前面我们介绍了VGG神经网络,我们知道VGG是由许多的VGG块构成,那么本文我们将使用pytorch搭建VGG块 代码实现: import torch from torch import nn def vgg_block(num_convs,in_channels,out_channels): net=[nn.Conv2d(in_channels,out_channels,kernel_size=3,p…

RocketMQ 知识速览

文章目录 一、消息队列对比二、RocketMQ 基础1. 消息模型2. 技术架构3. 消息类型4. 消费者类型5. 消费者分组和生产者分组 三、RocketMQ 高级1. 如何解决顺序消费和重复消费2. 如何实现分布式事务3. 如何解决消息堆积问题4. 如何保证高性能读写5. 刷盘机制 &#xff08;topic 模…

2_CSS3 背景 --[CSS3 进阶之路]

CSS3 中的背景属性提供了许多强大的功能来增强网页设计&#xff0c;包括但不限于多背景图像、渐变、背景大小控制等。以下是一些关键的 CSS3 背景属性及其用法示例。 1. 多重背景图像 CSS3 允许你为一个元素设置多个背景图像。这些图像按照它们在 background-image 属性中定义…

Kutools for Excel 简体中文版 - 官方正版授权

Kutools for Excel 是一款超棒的 Excel 插件&#xff0c;就像给你的 Excel 加了个超能助手。它有 300 多种实用功能&#xff0c;现在还有 AI 帮忙&#xff0c;能把复杂的任务变简单&#xff0c;重复的事儿也能自动搞定&#xff0c;不管是新手还是老手都能用得顺手。有了它&…

腾讯云AI代码助手编程挑战赛-智能聊天助手

作品简介 本作品开发于腾讯云 AI 代码助手编程挑战赛&#xff0c;旨在体验腾讯云 AI 代码助手在项目开发中的助力。通过这一开发过程&#xff0c;体验到了 AI 辅助编程的高效性。 技术架构 前端: 使用 VUE3、TypeScript、TDesign 和 ElementUI 实现。 后端: 基于 Python 开发…

Spring Data Elasticsearch简介

一、Spring Data Elasticsearch简介 1 SpringData ElasticSearch简介 Elasticsearch是一个实时的分布式搜索和分析引擎。它底层封装了Lucene框架,可以提供分布式多用户的全文搜索服务。 Spring Data ElasticSearch是SpringData技术对ElasticSearch原生API封装之后的产物,它通…

STM32之LWIP网络通讯设计-下(十五)

STM32F407 系列文章 - ETH-LWIP&#xff08;十五&#xff09; 目录 前言 一、软件设计 二、CubeMX实现 1.配置前准备 2.CubeMX配置 1.ETH模块配置 2.时钟模块配置 3.中断模块配置 4.RCC及SYS配置 5.LWIP模块配置 3.生成代码 1.main文件 2.用户层源文件 3.用户层头…

AI浪潮下的IT变革之路:机遇、挑战与重塑未来

前言&#xff1a;哈喽&#xff0c;大家好&#xff0c;今天给大家分享一篇文章&#xff01;并提供具体代码帮助大家深入理解&#xff0c;彻底掌握&#xff01;创作不易&#xff0c;如果能帮助到大家或者给大家一些灵感和启发&#xff0c;欢迎收藏关注哦 &#x1f495; 目录 AI浪…

Edge浏览器网页设置深色模式/暗模式

文章目录 需求分析1. 浏览器中的设置——外观——深色。2. 在Edge浏览器的地址栏如下网址&#xff1a;edge://flags/&#xff0c;直接搜索Dark则有内容弹出&#xff0c;将Default更改为Enable即可设置成功。3. 成果 需求 长期对着电脑屏幕&#xff0c;白色实在太刺眼&#xff…

Type-C双屏显示器方案

在数字化时代&#xff0c;高效的信息处理和视觉体验已成为我们日常生活和工作的关键需求。随着科技的进步&#xff0c;一款结合了便携性和高效视觉输出的设备——双屏便携屏&#xff0c;逐渐崭露头角&#xff0c;成为追求高效工作和娱乐体验人群的新宠。本文将深入探讨双屏便携…

Redis 优化秒杀(异步秒杀)

目录 为什么需要异步秒杀 异步优化的核心逻辑是什么&#xff1f; 阻塞队列的特点是什么&#xff1f; Lua脚本在这里的作用是什么&#xff1f; 异步调用创建订单的具体逻辑是什么&#xff1f; 为什么要用代理对象proxy调用createVoucherOrder方法&#xff1f; 对于代码的详细…

机器学习基础-机器学习的常用学习方法

目录 半监督学习的概念 规则学习的概念 基本概念 机器学习里的规则 逻辑规则 规则集 充分性与必要性 冲突消解 命题逻辑 → 命题规则 序贯覆盖 单条规则学习 剪枝优化 强化学习的概念 1. 强化学习对应了四元组 2. 强化学习的目标 强化学习常用马尔可夫决策过程…

国产3D CAD将逐步取代国外软件

在工业软件的关键领域&#xff0c;计算机辅助设计&#xff08;CAD&#xff09;软件对于制造业的重要性不言而喻。近年来&#xff0c;国产 CAD 的发展态势迅猛&#xff0c;展现出巨大的潜力与机遇&#xff0c;正逐步改变着 CAD 市场长期由国外软件主导的格局。 国产CAD发展现状 …

【机器学习】农业 4.0 背后的智慧引擎:机器学习助力精准农事决策

我的个人主页 我的领域&#xff1a;人工智能篇&#xff0c;希望能帮助到大家&#xff01;&#xff01;&#xff01;&#x1f44d;点赞 收藏❤ 在当今数字化浪潮汹涌澎湃之际&#xff0c;农业领域正经历着一场前所未有的深刻变革&#xff0c;大踏步迈向农业 4.0时代。这一时代…

使用Docker模拟PX4固件的无人机用于辅助地面站开发

前言 最近在制作鸿蒙无人机地面站&#xff0c;模仿的是QGroundControl&#xff0c;协议使用mavlink&#xff0c;记录一下本地模拟mavlink协议通过tcp/udp发送 废话不多说直接上命令 1.启动docker的桌面端 启动之后才能使用docker命令来创建容器 docker run --rm -it jonas…

C#调用OpenCvSharp实现图像的开运算和闭运算

对图像同时进行腐蚀和膨胀操作&#xff0c;顺序不同则效果也不同。先腐蚀后膨胀为开运算&#xff0c;能够消除小斑点和细小的突出物、平滑图像以及改善边缘&#xff1b;先膨胀后腐蚀为闭运算&#xff0c;能够去除噪点、填补图像孔洞、连接邻近物体和平滑物体边界。   OpenCvS…