传输层(port)UDP/TCP——解决怎么发,发多少,出错了怎么办

**传输层:**负责数据能够从发送端传输接收端.

传输层所封装的报头里一定有:源端口号和目的端口号的。
**端口号:**可以标识一台主机中的唯一一个进程(运用程序),这样当数据传输到传输层的时候就可以通过端口号来辨别上层交付的对象是谁。

有些服务器是非常常用的, 为了使用方便, 人们约定一些常用的服务器, 都是用以下这些固定的端口号: ssh服务器, 使用22端口
ftp服务器, 使用21端口
、 telnet服务器, 使用23端口
http服务器, 使用80端口
https服务器, 使用443
执行下面的命令, 可以看到知名端口
cat /etc/services

一个端口号只可以对应一个进程,一个进程可以绑定多个端口号。

传输的协议:结构体字段,把端口号和数据包装。

UDP协议:

UDP的结构非常简单
1、无连接:知道对方的端口号和IP就可以发送数据,不需要链接
2、不可靠:没有确认机制,既不能确定对方是否收到了发送方发送的数据,也就没有重传重传机制——不可靠
3、面向数据报:一次发多少接收方就要读多少
在这里插入图片描述

缓冲区

发送缓冲区:UDP没有真正意义上的发送缓冲区. 调用sendto会直接交给内核, 由内核将数据传给网络层协议进行后续的传输动作;
接收缓冲区:UDP具有接收缓冲区. 但是这个接收缓冲区不能保证收到的UDP报的顺序和发送UDP报的顺序一致; 如果缓冲区满了, 再到达的UDP数据就会被丢弃;——不可靠
在这里插入图片描述

TCP控制协议

可以对数据的传输进行详细的控制——提高可靠性的同时,即使工作繁杂但任然在提高效率。
既然要对传输详细的管控那么其结构一定是要有多个标识数据来实现的,所以结构一定是复杂的。
在这里插入图片描述

报头和有效载荷如何分离:TCP报头:标准报头长度(20)+选项+有效载荷——那么如何分离呢?
4位首部长度就可以表示出报头的大小
但是有效载荷是多大呢??不要忘了TCP包的大小其实就是IP协议的有效载荷的大小:
所以有效载荷=ip有效载荷的大小-TCP报头总大小

缓冲区

TCP的发送端和接收端都有缓冲区
在这里插入图片描述
内核的全双工确认应答机制:
在收报文后,把报文放当接收缓冲区内核就会给发送端发送确认收到的应答报文
——保证了可靠性(只要收到应答就能保证历史最近一条消息接受方是收到的)
在这里插入图片描述
TCP数据发送的方式:
基本理解:发送一个应答一个
在这里插入图片描述
但其实实际中是发送和应答是重叠的——保证可靠性的同时提升效率
在这里插入图片描述

建立连接—三次握手(捎带应答)

TCP双发想要通信的话首先就要建立连接,三次握手建立连接方式可以
1、最小成本验证全双工——双方都可以确认可以向对方收发报文。
2、奇数次握手,保证了一定是客户端先把链接建立好后服务器才会建立连接,防止恶意的客户端不断的让服务器建立连接,自己又不建立连接,服务器要把建立的链接进行管理的如果建立的链接太多的话就会造成服务器卡顿。
在这里插入图片描述

超时重传

在这里插入图片描述

断开连接——四次回首
在这里插入图片描述

滑动窗口+丢包

窗口大小指的是无需等待确认应答而可以继续发送数据的最大值
滑动窗口是发送缓冲区的一个区域,里面有要发送的数据
滑动窗口的大小在连接刚建立成功是由接收端的窗口大小决定,之后如果发生了网络拥塞就由拥塞控制大小
滑动窗口的最大值并不止是16位那么大,他还有一个窗口扩大因子M,来左移M个数的大小。
在这里插入图片描述

如上图:发送前四个段的时候, 不需要等待任何ACK, 直接发送;
收到第一个ACK后, 滑动窗口向后移动, 继续发送第五个段的数据; 依次类推;
操作系统内核为了维护这个滑动窗口, 需要开辟 发送缓冲区 来记录当前还有哪些数据没有应答; 只有确认应答过的数据, 才能从缓冲区删掉;
窗口越大, 则网络的吞吐率就越高;
那么如果出现了丢包, 如何进行重传? 这里分两种情

