网络Http和Socket通讯(基于面试)

每日一句:想得到世上最好的东西,先得让世界看到最好的你

目录

面试问OSI或TCP/IP,怎么回答?

面试问HTTP?

面试问Get类型,Pot类型区别?

面试什么是Socket套接字?

面试问什么是数据粘包?

粘包产生原因?

面试问什么是数据分包?

分包产生的原因就简单的多:

粘包与分包的处理方法:

为什么UDP没有粘包?

一组数据包的声明周期过程?

心跳包


客户端发“hello”经过OSI每一层都加一个协议头,封装成报,通过连接到互联网,物理层发送到服务端,接到后,再把一层层头去掉,得到“hello”

面试问OSI或TCP/IP,怎么回答?

  1. 网络的传输层次结构
  2. OSI——>简化TCP/IP模型,把应用,表示,会话——>合成应用层
  3. 每层经典数据协议

HTTP协议请求时,有请求头,响应头

客户端首先发一个请求协议,发送到服务端回一个响应协议

*TCP短链接

在每次传输时都会建立一个通讯信道,传输后关闭连接。关闭后服务器就找不到客户端了,需要待下一个客户端发起连接时才能找到

TCP长连接

客户端和服务端一开始会连接,并一直保持,直到不再交换数据断开。

UDP无连接,直接数据报投给你

区别:

  1. 长连接一直连接,服务器可随时向客户端发数据,短连接不可以
  2. 短链接性能消耗大

带宽计算 运营商 比特  个体 字节

通讯协议

IP协议 用于网络定位的一个数据串

TCP协议

  1. 服务器开始接收
  2. 客户端发送连接请求
  3. 如果达到服务端,服务端给相应

面试问HTTP?

是超文本传输协议,位于应用层,基于TCP协议开发。特点是传输时,有数据完整性校验(校验数据在头部信息中)

面试问HTTPS?

加密后的HTTP协议

  1. 敏感数据传参,加密数据更安全
  2. 防钓鱼网站

HTTP协议构成

URL结构

通讯协议::Http://  Https://

主机地址:IP,域名

端口号:80端口提供Http服务,443端口提供Https服务

目录:“/目录名”

脚本名称

URL参数

“?参数名=参数值&参数名=参数值”

 URL地址可以进行伪装

HTTP状态号

200成功

301重定向(当前网页已过时,跳转到新页面)

403当前目录禁止访问

404网页不存在

500服务器内部错误

502访问量过大,不能提供服务

HTTP请求类型

Get类型 仅作网页请求连接

Post类型 用户名登录时,要作表单数据类型发送

面试问Get类型,Pot类型区别?

  1. Get类型通过URL地址传递的;Post类型数据通过HTTP数据头传递的
  2. Get类型会被记录下来,Post类型相对安全
  3. Get类型传递数据长度受URL限制;Post可以传递任意长度数

如果需要在URL传递数据中加入特殊字符,需要对数据进行URL编码

TCP长连接

面试什么是Socket套接字?

套接字是将IP地址与主机端口号合并在一起后的数据,IP地址定位主机位置,端口号知道通讯入口与出口,从而实现主机的数据交换

Socket基于传输层实现

