C++面试题第一弹

news2024/11/16 21:48:01

TCP、UDP区别及使用场景

从TCP和UDP的特点来看,连接性,可靠性,以及面向字节流还是数据报来说。

区别: 

连接性:TCP面向连接,而UDP无连接。对TCP来说,在数据传输之前,通信双发需要建立一条稳定的通信连接,也就是我们说的三次握手;对UDP来说,数据直接发送。

可靠性:TCP提供可靠的数据传输服务,他确保如果数据没有按照顺序到达或丢包,TCP会自动重传;对UDP来说,他不提供可靠的数据传输服务,数据没有按照顺序到达或者丢包,并不会重传,但这并不意味着是缺点,因为这样就决定了他的传输速度较快,因为没有TCP的确认和重传机制,所以我们可以理解为这是他们的特点。

数据报:TCP是面向字节流的协议,将数据划分为较小的数据包进行传输,并且会根据网络情况进行调整,也就是说网络情况会影响接收端窗口和拥塞窗口大小,也就影响了滑动窗口大小,也就会影响在更短时间内发送更多的数据。

流量控制与拥塞控制:TCP拥有流量控制和拥塞控制机制,能够根据网络状况自送调整数据包的发送效率,避免网络拥塞;而UDP没有这些控制机制,如果网络拥塞,可能会导致数据包丢失或延迟。

TCP使用场景:

  • 文件传输:如FTP文件传输协议,因为TCP保证了数据的完整性,适合传输大量数据。
  • 网页浏览:HTTP/HTTPS,用于获取网页内容时,也依赖于TCP的可靠性。
  • 远程登录:SSH和telnet,这些需要稳定的连接来维护会话状态。
  • 数据库管理系统:TCP确保了数据库的一致性和完整性,防止数据丢失和损坏。

UDP使用场景:

  • 实时音视频传输:如在线直播,视频会议等,UDP的低延迟和高效性使其成为首选。
  • 在线游戏:UDP的快速传输和低延迟可以实现实时的游戏数据传输。
  • DNS查询:域名系统通常使用UDP进行快速的查询响应。
  • 实时传感器数据:UDP适用于需要快速传输实时传感器数据的场景,例如工业自动化,物联网等。

TCP三次握手和四次挥手的过程

  1. 第一次握手:客户端向服务端发送一个设置了SYN标志位的管理报文,表示请求建立连接。客户端进入SYN_SEND状态,等待服务器确认。
  2. 第二次握手:服务器收到客户端发来的SYN管理报文,向客户端发送一个设置了SYN+ACK标志位的管理报文作为应答,服务器进入SYN_RECV状态,准备接收客户端的确认。
  3. 第三次握手:客户端收到来自服务端的SYN+ACK管理报文,向服务器发送一个ACK管理报文,表示确认收到了服务器的响应,客户端和服务端都进入ESTABLISHED状态,表示连接建立成功,双方可以开始数据传输。

  1. 第一次挥手:客户端向服务器发送一个设置了FIN标志位的管理报文,表示不再发送数据,客户端进入FIN_WAIT_1状态,等待服务器的确认。
  2. 第二次挥手:服务器收到客户端的FIN管理报文,向客户端发送一个ACK管理报文,服务器进入CLOSE_WAIT状态,等待自己的应用程序关闭连接,此时,服务器还可以继续向客户端发送数据,客户端收到服务器的ACK应答,进入FIN_WAIT_2状态。
  3. 第三次挥手:当服务器也完成数据发送后,他向客户端发送一个设置了FIN标志位的管理报文,表示字节的数据也发送完毕,请求关闭连接,服务器进入LAST_ACK状态,等待客户端的确认。
  4. 第四次挥手:客户端收到服务器的FIN管理报文后,向服务器发送一个ACK应答,客户端进入TIME_WAIT状态,等待一段时间,通常是2MSL,即报文最大存活时长,以确保服务器收到了自己的ACK应答,服务器收到这个应答后,关闭连接,进入CLOSED状态,客户端在等待时间结束后也关闭连接,进入CLOSED状态。

socket常见函数和操作

对于TCP来说:

socket创建套接字,第一个参数是设置本地通信还是网络通信,我们要进行网络通信就设置成AF_INET,第二个参数决定了是TCP通信还是UDP通信,对TCP来说,我们就设置成:SOCK_STREAM,我们从名字上也看的出来是TCP,因为TCP是面向字节流的,第三个参数指定使用的协议,通常,某个协议中只有一种特定的类型,我们设置为0,表示使用默认的协议。

用于服务器程序,允许服务器重启时立即绑定到之前的地址和端口,而不需要等待之前的连接超时。

绑定套接字到指定的IP地址和端口号上,这样,来自该IP地址和端口号的数据包就可以正确的路由到该套接字上。

 

listen设置套接字为监听状态,表示可以接受来自客户端的请求。

当客户端想要与服务器发送通信时,会调用connect来申请连接,accept是用来获取连接的:

 