情况1:数据包没有丢失,只是确认丢失,
在这里插入图片描述
情况二:数据包直接丢失
在这里插入图片描述

在这里插入图片描述
流量控制:
接收端将自己可以接收的缓冲区大小放入 TCP 首部中的 “窗口大小” 字段, 通过ACK端通知发送端;
窗口大小字段越大, 说明网络的吞吐量越高;
接收端一旦发现自己的缓冲区快满了, 就会将窗口大小设置成一个更小的值通知给发送端;
发送端接受到这个窗口之后, 就会减慢自己的发送速度(窗口变小了,每次不用等待ACK应答的段变少了,所以消耗的时间就多了,速度就变慢了)
如果接收端的缓冲区满了,ACK回来的滑动窗口就是0,此时发送端就停止发送数据,而是定期发送一个窗口探测数据段,使接收端把当前窗口的大小告诉发送端。

网络拥塞:
网络和中的数据太多或者网络的环境太差,造成我们发送的大量的数据都得不到应答(出现大量丢包),此时我们采用的方案就不是超时重传了。而是拥塞控制——控制滑动窗口的大小——控制每次发送数据大量,通过指数增长式的试探,当增长到某个特定值后就加法增长。
如果网络非常好,那么此时发送数据的大小就由对方的接收能力决定(滑动窗口),如果网络拥塞,就要用拥塞窗口决定(拥塞避免算法)
滑动窗口大小=min(拥塞窗口大小,对方接收能力)

在这里插入图片描述
拥塞避免算法:指数级(慢开始,快增长)当到达一定阈(yu)值时再线性增长,当检测到网络拥堵(拥堵窗口大小)时,就不用此值/2得到下次拥塞算法的阈值。再此过程中窗口大小任然要遵循min(拥塞窗口大小,对方接收能力)
其实在TCP进行网络数据发送的时候,斌不并不是一开始就根据对法接收能力发送大量数据的,而是就是根据这种拥塞算法来发送数据的
注意:min(拥塞窗口大小,对方接收能力),如果拥塞窗口大小>对方接收能力,那么就说明此时的网络状态是正常的。

延时应答(想给发送端应答一个大一点的滑动窗口)
接收端收到数据后不忙给客户端发送ACK通告自己的滑动窗口,而是等一等,如果接收端在这段时间把数据处理了,那么接收缓冲区能接受的能力就越大,应答回去的滑动窗口就越大,对方的发送速度就越快了。
等多久:
1:等待接收到N个包就应答一次(常用)
2:等待最大延时时间就应答一次(最大应答时间(200ms)<超时重传时间(500ms))

面向字节流

调用write时, 数据会先写入发送缓冲区中; 如果发送的字节数太长, 会被拆分成多个TCP的数据包发出; 如果发送的字节数太短,
就会先在缓冲区里等待, 等到缓冲区长度差不多了, 或者其他合适的时机发送出去; 接收数据的时候,
数据也是从网卡驱动程序到达内核的接收缓冲区; 然后应用程序可以调用read从接收缓冲区拿数据; 另一方面, TCP的一个连接,
既有发送缓冲区, 也有接收缓冲区, 那么对于这一个连接, 既可以读数据, 也可以写数据. 这个概念叫做全双工 写100个字节数据时,
可以调用一次write写100个字节, 也可以调用100次write, 每次写一个字节; 读100个字节数据时,
也完全不需要考虑写的时候是怎么写的, 既可以一次read 100个字节, 也可以一次read一个字节, 重复100次;

粘包问题

数据的拆分在应用层实现——http/https协议——解决粘包问题
因为TCP是面向字节流的,所以发送过来的数据包之间是粘在一起的,但是他们的顺序是有序的(因为有序号这样的字段),所以我们http就要解决包与包之间的分离,报头和数据之间的分离——对于定长报头,通过报头中的len字段就可以确定这个包有多大,然后根据/n/r 空格就实现了报头和数据之间的分离,这样就解决了粘包问题和向上的反序列化
解决粘包问题:
1,包与包之间通过特殊字符分割
2.定长报文,包与包的大小一样
3,报头+自描述字段(len)__报头的大小是定长的——(我们常用)
在这里插入图片描述

