【计算机网络 - 基础问题】每日 3 题(二十八)

server/2024/10/15 22:28:22/

✍个人博客:Pandaconda-CSDN博客
📣专栏地址:http://t.csdnimg.cn/fYaBd
📚专栏简介:在这个专栏中,我将会分享 C++ 面试中常见的面试题给大家~
❤️如果有收获的话,欢迎点赞👍收藏📁,您的支持就是我创作的最大动力💪
📝推荐参考地址:https://www.xiaolincoding.com/(这个大佬的专栏非常有用!)

82. 用了 TCP 就一定不会丢包吗?

我们知道TCP位于传输层,在它的上面还有各种应用层协议,比如常见的 HTTP 或者各类 RPC 协议。

在这里插入图片描述
TCP 保证的可靠性,是传输层的可靠性。也就是说,TCP 只保证数据从 A 机器的传输层可靠地发到 B 机器的传输层。

至于数据到了接收端的传输层之后,能不能保证到应用层,TCP 并不管。

假设现在,我们输入一条消息,从聊天框发出,走到传输层 TCP 协议的发送缓冲区,不管中间有没有丢包,最后通过重传都保证发到了对方的传输层 TCP 接收缓冲区,此时接收端回复了一个ack,发送端收到这个ack后就会将自己发送缓冲区里的消息给扔掉。到这里 TCP 的任务就结束了。

TCP任务是结束了,但聊天软件的任务没结束。

聊天软件还需要将数据从 TCP 的接收缓冲区里读出来,如果在读出来这一刻,手机由于内存不足或其他各种原因,导致软件崩溃闪退了。

发送端以为自己发的消息已经发给对方了,但接收端却并没有收到这条消息。
于是乎,消息就丢了。

83. 这类丢包问题怎么解决?

故事到这里也到尾声了,感动之余,我们来聊点掏心窝子的话。

其实前面说的都对,没有一句是假话。
但某绿皮聊天软件这么成熟,怎么可能没考虑过这一点呢。

大家应该还记得我们文章开头提到过,为了简单,就将服务器那一方给省略了,从三端通信变成了两端通信,所以才有了这个丢包问题。

现在我们重新将服务器加回来。

在这里插入图片描述
大家有没有发现,有时候我们在手机里聊了一大堆内容,然后登录电脑版,它能将最近的聊天记录都同步到电脑版上。也就是说服务器可能记录了我们最近发过什么数据,假设每条消息都有个 id,服务器和聊天软件每次都拿最新消息的 id 进行对比,就能知道两端消息是否一致,就像对账一样。

对于发送方,只要定时跟服务端的内容对账一下,就知道哪条消息没发送成功,直接重发就好了。

如果接收方的聊天软件崩溃了,重启后跟服务器稍微通信一下就知道少了哪条数据,同步上来就是了,所以也不存在上面提到的丢包情况。

可以看出,TCP 只保证传输层的消息可靠性,并不保证应用层的消息可靠性。如果我们还想保证应用层的消息可靠性,就需要应用层自己去实现逻辑做保证。
那么问题叒来了,两端通信的时候也能对账,为什么还要引入第三端服务器?
主要有三个原因。

  • 第一,如果是两端通信,你聊天软件里有 1000 个好友,你就得建立 1000 个连接。但如果引入服务端,你只需要跟服务器建立 1 个连接就够了,聊天软件消耗的资源越少,手机就越省电。
  • 第二,就是安全问题,如果还是两端通信,随便一个人找你对账一下,你就把聊天记录给同步过去了,这并不合适吧。如果对方别有用心,信息就泄露了。引入第三方服务端就可以很方便的做各种鉴权校验。
  • 第三,是软件版本问题。软件装到用户手机之后,软件更不更新就是由用户说了算了。如果还是两端通信,且两端的软件版本跨度太大,很容易产生各种兼容性问题,但引入第三端服务器,就可以强制部分过低版本升级,否则不能使用软件。但对于大部分兼容性问题,给服务端加兼容逻辑就好了,不需要强制用户更新软件。

所以看到这里大家应该明白了,我把服务端去掉,并不单纯是为了简单。

84. 三次握手过程中可以携带数据么?

第三次握手的时候,可以携带。前两次握手不能携带数据。

如果前两次握手能够携带数据,那么一旦有人想攻击服务器,那么他只需要在第一次握手中的 SYN 报文中放大量数据,那么服务器势必会消耗更多的时间和内存空间去处理这些数据,增大了服务器被攻击的风险。

第三次握手的时候,客户端已经处于 ESTABLISHED 状态,并且已经能够确认服务器的接收、发送能力正常,这个时候相对安全了,可以携带数据。


http://www.ppmy.cn/server/123202.html

相关文章

【React】JSX基础知识

1. JSX的本质 JSX并不是标准的js语法,而是js语法扩展,浏览器本身无法识别,需要进行解析。解析工具:babel 2. JSX使用的4个高频场景 使用引号传递字符串使用js变量函数调用和方法调用使用js对象 function App() {const jsVar …

opencv学习:通过图像透视进行发票识别完整代码流程

概念: 使用OpenCV库实现图像的透视变换处理,以矫正图像中的透视失真。通过本实验,学习者将掌握图像处理的基本操作,包括图像的读取、显示、大小调整、灰度转换、二值化、轮廓检测、轮廓近似以及透视变换。 步骤: 1. …

pycharm2024版 搭配Anaconda创建pytorch项目

pycharm2024版 搭配Anaconda创建pytorch项目 ​ 刚接触anaconda和pytorch,b站看的教学视频中博主使用的是2019版的pycharm,所以在创建pytorch项目时有些懵,在多次摸索后大概明白了一些 上图中是2024版pycharm的新项目创建界面 Project venv…

众数问题,

在本实验中&#xff0c;需要编写一个程序来处理一组输入数据&#xff0c;找出其中的众数&#xff0c;即出现次数最多的数字。程序会读取文件中的数据进行处理&#xff0c;并将结果与标准答案进行比对&#xff0c;判断程序输出是否正确。 #include <bits/stdc.h> #define …

集成Elasticsearch到django restful

文章目录 集成ES到django restful服务端项目安装haystack基本使用安装配置索引模型ORM模型中新增discount_json字段方法全文索引字段模板 索引序列化器全文搜索的索引视图路由手动构建es索引 集成ES到django restful服务端项目 如果直接在Django项目直接编写代码作为ElasticSe…

宝塔部署vue项目出现的各种问题

使用宝塔面板&#xff0c;网站页面&#xff0c;构建php静态网页 问题一&#xff1a;图片等静态资源无法加载 找到真正请求的url&#xff0c; 然后在项目目录下面创建对应的目录&#xff0c;将资源放入 问题二&#xff1a;刷新出现404 在这里任意位置添加 ## 添加上这个配…

STMCubeMx——C8T6的串口调试、接收与发送

一、stmCubeMX串口通信的步骤 1、新建一个文件&#xff0c;选择自己的芯片 2、配置时钟 3、配置串口 串口的模式解析可以跳转到以下文章查看 stmCubemx——配置串口时的几种模式-CSDN博客在STM32CubeMX中配置串口&#xff08;USART或UART&#xff09;时&#xff0c;可以设置…

【机器学习】——决策树以及随机森林

文章目录 1. 决策树的基本概念与结构1.1 决策树的构建过程 2. 决策树的划分标准2.1 信息增益&#xff08;Information Gain&#xff09;2.2 信息增益比&#xff08;Information Gain Ratio&#xff09;2.3 基尼指数&#xff08;Gini Index&#xff09;2.4 均方误差&#xff08;…