对于UDP来说,就不需要listen,connect,accept,setsockopt这些函数了,因为他是无连接的。 

我们还需要介绍一些发送和接受消息的函数:

recvfrom和recv,sendto和send,对于recvfrom和sendto来说,适用于未连接的套接字,而recv和send适用于已连接的套接字,也就是说,recvfrom和sendto适用于TCP,而recv和send适用于UDP。

get请求和post请求区别

  • 应用场景:get请求主要用于请求数据,而post请求主要用于提交数据到服务器。
  • 安全性与参数传递:get请求参数一般拼接在URL后面,直接暴露在地址栏上,因此安全性较低;而post请求参数一般放在请求体重,不会在地址栏上显示,所以相对于get请求来说安全性更高。
  • 缓存与记录:get请求主要用于请求数据且参数暴露在URL中,所以他可以被浏览器缓存。post请求主要用于提交数据,且参数不暴露在URL中,所以他通常不会被浏览器缓存。
  • 请求长度限制:由于get请求拼接在URL后面,而URL的长度在浏览器和服务器中都有一定的限制,所以在get请求中发送的数据量有限。而post请求将参数放在请求体重,因此理论上没有请求长度的限制,这使得post请求可以发送大量数据,适用于文件上传等场景。
  • 编码方式:get请求只能进行URL编码,这意味着他只能发送ASCII字符集的数据,如果需要发送非ASCII字符,如中文,就需要进行URL编码。post请求支持多种编码方式,这使得post请求可以发送更加复杂和多样化的数据。
  • TCP数据包:get请求在发送请求时,浏览器会将HTTP头部和数据一起发送初秋,服务器响应200,这通常意味着get请求只产生一个TCP数据包。post请求发送时,浏览器首先发送Http头部,服务器响应100,然后浏览器再发送数据部分,服务器再次响应200,这通常意味着post请求会产生两个TCP数据包(Firefox除外,他只发送一次)。

如何解决分包、粘包问题

解决分包问题

分包问题通常是指在数据传输过程中,一个完整的数据包被分割成多个较小的部分进行传输,在某些情况下,如网络限制和MTU限制等,数据包可能会被哦底层网络协议分割,以下是一些解决策略:

  • 调整MTU大小,是网络接口层能够传输的最大数据包大小。
  • 应用层分包,在应用层对数据包进行分割,确保每个数据包的大小都适合网络传输,这种方法需要发送方和接受方都遵循相同的分包规则。

解决粘包问题

粘包问题是指多个数据包被合并成一个数据包进行传输。TCP协议的基于字节流的特性使得粘包问题尤为常见。

  • 自定义协议,报文长度+报文内容+固定分隔符
  • 增加接受缓冲区大小:接收方可以增加接受缓冲区的大小,一遍能够存储更多的数据。这可以减少因为缓冲区不足而导致的粘包问题,但也会增加内存消耗和延迟。
  • 循环读取判断数据包是否完整。

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

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

相关文章

gradle镜像配置

当我们在Android Studio中新建项目或者打开已有项目时,会下载gradle文件,当使用官方的下载源时很慢,经常会下载失败,国内我们可以使用腾讯或者阿里的镜像,一般下载速度很快。 一、gradle下载地址 官网地址&#xff1…

02——springboot2——热部署