TCP异常

如果在双方网络通信的过程中,突然进程挂了的话,内核(操作系统会自动做四次回首关闭连接(socket套接字文件))——进程终止、机器重启、
如果网线突然被切断的话,服务器是来不及做四次回首断开连接的,那么就需要他每隔一段时间就去询问一下客户端还活着吗(报活/心跳机制),如果客户端一直没有答复那么就会自动关闭连接

listen(socket,default_backlog)的第二个参数default_backlog

创建服务器:
1.创建套接字
2、绑定套接字信息
3、把套接字设置为监听套接字
在这里插入图片描述
4、获取连接
在这里插入图片描述
如果我们把listen的第二个参数设置为1,然后不去调用accept获取连接的话,
此时有客户端的链接请求的话,服务器的内核是会给我们维护一个全连接队列的,虽然我们上层并没有获取连接,但是在队列中是已经帮我们保存了链接,并和客户端链接上的。全连接队列能够保存链接的个数=listen的第二个参数值+1
那么这样做的作用:在服务器很忙的时候来不及accept(),但是链接请求又来了,那么就先保存链接好。——(饭店吃饭的例子)
在这里插入图片描述
问:服务器不获取连接就不会与客户端建立连接吗?
答:否,要看Listen的第二个参数值决定的全连接队列

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

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

相关文章

LangChain开发框架并学会对大型预训练模型进行微调(fine-tuning)

要掌握LangChain开发框架并学会对大型预训练模型进行微调&#xff08;fine-tuning&#xff09;&#xff0c;你需要理解整个过程从数据准备到最终部署的各个环节。下面是这一流程的一个概览&#xff0c;并提供了一些关键步骤和技术点&#xff1a; 1. LangChain开发框架简介 La…

Maven实战(一)- Maven安装与配置

Maven实战&#xff08;一&#xff09;- Maven安装与配置 文章目录 Maven实战&#xff08;一&#xff09;- Maven安装与配置1.下载安装包2.配置环境变量。3.安装目录分析4.设置HTTP代理5.镜像 前言&#xff1a; ​ 最近博主看完了《Maven实战》&#xff08;许晓斌著&#xff09;…

回调函数地狱及其解决方法——Promise链式调用以及async函数和await

一、什么是回调函数地狱&#xff1f; > 在回调函数一直向下嵌套回调函数&#xff0c;形成回调函数地狱 二、回调函数地狱问题&#xff1f; > 可读性差 > 异常捕获困难 > 耦合性严重 <!DOCTYPE html> <html lang"en"><head>&…

大数据时代,区块链是如何助力数据开放共享的?

在大数据时代&#xff0c;区块链技术以其独特的优势&#xff0c;为数据开放共享提供了强有力的支持。以下是区块链助力数据开放共享的几个主要方面&#xff1a; 1. 增强数据安全性与隐私保护 加密安全&#xff1a;区块链技术采用先进的加密算法&#xff0c;如国密非对称加密技…

【高中数学/指数函数/单调性】写出函数f(x)=4^x-2^x+2的单调区间 (陈永明老师您错了!)

【问题】 写出函数f(x)4^x-2^x2的单调区间 【问题来源】 《陈永明讲评数学题-高中习题归类研讨》第20页 例2&#xff0c;该书由上海科技教育出版社出版&#xff0c;是2022年1月第一版。 【陈永明老师的解答】 【用Canvas绘制的实际图线】 我有一个习惯&#xff0c;就是在理…

【优秀python算法设计】基于Python网络爬虫的今日头条新闻数据分析与热度预测模型构建的设计与实现

1 绪论 1.1 背景与意义 随着互联网的快速发展和移动互联技术的普及&#xff0c;作为新兴的资讯平台&#xff0c;今日头条成为了用户获取新闻资讯、时事热点和个性化推荐的重要渠道。大量用户在今日头条上浏览、阅读并产生热度&#xff0c;使得今日头条成为了观察舆论热点和分…

pdf格式过大怎么样变小 pdf文件过大如何缩小上传 超实用的简单方法

