面试-快速学习计算机网络-UDP/TCP

news2024/9/22 7:21:28

1. OSI四层和七层映射

在这里插入图片描述
区别:

  1. 应用层,表示层,会话层合并为了应用层
  2. 数据链路层物理层合并为了网络接口层

2. TCP和UDP的区别?

在这里插入图片描述
总结:
1 . TCP 向上层提供面向连接的可靠服务 ,UDP 向上层提供无连接不可靠服务
2. UDP 没有 TCP 传输可靠,但是可以在实时性要求高的地方有所作为。
3. 对数据准确性要求高,速度可以相对较慢的,可以选用TCP。
4. 应用方面UDP实时应用比如视频直播等,TCP可靠传输比如大文件传输
5. UDP面向报文(只是数据报文的搬运工,不会对数据报文进行任何拆分和拼接操作。),TCP字节流
6. UDP头部开销小 8字节相比 TCP 的至少20字节要少得多,传输数据报文时是很高效的。
在这里插入图片描述

3. TCP详解

1. tcp报文头部

在这里插入图片描述
需要说明的:
源端口
目的端口
seq序号: 占4个字节,是本报文段所发送的数据项目组第一个字节的序号。在TCP传送的数据流中,每一个字节都有一个序号。例如,一报文段的序号为300,而且数据共100字节,则下一个报文段的序号就是400。
ack确认序号: 占4字节,是期望收到对方下次发送的数据的第一个字节的序号,也就是期望收到的下一个报文段的首部中的序号;确认序号应该是上次已成功收到数据字节序号+1。

注意:上述两个序号有值有效的前提是标识为1
标识位
1、URG:当URG=1时,注解此报文应尽快传送,而不要按本来的列队次序来传送。与“紧急指针”字段共同应用,紧急指针指出在本报文段中的紧急数据的最后一个字节的序号,
使接管方可以知道紧急数据共有多长。
2、ACK:只有当ACK=1时,确认序号字段才有效;
3、PSH:当PSH=1时,接收方应该尽快将本报文段立即传送给其应用层。
4、RST:当RST=1时,表示出现连接错误,必须释放连接,然后再重建传输连接。复位比特还用来拒绝一个不法的报文段或拒绝打开一个连接;
5、SYN:SYN=1,ACK=0时表示请求建立一个连接,携带SYN标志的TCP报文段为同步报文段;
6、FIN:发端完成发送任务。

2. 滑动窗口(流量控制)

