每日一句:想得到世上最好的东西,先得让世界看到最好的你
目录
面试问OSI或TCP/IP,怎么回答?
面试问HTTP?
面试问Get类型,Pot类型区别?
面试什么是Socket套接字?
面试问什么是数据粘包?
粘包产生原因?
面试问什么是数据分包?
分包产生的原因就简单的多:
粘包与分包的处理方法:
为什么UDP没有粘包?
一组数据包的声明周期过程?
心跳包
客户端发“hello”经过OSI每一层都加一个协议头,封装成报,通过连接到互联网,物理层发送到服务端,接到后,再把一层层头去掉,得到“hello”
面试问OSI或TCP/IP,怎么回答?
- 网络的传输层次结构
- OSI——>简化TCP/IP模型,把应用,表示,会话——>合成应用层
- 每层经典数据协议
HTTP协议请求时,有请求头,响应头
客户端首先发一个请求协议,发送到服务端回一个响应协议
*TCP短链接
在每次传输时都会建立一个通讯信道,传输后关闭连接。关闭后服务器就找不到客户端了,需要待下一个客户端发起连接时才能找到
TCP长连接
客户端和服务端一开始会连接,并一直保持,直到不再交换数据断开。
UDP无连接,直接数据报投给你
区别:
- 长连接一直连接,服务器可随时向客户端发数据,短连接不可以
- 短链接性能消耗大
带宽计算 运营商 比特 个体 字节
通讯协议
IP协议 用于网络定位的一个数据串
TCP协议
- 服务器开始接收
- 客户端发送连接请求
- 如果达到服务端,服务端给相应
面试问HTTP?
是超文本传输协议,位于应用层,基于TCP协议开发。特点是传输时,有数据完整性校验(校验数据在头部信息中)
面试问HTTPS?
加密后的HTTP协议
- 敏感数据传参,加密数据更安全
- 防钓鱼网站
HTTP协议构成
URL结构
通讯协议::Http:// Https://
主机地址:IP,域名
端口号:80端口提供Http服务,443端口提供Https服务
目录:“/目录名”
脚本名称
URL参数
“?参数名=参数值&参数名=参数值”
URL地址可以进行伪装
HTTP状态号
200成功
301重定向(当前网页已过时,跳转到新页面)
403当前目录禁止访问
404网页不存在
500服务器内部错误
502访问量过大,不能提供服务
HTTP请求类型
Get类型 仅作网页请求连接
Post类型 用户名登录时,要作表单数据类型发送
面试问Get类型,Pot类型区别?
- Get类型通过URL地址传递的;Post类型数据通过HTTP数据头传递的
- Get类型会被记录下来,Post类型相对安全
- 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协议中。
打包
对原始数据添加协议头的过程
解包
接收到数据包时,读取包头,并记录信息,获取到包内原始数据的过程
一组数据包的声明周期过程?
- 对原始数据打包
- 对多个数据包粘包
- 套接字(连接,发送)
- 套接字(接收)
- 有可能同时接收到多个数据黏在一起,对数据进行(分包)
- 取得单个数据的原始数据(解包)
- 根据数据包,执行代码逻辑
数据包定制
包头:记录有关于整个数据包的信息(可加密)
包体:原始数据(可加密)
字节序(存在于数字存储方法)
小端字节序:将数据的后位字节,放在内存栈的低地址位
大端字节序:将数据的后位字节,放在内存栈的高地址位
主机字节序:当前计算机数字的字节表示方式
网络字节序:互联网规定,传递数据时,都转大端字节序
字符串内有字节序问题,它受字符编码影响
心跳包
因为TCP是有连接的,所以必须在两个PC间建立连接,但是如果长时间连接却又不发送数据,则会占用互联网的通信信道,就有可能被网络的中间设备(路由器,防火墙)将网络连接断开,所以防止网络被断开,则需要两台计算机间定期发送一些数据,这样的数据就是心跳数据
网络延迟计算:服务器返回心跳时间-客户端发送心跳时间