面对体积庞大的 PDF 文件&#xff0c;我们常常需要寻找有效的方法来缩减其大小。这不仅能够优化存储空间&#xff0c;还能提升文件的传输和打开速度。PDF文件以其稳定性和跨平台兼容性成为工作和学习中的重要文件格式。然而&#xff0c;当我们需要通过邮件发送或上传大文件时&a…

时间序列对于LLM来说并没有什么不同

基础模型推动了计算语言学和计算机视觉领域的最新进展&#xff0c;并在人工智能领域取得了巨大成功。成功的基础模型的关键思想包括&#xff1a; 海量数据&#xff1a;庞大而多样的训练数据涵盖了广泛的分布&#xff0c;使模型能够近似任何潜在的测试分布。 可转移性&#xff…

Ubuntu网络连接图标消失了,没网!!!

文章目录 前言Step1&#xff1a;停止网络管理服务Step2&#xff1a;删除网络管理状态文件Step3&#xff1a;打开网络管理 前言 本次记录的事&#xff0c;有一天心血来潮想烧录一下开发板&#xff0c;却发现自己的Ubuntu系统的网络连接图标消失了&#xff0c;也没网了&#xff…

HarmonyOS应用开发者高级认证,Next版本发布后最新题库 - 单选题序号5

基础认证题库请移步&#xff1a;HarmonyOS应用开发者基础认证题库 注&#xff1a;有读者反馈&#xff0c;题库的代码块比较多&#xff0c;打开文章时会卡死。所以笔者将题库拆分&#xff0c;以20道题为一组&#xff0c;题库目录如下&#xff0c;读者可以按需跳转。如果对您的阅…

数据结构——单链表OJ题(上)

目录 一、移除链表元素 1.思路 2.注意 3.解题 二、反转链表 思路1&#xff1a;三指针翻转法 &#xff08;1&#xff09;注意 &#xff08;2&#xff09;解题 思路2&#xff1a;头插法 &#xff08;1&#xff09;注意 &#xff08;2&#xff09;解题 三、链表的中间结…

AWS 中国区同账号0etl integration配置步骤

中国区的AWS支持0etl integration已经一段时间了&#xff0c;目前北京区和宁夏区均支持。中文翻译为零ETL集成。 当前支持的引擎是Aurora MySQL数据托管式导出到Redshift. Global区域支持Aurora PostgreSQL. 中国区后续也会陆续出现此功能的。 功能介绍文档&#xff1a; 【1…

try-catch-finally 捕获异常不在catch里抛出;循环遍历对象生成任务,捕获异常对象不抛出,不影响其他正常对象生成任务

场景&#xff1a;一个模板绑定多个对象&#xff0c;要对每个对象生成任务。捕获生成任务过程中的异常&#xff0c;但是不抛出&#xff0c;只是用日志记录。这样做目的&#xff1a;循环遍历对象生成任务时&#xff0c;异常对象数据生成任务时发生异常只是导致自己生成任务失败&a…

Mac应用快速启动器:Alfred 5 for Mac 激活版

Alfred 5 是一款专为 macOS 系统设计的效率提升工具。这款软件以其快速启动和高效操作功能著称&#xff0c;通过使用快捷键来呼出输入界面&#xff0c;用户可以快速完成各种任务。 最新版本 Alfred 5.5 引入了一些新功能。其中包括整合了 ChatGPT 和 DALL-E&#xff0c;这意味…

YOLOv8不同位置引入RepVGG重参数化

一、原理解析&#xff1a; 复杂的卷积网络大都具有如下缺点&#xff1a; 复杂的多分支设计&#xff08;如ResNet中的残差相加和Inception中的分支连接&#xff09;使模型难以实现和自定义&#xff0c;降低了推理速度和降低了内存利用率。一些组件&#xff08;例如Xception和Mo…

RedisTemplate、StringRedisTemplate、序列化器配置

Lettuce和Jedis RedisTemplate是SpringDataRedis中对JedisApi的高度封装&#xff0c;提供了Redis各种操作、 异常处理及序列化&#xff0c;支持发布订阅。 首先我们要知道SpringData是Spring中数据操作的模块&#xff0c;包括对各种数据库的集成&#xff0c;比如我们之前学过…