滑动窗口用于流量控制: TCP流量控制主要是针对接收端的处理速度不如发送端发送速度快的问题,消除发送方使接收方缓存溢出的可能性。。可以理解成接收端所能提供的缓冲区大小。字节数起始于确认序号字段指明的值(这个值是接收端正期望接收的字节。
在这里插入图片描述

思考1: 重复发送
第一步发送了[33, 43),如果这次发送[35, 45),那中间重叠部分不是发送了两次,所以这里要 是全部重新发送还是只发送接收端没有收到的数据,如果全部发送那么重复
发送的数据接收端怎么处理。
这个下面快速重传会讲

思考2: 滑动窗口是否可是可靠性的保障?
一直传输数据,直到数据发送完成。这么一来就保证数据数据的可靠性,因为如果某数据没有获取到,那么ack永远不会跳过它。与其说是滑动窗口的可靠,不如说是ACK机制的可靠

3. 校验和

检验和覆盖了整个TCP报文段:TCP首部和数据。这是一个强制性的字段,一定是由发端计算和存储,并由收端进行验证。

4. TCP拥塞

  1. 流量控制是通过接收方来控制流量的一种方式;而拥塞控制则是通过发送方来控制流量的一种方式
  2. 发送方的让自己的发送窗口

win=min(cwnd,接受端接收窗口大小)

说明: 发送方取拥塞窗口与滑动窗口的最小值作为发送的上限。
3. TCP拥塞控制的几种方法:慢启动,拥塞避免,快重传和快恢复。

在这里插入图片描述

  • 慢启动不慢:1然后 指数增长
    cwnd不能一直这样无限增长下去,一定需要某个限制。TCP使用了一个叫慢启动门限(ssthresh)的变量,一旦cwnd>=ssthresh(大多数TCP的实现,通常大小都是65536)
  • 慢启动过程结束,拥塞避免阶段开始;cwnd的值不再指数级往上升,开始加法增加。此时当窗口中所有的报文段都被确认时,cwnd的大小加1,cwnd的值就随着RTT开始线性增加
  • 超时,重传了一个报文段把ssthresh降低为cwnd值的一半。把cwnd重新设置为1。重新进入慢启动过程。

4. 快速重传

如果,包没有连续到达,就ack最后那个可能被丢了的包,如果发送方连续收到3次相同的ack,就重传。Fast Retransmit的好处是不用等timeout了再重传,而是只是三次相同的ack就重传。

比如:如果发送方发出了1,2,3,4,5份数据,第一份先到送了,于是就ack回2,结果2因为某些原因没收到,3到达了,于是还是ack回2,后面的4和5都到了,但是还是ack回2因为2还是没有收到,于是发送端收到了三个ack=2的确认,知道了2还没有到,于是就马上重转2。然后,接收端收到了2,此时因为3,4,5都收到了,于是ack回6。

在这里插入图片描述
主要是为了避免一个问题就是当接收端发现2丢失之后我是否需要死等2,即使我先收到了3,4,5 ,等到超时再发送? 快速重传保证了,到我收到3, 4,5时不需要等2到超时,我就可以直接返回ack=2了,三次之后,发送端会自动重传3。

5. TCP状态机

在这里插入图片描述
没啥好说的理解就行
三次握手
客户端视角:
close 情况下,发起Connet,报文标志 syn , 状态变为SYN_SENT ,等待服务端返回ack (syn ack), 进入established, 之后再发ack,这时可以发送数据了(注意这个时候如果发数据可以添加syn)

服务端视角:
close 情况下,listen等待连接,收到连接后syn_recv 之后返回ack, 等待客户端ack到established

四次挥手

  • 客户端视角:
    主动请求关闭,发送FIN这个时候客户端不能发数据了,但是服务端可以发,进入FIN_WAIT1, 接收到 ACK ,进入FIN_WAIT2
    ,等待,服务端发送FIN, 这个时候进入TIME_WAIT(2MSL),并返回ack给服务端

  • 服务端视角:
    收到FIN 包, 回复ack ,进入CLOSE_WAIT, 这个时候还是可以发数据,不发了之后 发一个FIN标志的包,表示要关闭了, 进入 LAST_ACK, 收到客户端的ACK之后CLOSE

为什么客户端TIME_WAIT状态还需要等2MSL后才能返回到CLOSED状态?

  • 防止最后一个客户端回复的ACK服务端没有收到。服务端处于LAST_ACK状态下的SOCKET可能会因为超时未收到ACK报文,而重发FIN报文。
  • MSL 是 Maximum Segment Lifetime,报⽂最⼤⽣存时间,它是任何报⽂在⽹络上存在的最⻓时间,超过这个时间报⽂将被丢弃。

为什么握手不能是两次?

为了防止服务器端开启一些无用的连接增加服务器开销
防止已失效的连接请求报文段突然又传送到了服务端,因而产生错误。

  • 总结就是防止开启一些“异常端口”浪费,所谓异常就是,比如服务端返回的ack没有收到,客户端需要超时重连,这段时间服务端的端口白白占用了,或者恶意人员开了很多半连接的端口,浪费了端口。

什么是半连接队列?
在这里插入图片描述

6. TCP的可靠性

TCP主要提供了

  • 检验和
  • 序列号/确认应答
  • 超时重传
  • 最大消息长度
  • 滑动窗口控制

等方法实现了可靠性传输。但是总结其实还是校验和 序列号/确认应答

7. 什么是TCP粘包和拆包?

  1. TCP 是面向流,没有界限的一串数据。TCP 底层并不了解上层业务数据的具体含义,它会根据 TCP 缓冲区的实际情况进行包的划分,所以在业务上认为,一个完整的包可能会被 TCP 拆分成多个包进行发送,也有可能把多个小的包封装成一个大的数据包发送,这就是所谓的 TCP 粘包和拆包问题
  2. 要发送的数据小于 TCP 发送缓冲区的大小,TCP 将多次写入缓冲区的数据一次发送出去,将会发生粘包。
  3. 要发送的数据大于 TCP 发送缓冲区剩余空间大小,将会发生拆包
  4. 待发送数据大于 MSS(最大报文长度),TCP 在传输前将进行拆包。即 TCP 报文长度 - TCP 头部长度 > MSS

那怎么解决呢?

  • 发送端将每个数据包封装为固定长度
  • 在数据尾部增加特殊字符进行分割
  • 将数据分为两部分,一部分是头部,一部分是内容体其中头部结构大小固定,且有一个字段声明内容体的大小。

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

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

相关文章

验证二叉搜索树

给你一个二叉树的根节点 root ,判断其是否是一个有效的二叉搜索树。 有效 二叉搜索树定义如下: 节点的左子树只包含 小于 当前节点的数。节点的右子树只包含 大于 当前节点的数。 所有左子树和右子树自身必须也是二叉搜索树。 示例 1: 输…

8.21summary

计划部分完成,复习暂未完成

Linux环境下交叉编译环境安装、编译和运行

Win11主机上安装虚拟机,虚拟机内运行Ubuntu20.04,为了能够在本地电脑(Win11)上开发测试软件和算法,最终将编译好的可执行文件拷贝到Linux板上(Rk3288上运行linux系统)运行,因此需要安…

【QML】鼠标放在控件上颜色改变的效果实现

最近刚好要用到一个功能,在qml上实现鼠标放上去,控件的颜色改变,鼠标移走,控件颜色恢复。第一反应是这个功能非常简单,但是搞了一会儿都没实现,最后发现MouseArea其实提供了一个很简便的方法来提供使用&…

马蹄集 第九次oj赛

目录 MT2188单条件和 8421码 余3码 永恒之2 新十六进制 人脑计算机 二进制?不同! 三进制计算机1 三进制计算机2 excel的烦恼 MT2188单条件和 号难度:黄金© 时间限制:1秒 巴占用内存:128M ★收藏△报错 “单…

MemSeg:一种差异和共性来检测图像表面缺陷的半监督方法

目录 1、摘要 2、Method 2.1 模拟异常样本 2.2 Memory Module 2.3 空间注意模块 2.4 多尺度特征融合模块 2.5 损失函数设置 2.6 Decoder模块 1、摘要 本文认为人为创建类内差异和保持类内共性可以帮助模型实现更好的缺陷检测能力,从而更好地区分非正常图像。如…

蓝蓝设计UI设计公司-界面设计与开发案例

天津航天中为项目 中国南方电网十二个软件交互优化和界面设计 图标设计 | 交互设计 | 界面设计 天津航天中为数据系统科技有限公司是航天503所控股的专业化公司,坐落于天津滨海新区航天技术产业园,是航天五院家入住天津未来科技城的军民融合型企业&…

el-tree组件图标的自定义

饿了么树形组件的图标自定义 默认样式: 可以看到el-tree组件左侧自带展开与收起图标,咱们可以把它隐藏:: .groupList {::v-deep .el-tree-node { .el-icon-caret-right {display: none;} } } 我的全部代码 <div class"groupList"><el…

韩顺平java集合

遍历集合方式: public static void main(String[] args) {List<Object> arrayList new ArrayList<>();arrayList.add(1);arrayList.add(3);arrayList.add(111);Iterator<Object> iterator arrayList.iterator();while (iterator.hasNext()){System.out.pri…

SpringBoot整合MongoDB(从安装到使用系统化展示)

SpringBoot整合MongoDB&#xff08;从安装到使用系统化展示&#xff09; MongoDB介绍 基础介绍 MongoDB是一种开源、面向文档的非关系型数据库管理系统&#xff08;NoSQL DBMS&#xff09;&#xff0c;它以其灵活性、可扩展性和强大的查询能力而闻名。MongoDB的设计理念是为了…

Linux journalctl命令详解(journalctl指令)

文章目录 Linux Journalctl命令详解1. Journalctl简介2. Journalctl基础使用3. 过滤日志条目4. 时间戳和日志轮转5. 高级应用6. journalctl --help指令文档英文中文 注意事项journal日志不会将程序输出的空行显示&#xff0c;日志会被压缩得满满当当。journal日志不会自动持久化…

Claude 2 国内镜像站

Claudeai是什么&#xff1f; Claude 2被称为ChatGPT最强劲的竞争对手&#xff0c;支持100K上下文对话&#xff0c;并且可以同时和5个文档进行对话&#xff0c;不过国内目前无法正常实用的&#xff0c;而claudeai是一个Claude 2 国内镜像站&#xff0c;并且免翻可用&#xff0…

当图像宽高为奇数时,如何计算 I420 格式的uv分量大小

背景 I420 中 yuv 数据存放在3个 planes 中。 网上一般说 I420 数据大小为 widthheight1.5 但是当 width 和 height 是奇数时&#xff0c;这个计算公式会有问题。 I420 中 u 和 v 的宽高分别为 y 的一半。 但是当不能整除时&#xff0c;是如何取整呢&#xff1f;向上还是向下&…

【C++】iota函数 + sort函数实现基于一个数组的多数组对应下标绑定排序

目录 一、iota函数 1. 函数解析 ​① 迭代器类型(补充) ② 头文件 ③ 参数 2. 函数用途与实例 二、sort函数 1、 函数解读 2、实现倒序排列 2.1 greater 与 less 模板参数 2.2 lambda表达式 三、下标绑定排序&#xff08;zip&#xff09; --- 833.字符串中的查找与替换 一、…

innodb事务实现

事务的特性 ACID 事务的类别 事务实现 redo redoLog buffer 的格式 undo 更新主键 purge group commit 因为上层的binlog和底层的redolog要保持一致&#xff0c;所以 事务控制语句 事务隔离级别 分布式事务 事务习惯

安装Ubuntu服务器、配置网络、并安装ssh进行连接

安装Ubuntu服务器、配置网络、并安装ssh进行连接 1、配置启动U盘2、配置网络3、安装ssh4、修改ssh配置文件5、重启电脑6、在远程使用ssh连接7、其他报错情况 1、配置启动U盘 详见: U盘安装Ubuntu系统详细教程 2、配置网络 详见&#xff1a;https://blog.csdn.net/davidhzq/a…

运放和三极管构成的恒流源电路

这是一个由运放和三极管构成的恒流源电路&#xff0c;RL为负载电阻&#xff0c;R1为采样电阻。 流过三极管集电极的电流 下面分析下这个电路的工作原理。首先我们可以看到这个运放引入了负反馈&#xff0c;所以它工作在线性区的&#xff0c;就有VINVPVN。 所以流过采样电阻R1的…

ATF BL1/BL2 ufs_read_blocks/ufs_write_blocks使用分析

ATF BL1/BL2 ufs_read_blocks/ufs_write_blocks使用分析 1 ATF的下载链接2 ATF BL1/BL2 ufs_read_blocks/ufs_write_blocks处理流程2.1 ATF BL1/BL2 ufs_read_blocks2.2 ATF BL1/BL2 ufs_write_blocks 3 UFS System Model4 ufs_read_blocks/ufs_write_blocks详细分析4.1 ufs_re…

layui框架学习(37:学习laytpl基本语法)

layui中的模板引擎模块laytpl属于轻量的 JavaScript 模板引擎&#xff0c;支持在页面中将指定的数据按指定的模板进行展示或处理&#xff0c;此处的模板是指一段包含html和脚本的文本&#xff08;感觉类似asp.net core中的razor标记语言&#xff0c;在网页中嵌入基于服务器的代…

深入理解CyclicBarrier

CyclicBarrier翻译过来是回环栅栏&#xff0c;它可以实现让一组线程等待至某个状态之后再全部同步执行&#xff0c;这个状态叫屏障点。当所有等待线程都被释放后&#xff0c;CyclicBarrier可以重置再次使用。 CyclicBarrier的功能是由ReentrantLock和Condition共同实现的&…