什么是热部署 简单说就是你程序代码修改了,现在要重新启动服务器才能加载刚刚新写的代码,如果每次修改代码都要重新启动服务器,这样就真的太麻烦了(运行一些稍微较大的项目,运行时间是很长的,所以每次修改…

docker - 镜像操作(拉取、查看、删除)

文章目录 1、docker search --help(用于显示 Docker 搜索命令的帮助信息)2、docker pull(拉取镜像)3、docker images (查看镜像)3.1、docker images --help(用于显示 Docker 镜像管理相关命令的帮助信息)3.…

【C++】——vector深度剖析模拟实现

低头赶路,敬事如仪 目录 1、模拟vector 1.1底层结构 1.2构造析构 1.3尾插扩容 1.4迭代器 1.5增删查改 1.6模拟中的注意事项 2、vector模拟补充 2.1迭代器区间构造问题 2.2memcpy深浅拷贝问题 2.3动态二维数组的模拟及遍历 1、模拟vector 想要模拟实现自…

即梦PixelDance:从追赶到领跑,一跃成为全球AI竞赛的领航者!

今年2月份,OpenAI发布了全新的文生视频模型Sora,那一次的发布,成功开启了AI视频生成的ChatGPT时刻。 看到Sora的发布视频,我相信有很多小伙伴和我一样被深深得震撼了! 只需一个指令就可以生成一段逼近真实的视频&…

NBOUND 2024:与AI 一起推动业务增长

在2024年,我们的企业有幸参加了INBOUND大会,这是HubSpot为期三天的动态会议,专注于探讨营销、销售和人工智能领域的最新趋势和策略。作为HubSpot的合作伙伴,我们在这里不仅学习和分享,更见证了如何通过AI推动增长的无限…

【DAY20240926】智能时隙选择器

文章目录 要点元模型和本地模型的关系lstm模型更新Q-learning选择策略:ϵ-greedy动作空间(𝑎𝑡𝑖−1∈{add,stay,minus}): 要点 The intelligent time slot selector is composed of a meta model on the …

提升并行效率的Python多处理模块指南

在Python中,multiprocessing 模块提供了强大的多进程支持,能够帮助我们充分利用多核CPU资源来实现并行计算。相比传统的多线程模式,Python的多进程模式更加高效,因为它可以避免Python的全局解释器锁(GIL)对…

一个超强大的Python数据探索工具

在数据分析的过程中,快速掌握数据集的基本特征是必不可少的一步。虽然 Pandas 提供了方便的 df.describe() 方法来生成数据摘要,但随着数据类型和分析需求的多样化,这一方法的局限性逐渐显现。Skimpy 作为一个新兴的 Python 包,旨…

基于mybatis-plus创建springboot,添加增删改查功能,使用postman来测试接口出现的常见错误

1 当你在使用postman检测 添加和更新功能时,报了一个500错误 查看idea发现是: Data truncation: Out of range value for column id at row 1 通过翻译:数据截断:表单第1行的“id”列出现范围外值。一般情况下,出现这个…

什么是Agent智能体?

你好,我是三桥君 近期,从各大厂商的年度大会到多个大型AI峰会,三桥君明显感受到行业风气的转变。这些会议不仅展示了众多AI Agent的实际应用案例,还有专家们对未来发展的预测。一时间,“Agent”这个词成为了热门词汇&…

Linux(含麒麟操作系统)如何实现多显示器屏幕采集录制

技术背景 在操作系统领域,很多核心技术掌握在国外企业手中。如果过度依赖国外技术,在国际形势变化、贸易摩擦等情况下,可能面临技术封锁和断供风险。开发国产操作系统可以降低这种风险,确保国家关键信息基础设施的稳定运行。在一…

多态的遗留问题以及C++中杂项,C++面试题

C面试题 1.什么是虚函数?什么是纯虚函数 虚函数:在类的继承中,基类中的函数前加virtual声明的函数就是虚函数。 虚函数实现了运行的多态,同一函数调用在不同对象中表现出不同的行为 纯虚函数:在基类中声明但没有实…

树莓派4B+UBUNTU20.04+静态ip+ssh配置

树莓派4B+UBUNTU20.04+静态ip+ssh配置 1.烧录Ubuntu镜像1.1选择pi 4b1.2选择ubuntu server (服务器版,无桌面)20.041.3选择sd卡1.4 点击右下角 NEXT ,编辑设置,输入密码,wifi选CN, 开启ssh1.5 烧录,依次点击“是”,等待完成2 烧录完成后装入树莓派,上电,等待系统完成配…

软件无线电3-微相E316和HackRF实现FM调制解调

前面介绍了基于Matlab、矢量信号器和HackRF One实现射频下的FM调制解调,今天分享的内容是用微相E316替代矢量信号器完成发射工作。注意本文仅用于科研和学习,私自搭建电台属于违法行为。 1.概述 微相E316和HackRF One实现FM调制解调测试框图如1所示&am…

离散化 ---( 求区间和)

什么是离散化? 离散化是将连续的数值范围映射到有限的、离散的数值集合的过程。在许多情况下,数据可能会存在多个重复值或范围较大的连续值。为了简化处理,尤其是处理区间查询和增量问题时,我们可以将这些值转换为一组有限的、唯一…

【重学 MySQL】四十、SQL 语句执行过程

【重学 MySQL】四十、SQL 语句执行过程 select 语句的完整结构select 语句执行顺序SQL 语句执行原理 select 语句的完整结构 SELECT 语句是 SQL(Structured Query Language)中用于从数据库表中检索数据的核心语句。一个完整的 SELECT 语句结构可以包括多…

Linux系统部署Mysql8.x修改密码并且设置远程连接

配置yum仓库配置yum仓库 # 更新密钥 rpm import https:repo.mysql.com/RPM-GPG-KEY- mysql-2023 # 安装Mysql8.x版本 yum库 rpm -Uvh https:dev.mysql.com/get/mysql80-community-release-el7-2.noarch.rpm 由于MySQL并不在CentOS的官方仓库中,所以我们通过上述rp…

跟李沐学AI:自注意力和位置编码

自注意力 自注意力机制(Self-Attention Mechanism),也被称为内部注意力(Intra-attention)或并行注意力(Parallel Attention),是一种在深度学习模型中用于处理序列数据的机制。它允许…

新版pycharm如何导入自定义环境

我们新的版本的pycharm的ui更改了,但是我不会导入新的环境了 我们先点击右上角的add interpreter 然后点击添加本地编译器 先导入这个bat文件 再点击load 我们就可以选择我们需要的环境了