TCP编程方式(c#)

连接(三次握手)——>断开(四次挥手)——>监听,绑定(服务器开发)——>接收——>发送

发送数据含头部信息,网卡里有缓存,累积之后再发怎么处理

数据包处理

面试问什么是数据粘包?

TCP协议中,发送方发送的若干包数据到接收方接收时粘成一包,从接收缓冲区看,后一包数据的头紧接着前一包数据的尾。

发送数据前,如果有多个数据包要一起发送,则可以将数据包拼在一起发送,这样效率更高

粘包产生原因?

先说TCP:由于TCP协议本身的机制(面向连接可靠的协议,三次握手四次挥手)客户段与服务端会建立一个链接,数据在链接不断开的情况下,可以持续不断地将多个数据包发往服务端,相当于一个流,但是如果发送的网络数据包太小,那么他本身会启用Nagle算法(当然是可配置是否启用)对较小的数据包进行合并(基于此,TCP的网络延迟要UDP的高些,因为需要合并延时发送)然后再发送(超时或者包大小足够)。这样的话,服务端在接收到消息(数据流)的时候就无法区分哪些数据包是客户端自己分开发送的,这样产生了粘包;还有一种情况,服务端在接收到数据后,然后放到缓冲区中,如果消息没有被及时从缓存区取走,下次在取数据的时候可能就会出现一次取出多个数据包的情况,造成粘包现象(确切来讲,对于基于TCP协议的应用,不应用包来描述,而应该用流的概念来描述)

面试问什么是数据分包?

当接到数据后,需要将每一个定制的数据格式分离出来,所写的代码就是分包代码,有时服务器是硬件将拼接在一起,有时是代码将数据包拼接在一起,拼接后的代码,效率更高

分包产生的原因就简单的多:

可能是IP分片传输导致的,也可能是传输过程中丢失部分包导致出现的半包,还有可能就是一个包可能被分成了两次传输,在取数据的时候,先取到了一部分(还可能与接收的缓冲区大小有关系),总之就是一个数据包被分成了多次接收。

粘包与分包的处理方法:

一个是采用分隔符的方式,即我们在封装要发送的数据包的时候,采用固定的字符作为结尾符(数据中不能含结尾符),这样我们接收到数据包后,如果出现结尾标识,即人为的将粘包分开,如果一个包中没有出现结尾符,认为出现了分包,则等待下个包中出现后 组合成一个完整的数据包,这种方式适合于文本传输的数据,如采用/r/n之类的分隔符;

另一种是采用在数据包中添加长度的方式,即在数据包中的固定位置封装数据包的长度信息(或可计算数据包总长度的信息),服务器接收到数据后,先是解析包长度,然后根据包长度截取数据包(此种方式常出现于自定义协议中),但是有个小问题就是如果客户端第一个数据包数据长度封装的有错误,那么很可能就会导致后面接收到的所有数据包都解析出错(由于TCP建立连接后流式传输机制),只有客户端关闭连接后重新打开才可以消除此问题,我在处理这个问题的时候对数据长度做了校验,会适时的对接收到的有问题的包进行人为的丢弃处理(客户端有自动重发机制,故而在应用层不会导致数据的不完整性);

为什么UDP没有粘包?

粘包拆包问题在数据链路层、网络层以及传输层都有可能发生。日常的网络应用开发大都在传输层进行,由于UDP有消息保护边界,不会发生粘包拆包问题,因此粘包拆包问题只发生在TCP协议中。

打包

对原始数据添加协议头的过程

解包

接收到数据包时,读取包头,并记录信息,获取到包内原始数据的过程

一组数据包的声明周期过程?

  1. 对原始数据打包
  2. 对多个数据包粘包
  3. 套接字(连接,发送)
  4. 套接字(接收)
  5. 有可能同时接收到多个数据黏在一起,对数据进行(分包)
  6. 取得单个数据的原始数据(解包)
  7. 根据数据包,执行代码逻辑

数据包定制

包头:记录有关于整个数据包的信息(可加密)

包体:原始数据(可加密)

字节序(存在于数字存储方法)
小端字节序:将数据的后位字节,放在内存栈的低地址位

大端字节序:将数据的后位字节,放在内存栈的高地址位

主机字节序:当前计算机数字的字节表示方式

网络字节序:互联网规定,传递数据时,都转大端字节序

字符串内有字节序问题,它受字符编码影响

心跳包

因为TCP是有连接的,所以必须在两个PC间建立连接,但是如果长时间连接却又不发送数据,则会占用互联网的通信信道,就有可能被网络的中间设备(路由器,防火墙)将网络连接断开,所以防止网络被断开,则需要两台计算机间定期发送一些数据,这样的数据就是心跳数据

网络延迟计算:服务器返回心跳时间-客户端发送心跳时间

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

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

相关文章

Minimal-Supervised Medical Image Segmentation via Vector Quantization Memory

文章目录 Minimal-Supervised Medical Image Segmentation via Vector Quantization Memory摘要方法实验结果 Minimal-Supervised Medical Image Segmentation via Vector Quantization Memory 摘要 辅助重构分支:该分支通过提供额外的监督并产生学习视觉表示所需…

Spring Boot数据映射利器:MapperStruct vs. BeanUtils.copyProperties 一较高下

Spring Boot数据映射利器:MapperStruct vs. BeanUtils.copyProperties 一较高下 在 Spring Boot 应用程序中,常常需要在不同的 Java 对象之间进行数据拷贝。这种拷贝操作在开发中非常常见,比如将 DTO(Data Transfer Object&#x…

【C++历练之路】unordered_map与unordered_set的封装实现

W...Y的主页 😊 代码仓库分享💕 前言:我们已经认识并实现了哈希底层的逻辑,创建出了其开散列。现在我们要进行封装,类比STL中的unordered_set 与 unordered_map。 目录 1. 模拟实现 1.1 哈希表的改造 1.2 unorde…

LabVIEW天然气压缩因子软件设计

LabVIEW天然气压缩因子软件设计 项目背景 天然气作为一种重要的能源,其压缩因子的准确计算对于流量的计量和输送过程的优化具有关键意义。传统的计算方法不仅步骤繁琐,而且难以满足现场快速响应的需求。因此,开发一款既能保证计算精度又便于…

PROTEUS仿真软件的使用及存储器的设计

proteus proteus,即EDA工具软件。Proteus软件是英国Lab Center Electronics公司出版的EDA工具软件。它不仅具有其它EDA工具软件的仿真功能,还能仿真单片机及外围器件。它是比较好的仿真单片机及外围器件的工具。虽然国内推广刚起步,但已受到…

四十九坊股权设计,白酒新零售分红制度,新零售策划机构

肆拾玖坊商业模式 | 白酒新零售体系 | 新零售系统开发 坐标:厦门,我是易创客肖琳 深耕社交新零售行业10年,主要提供新零售系统工具及顶层商业模式设计、全案策划运营陪跑等。 不花钱开3000多家门店,只靠49个男人用一套方法卖白酒…

ADOP带你了解:可堆叠交换机:为什么和为什么不

在快速发展的网络环境中,企业需要高效、精简的管理解决方案,以在竞争中保持领先地位。交换机堆叠已成为一种强大的技术,它不仅可以简化网络管理,还可以提高整体效率。在本文中,我们将探讨可堆叠交换机和交换机堆叠的概…

【CMU 15-445】Proj4 Concurrency Control

Concurrency Control 通关记录Task1 TimestampsTask2 Storage Format and Sequential ScanTask3 MVCC ExecutorsTask3.1 Insert ExecutorTask3.2 CommitTask3.3 Update and Delete ExecutorTask3.4 Stop-the-world Garbage Collection Task4 Primary Key IndexTask4.0 Index Sc…

day05-面向对象内存原理和数组

day05 面向对象内存原理和数组 我们在之前已经学习过创建对象了,那么在底层中他是如何运行的。 1.对象内存图 1.1 Java 内存分配 Java 程序在运行时,需要在内存中分配空间。为了提高运算效率,就对空间进行了不同区域的划分,因为每一片区域…

音视频-H264编码封装- MP4格式转Annex B格式

目录 1:H264语法结构回顾 2:H264编码补充介绍 3:MP4模式转Annex B模式输出到文件示例 1:H264语法结构回顾 在之前文章里介绍过H264的语法结构。 传送门: 视音频-H264 编码NALU语法结构简介 2:H264编码补充介绍 H…

前端笔记-day02

文章目录 01-无序列表02-有序列表03-定义列表04-表格06-表格-合并单元格07-表单-input08-表单-input占位文本09-表单-单选框10-表单-上传多个文件11-表单-多选框12-表单-下拉菜单13-表单-文本域14-表单-label标签15-表单-按钮16-无语义-span和div17-字体实体19-注册登录页面 01…

[240512] x-cmd 发布 v0.3.6: (se,wkp,ddgo...)x( kimi,gemini,gpt...)

目录 x-cmd 发布 v0.3.6新增了 jina 模块新增了 ddgo 模块新增了 se 模块wkp 模块新增了 writer 模块cosmo 模块 x-cmd 发布 v0.3.6 本次版本的最新引入的功能都是目的为了进一步探索 LLM 的使用。 本版本的改进分为两类:资讯类模块(Wikipedia&#xf…

十三、Redis哨兵模式--Sentinel

上一篇介绍了Redis中的主从复制。我们知道Redis主从中一般只有主节点对外提供写操作,如果主节点发生故障,为了保证Redis的可用性,这时就要在可用的slave节点中,挑选一个作为主节点。这种切换操作如果是人为的操作,那么…

39-5 入侵检测系统(IDS)- 安装配置IDS(第三天安装成功)

官网:Snort Rules and IDS Software Download 参考: (这位大佬分享了安装包下载链接):https://www.cnblogs.com/taoyuanming/p/12722263.html (安装过程参考这位大佬):Snort 安装与配置(CentOS 7)_centos 7 snort-CSDN博客一、安装 IDS(我这里在 CentOS 7 虚拟机中安…

【Docker】Ubunru下Docker的基本使用方法与常用命令总结

【Docker】docker的基本使用方法 镜像image与容器container的关系基本命令- 查看 Docker 版本- 拉取镜像- 查看系统中的镜像- 删除某个镜像- 列出当前 Docker 主机上的所有容器,包括正在运行的、暂停的、已停止的,以及未运行的容器- 列出当前 Docker 主机…

【强训笔记】day19

NO.1 代码实现&#xff1a; #include <iostream> using namespace std;int gcd(int x,int y) {if(y0) return x;return gcd(y,x%y); } int main() {int n,a;while(cin>>n>>a){int b;for(int i0;i<n;i){cin>>b;if(a>b) ab;else agcd(a,b);}cou…

验证码生成--kaptcha

验证码生成与点击重新获取验证码 如图所示&#xff0c;本文档仅展示了验证码的生成和刷新显示。 1. 概述 系统通过生成随机验证码图像和文本。 2. 代码分析 2.1. Maven依赖 <dependency><groupId>com.github.penggle</groupId><artifactId>kaptch…

RustDesk 自建服务器部署和使用教程

RustDesk 是一个强大的开源远程桌面软件&#xff0c;是中国开发者的作品&#xff0c;它使用 Rust 编程语言构建&#xff0c;提供安全、高效、跨平台的远程访问体验。可以说是目前全球最火的开源远程桌面软件了&#xff0c;GitHub 星星数量达到了惊人的 64k&#xff01; 与 Team…

如何看待云计算的第三次浪潮?

如何看待云计算的第三次浪潮&#xff1f; 来自云栖大会的演讲你如何看待云计算的第三次浪潮&#xff1f;云计算的第三次浪潮将会给社会带来怎样的变革&#xff1f;开发者在云计算的第三次浪潮中将会有哪些机遇和挑战&#xff1f;机遇挑战 来自云栖大会的演讲 在2023云栖大会上…

SpringSecurity安全过滤器工作原理

前面通过三篇文章&#xff0c;从底层代码的角度分析了SpringSecurity的初始化过程。 接下来我们就要具体看一下&#xff0c;Spring Security的安全过滤器初始化、装配好之后&#xff0c;到底是怎么工作的。 还是按图索骥 下面我们简单从底层源码分析一下&#xff0c;请求是怎…