天道酬勤,学无止境

粘包问题


目录

  • 一、什么是粘包?
  • 二、TCP发送数据的四种情况
  • 三、粘包的两种情况
    • 3.1 服务端
    • 3.2 客户端
    • 3.3 服务端
    • 3.4 客户端
  • 四、补充问题一:为何TCP是可靠传输,udp是不可靠传输
  • 五、补充问题二:send(字节流)和recv(1024)及sendall


一、什么是粘包?

注意:只有TCP有粘包现象,UDP永远不会粘包,为何,且听我娓娓道来。

首先需要掌握一个socket收发消息的原理

123-粘包问题-socket收发消息.png?x-oss-process=style/watermark

发送端可以是一K一K地发送数据,而接收端的应用程序可以两K两K地提走数据,当然也有可能一次提走3K或6K数据,或者一次只提走几个字节的数据,也就是说,应用程序所看到的数据是一个整体,或说是一个流(stream),一条消息有多少字节对应用程序是不可见的,因此TCP协议是面向流的协议,这也是容易出现粘包问题的原因。而UDP是面向消息的协议,每个UDP段都是一条消息,应用程序必须以消息为单位提取数据,不能一次提取任意字节的数据,这一点和TCP是很不同的。怎样定义消息呢?可以认为对方一次性write/send的数据为一个消息,需要明白的是当对方send一条信息的时候,无论底层怎样分段分片,TCP协议层会把构成整条消息的数据段排序完成后才呈现在内核缓冲区。

例如基于TCP的套接字客户端往服务端上传文件,发送时文件内容是按照一段一段的字节流发送的,在接收方看了,根本不知道该文件的字节流从何处开始,在何处结束。

所谓粘包问题主要还是因为接收方不知道消息之间的界限,不知道一次性提取多少字节的数据所造成的。

此外,发送方引起的粘包是由TCP协议本身造成的,TCP为提高传输效率,发送方往往要收集到足够多的数据后才发送一个TCP段。若连续几次需要send的数据都很少,通常TCP会根据优化算法把这些数据合成一个TCP段后一次发送出去,这样接收方就收到了粘包数据。

  • TCP(transport control protocol,传输控制协议)是面向连接的,面向流的,提供高可靠性服务。收发两端(客户端和服务器端)都要有一一成对的socket,因此,发送端为了将多个发往接收端的包,更有效的发到对方,使用了优化方法(Nagle算法),将多次间隔较小且数据量小的数据,合并成一个大的数据块,然后进行封包。这样,接收端,就难于分辨出来了,必须提供科学的拆包机制。 即面向流的通信是无消息保护边界的。

  • UDP(user datagram protocol,用户数据报协议)是无连接的,面向消息的,提供高效率服务。不会使用块的合并优化算法,, 由于UDP支持的是一对多的模式,所以接收端的skbuff(套接字缓冲区)采用了链式结构来记录每一个到达的UDP包,在每个UDP包中就有了消息头(消息来源地址,端口等信息),这样,对于接收端来说,就容易进行区分处理了。 即面向消息的通信是有消息保护边界的。

  • TCP是基于数据流的,于是收发的消息不能为空,这就需要在客户端和服务端都添加空消息的处理机制,防止程序卡住,而udp是基于数据报的,即便是你输入的是空内容(直接回车),那也不是空消息,udp协议会帮你封装上消息头,实验略

udp的recvfrom是阻塞的,一个recvfrom(x)必须对唯一一个sendinto(y),收完了x个字节的数据就算完成,若是y>x数据就丢失,这意味着udp根本不会粘包,但是会丢数据,不可靠

TCP的协议数据不会丢,没有收完包,下次接收,会继续上次继续接收,己端总是在收到ack时才会清除缓冲区内容。数据是可靠的,但是会粘包。

二、TCP发送数据的四种情况

123-粘包问题-粘包可能.png?x-oss-process=style/watermark

假设客户端分别发送了两个数据包D1和D2给服务端,由于服务端一次读取到的字节数是不确定的,故可能存在以下4种情况。

  1. 服务端分两次读取到了两个独立的数据包,分别是D1和D2,没有粘包和拆包;

  2. 服务端一次接收到了两个数据包,D1和D2粘合在一起,被称为TCP粘包;

  3. 服务端分两次读取到了两个数据包,第一次读取到了完整的D1包和D2包的部分内容,第二次读取到了D2包的剩余内容,这被称为TCP拆包;

  4. 服务端分两次读取到了两个数据包,第一次读取到了D1包的部分内容D1_1,第二次读取到了D1包的剩余内容D1_2和D2包的整包。

特例:如果此时服务端TCP接收滑窗非常小,而数据包D1和D2比较大,很有可能会发生第五种可能,即服务端分多次才能将D1和D2包接收完全,期间发生多次拆包。

三、粘包的两种情况

1.发送端需要等缓冲区满才发送出去,造成粘包(发送数据时间间隔很短,数据了很小,会合到一起,产生粘包)

3.1 服务端

# _*_coding:utf-8_*_
__author__ = 'nickchen121'
from socket import *
ip_port = ('127.0.0.1', 8080)

TCP_socket_server = socket(AF_INET, SOCK_STREAM)
TCP_socket_server.bind(ip_port)
TCP_socket_server.listen(5)

conn, addr = TCP_socket_server.accept()

data1 = conn.recv(10)
data2 = conn.recv(10)

print('----->', data1.decode('utf-8'))
print('----->', data2.decode('utf-8'))

conn.close()

3.2 客户端

# _*_coding:utf-8_*_
__author__ = 'nickchen121'
import socket
BUFSIZE = 1024
ip_port = ('127.0.0.1', 8080)

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
res = s.connect_ex(ip_port)

s.send('hello'.encode('utf-8'))
s.send('feng'.encode('utf-8'))

2.接收方不及时接收缓冲区的包,造成多个包接收(客户端发送了一段数据,服务端只收了一小部分,服务端下次再收的时候还是从缓冲区拿上次遗留的数据,产生粘包)

3.3 服务端

# _*_coding:utf-8_*_
__author__ = 'nickchen121'
from socket import *
ip_port = ('127.0.0.1', 8080)

TCP_socket_server = socket(AF_INET, SOCK_STREAM)
TCP_socket_server.bind(ip_port)
TCP_socket_server.listen(5)

conn, addr = TCP_socket_server.accept()

data1 = conn.recv(2)  # 一次没有收完整
data2 = conn.recv(10)  # 下次收的时候,会先取旧的数据,然后取新的

print('----->', data1.decode('utf-8'))
print('----->', data2.decode('utf-8'))

conn.close()

3.4 客户端

# _*_coding:utf-8_*_
__author__ = 'nickchen121'
import socket
BUFSIZE = 1024
ip_port = ('127.0.0.1', 8080)

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
res = s.connect_ex(ip_port)

s.send('hello feng'.encode('utf-8'))

123-粘包问题.jpg?x-oss-process=style/watermark

四、补充问题一:为何TCP是可靠传输,udp是不可靠传输

  • 基于TCP的数据传输请参考我的另一篇文章https://www.cnblogs.com/nickchen121/p/11027575.html,TCP在数据传输时,发送端先把数据发送到自己的缓存中,然后协议控制将缓存中的数据发往对端,对端返回一个ack=1,发送端则清理缓存中的数据,对端返回ack=0,则重新发送数据,所以TCP是可靠的

  • udp发送数据,对端是不会返回确认信息的,因此不可靠

五、补充问题二:send(字节流)和recv(1024)及sendall

  • recv里指定的1024意思是从缓存里一次拿出1024个字节的数据

  • send的字节流是先放入己端缓存,然后由协议控制将缓存内容发往对端,如果待发送的字节流大小大于缓存剩余空间,那么数据丢失,用sendall就会循环调用send,数据不会丢失

标签

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • 聊聊TCP的粘包、拆包以及解决方案
    聊聊TCP的粘包、拆包以及解决方案 TCP的粘包和拆包问题往往出现在基于TCP协议的通讯中,比如RPC框架、Netty等。如果你的简历中写了类似的技术或者你所面试的公司使用了相关的技术,被问到该面试的几率会非常高。 TCP的粘包和拆包问题往往出现在基于TCP协议的通讯中,比如RPC框架、Netty等。如果你的简历中写了类似的技术或者你所面试的公司使用了相关的技术,被问到该面试的几率会非常高。 今天这篇文章就带大家详细了解一下TCP的粘包和拆包以及解决方案。 什么是粘包? 在学习粘包之前,先纠正一下读音,很多视频教程中将“粘”读作“nián”。经过调研,个人更倾向于读“zhān bāo”。 如果在百度百科上搜索“粘包”,对应的读音便是“zhān bāo”,语义解释为:网络技术术语。指TCP协议中,发送方发送的若干包数据到接收方接收时粘成一包,从接收缓冲区看,后一包数据的头紧接着前一包数据的尾。 TCP是面向字节流的协议,就是没有界限的一串数据,本没有“包”的概念,“粘包”和“拆包”一说是为了有助于形象地理解这两种现象。 为什么UDP没有粘包? 粘包拆包问题在数据链路层、网络层以及传输层都有可能发生。日常的网络应用开发大都在传输层进行,由于UDP有消息保护边界,不会发生粘包拆包问题,因此粘包拆包问题只发生在TCP协议中 粘包拆包发生场景 因为TCP是面向流,没有边界
  • Socket编程(网络编程)中TCP粘包的实例,含代码演示
    利用网络通信中,经常会出现粘包的问题,围绕着这个问题说原因和解决的蛮多帖子的,但是给出粘包代码的就好少,为了便于大家更好的理解粘包的问题,这里对客户端和服务器端出现的粘包问题进行模拟,以方便更好的理解这个问题的出现原因。在开始之前还是需要理解几个基础概念。 如果需要源代码请点击此处下载 1、什么是粘包? 粘包是指发送方发送的若干包数据到接收方接收时粘成一包,从接收缓冲区看,后一包数据的头紧接着前一包数据的尾。只有TCP有粘包现象,UDP不会。 2、哪里会发生粘包? 其实粘包主要分为两个方面,客户端和服务器端都可能会出现: a、客户端发生:当连续发送数据时,由于tcp协议的nagle算法,会将较小的内容拼接成大的内容,一次性发送到服务器端,因此造成粘包 b、服务器端发生:当发送内容较大时,由于服务器端的recv(buffer_size)方法中的buffer_size较小,不能一次性完全接收全部内容,因此在下一次请求到达时,接收的内容依然是上一次没有完全接收完的内容,因此造成粘包现象。 好了说了这些之后,我们简单通过一个图来介绍下我们要模拟的粘包的场景:简单说就是客户端向服务器端不停的发送两个包,一个数据包的内容是一个整形的数:4,另一个包是一个字符串:你好! 理想情况下,我们应该是客户端发送什么,发送多少服务器端就接收对应数量的数据: 然而,当我们加快客户端的发送速度时
  • netty 解决TCP粘包与拆包问题(一)
    netty 解决TCP粘包与拆包问题(一) 参考文章: (1)netty 解决TCP粘包与拆包问题(一) (2)https://www.cnblogs.com/kabi/p/6115099.html 备忘一下。 来源:https://blog.csdn.net/jazz2013/article/details/115281446
  • Socket编程TCP协议粘包问题
    Socket编程中,基于TCP协议的通信有时候会发生粘包问题,原因大家自行百度,已经搜到这种问题应该了解粘包产生的原因哈 TCP协议是可靠的字节流式协议,字节流可以理解为是水流,数据在网络中像水流一样传输,所以纯粹发送字符串一旦TCP底层发生粘包情况,数据表意将产生错误,比如你想发送,我今天发现一特有意思的事 这句话TCP可能给你拆成我今,天发,现一特有意,思的,事儿,只是举个简单例子哈, 我们怎么处理这种问题呢,有多种方案 一个是根据EOF拆分,这个EOF就是自定义的一个特殊符号,比如我们现在就约定\r\n为EOF,碰到这个我就认为你当前发送的消息结束掉了,这个是没问题的哈,只不过有的应用场景,比如我们聊QQ跟人的时候,想一次性打好多话给对面,然后换下行,比如下图这种情况,这种情况让根据换行截断就不合适了吧,因为毕竟是一个消息,如果你多个换行,本来一句话,根据\r\n的约定,会被切成N句话,所以这个要看应用场景 第二种就是我们约定一个数据格式,比如我们自定个规矩(逼格说的高一点叫协议),我们的协议规定,消息一定要有个包头+包体,包头(两个字节)存放消息长度,包体存放字符串的消息,好了,我们现在建立Socket通信以后把我们的数据传递给对端,对端按照我们约定的协议,先把头两个字节给摘出来,看看消息长度有多少,然后按长度向后截取,这样就是一个完整的消息包了
  • 详述 Java NIO 以及 Socket 处理粘包和断包方法
    文章目录 Java NIO通道缓冲区代码示例第一部分第二部分 选择器 Socket 处理粘包 & 断包问题第一个问题:对于粘包问题的解决第二个问题:对于断包问题的解决示例代码 Java NIO NIO 是 New I/O 的简称,是 JDK 1.4 新增的功能,之所以称其为 New I/O,原因在于它相对于之前的 I/O 类库是新增的。由于之前老的 I/O 类库是阻塞 I/O,New I/O 类库的目标就是要让 Java 支持非阻塞 I/O,所以也有很多人喜欢称其为 Non-block I/O,即非阻塞 I/O。 NIO 的文件读写设计颠覆了传统 IO 的设计,采用『通道』+『缓存区』使得新式的 I/O 操作直接面向缓存区。NIO 弥补了原来同步阻塞 I/O 的不足,它在标准 Java 代码中提供了高速的、面向块的 I/O。通过定义包含数据的类,以及通过以块的形式处理这些数据,NIO 不用使用本机代码就可以利用低级优化,这是原来的 I/O 包所无法做到的。 通道 在 NIO 中,通道用Channel表示,网络数据通过Channel读取和写入。通道与流的不同之处在于通道是双向的,流只是在一个方向上移动(一个流必须是InputStream或者OutputStream的子类),而通道可以用于读、写或者二者同时进行。因为Channel是全双工的,所以它可以比流更好地映射底层操作系统的
  • Socket 粘包 拆包;
    为什么会粘包?举个栗子: Socket连接成功就相当于通讯管道已经建立,客户端就一直从管道中取数据,如果数据一次没有取完就会发生遗留,这些遗留的数据就会和下次的数据包一起传输过来,然后就粘包了; 再看个数据: 采用0x7e 表示,若校验码、消息头以及消息体中出现0x7e,则要进行转义处理,转义 规则定义如下: 0x7e <————> 0x7d后紧跟一个0x02; 0x7d <————> 0x7d后紧跟一个0x01。 转义处理过程 如下: 发送消息时:消息封装——>计算并填充校验码——>转义; 接收消息时:转义还原——>验证校验码——>解析消息。 示例: 发送一包内容为0x30 0x7e 0x08 0x7d 0x55的数据包,则经过封装如下: 0x7e 0x30 7d 0x02 0x08 0x7d 0x01 0x55 0x7e。 7E就是标识位,拿到数据如果首尾时7E且中间没有出现7E,则说明数据正常,如果不是这样则需要拆包; 也就是,从第一个7E开始读取数据,读到第二个7E数据结束; 1、7E8001000501833996222200130014000200DB7E 2、7E8001000501833996222200130014000200DB 3、7E7E8001000501833996222200130014000200DB7E (数据已经由byte数组转为十六进制字符串)
  • 网络编程解决黏包现象
    个人感悟:首先我觉的要想学好一门语言不论是是什么语言:java , C ,python ,PHP,都要弄明白网络请求与响应,过程,osi模型等,我觉的这个最基础的 ,但是今天我需要解决的是 网络交互时发生的"黏包"问题,行了不啰嗦了让我们进入正题吧。 黏包现象 让我们基于tcp先制作一个远程执行命令的程序(命令ls -l ; lllllll ; pwd) 这块我们需要注意下 res=subprocess.Popen(cmd.decode('utf-8'), shell=True, stderr=subprocess.PIPE, stdout=subprocess.PIPE) 的结果的编码是以当前所在的系统为准的,如果是windows,那么res.stdout.read()读出的就是GBK编码的,在接收端需要用GBK解码 且只能从管道里读一次结果 同时执行多条命令之后,得到的结果很可能只有一部分,在执行其他命令的时候又接收到之前执行的另外一部分结果,这种显现就是黏包 那么我们现在来实现个黏包现象吧 看我是怎么解决的的基于tcp协议实现的黏包tcp - server #_*_coding:utf-8_*_ from socket import * import subprocess ip_port=('127.0.0.1',8888) BUFSIZE=1024 tcp_socket
  • python入门教程11-03 (python语法入门之socket通信)
    本章主要讲述Python中实现socket通信,因为socket通信的服务端比较复杂,而且客户端非常简单,所以客户端基本上都是用sockct模块实现,而服务端用有很多模块可以使用,干货在后面,一起来看看吧。Socket概念Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,一组简单的接口就是全部,让Socket去组织数据,以符合指定的协议。基于TCP协议的socketserver端import socketsk = socket.socket()sk.bind((‘127.0.0.1’,8898)) #把地址绑定到套接字sk.listen() #监听链接conn,addr = sk.accept() #接受客户端链接ret = conn.recv(1024) #接收客户端信息print(ret) #打印客户端信息conn.send(b’hi’) #向客户端发送信息conn.close() #关闭客户端套接字sk.close() #关闭服务器套接字(可选)client端import socketsk = socket.socket() # 创建客户套接字sk.connect((‘127.0.0.1’,8898)) # 尝试连接服务器sk.send
  • socket粘包的处理方法示例
    sever import struct # 把有限长度的数字变成4个字节 import subprocess # 引入子进程模块 import socket sever = socket.socket() sever.bind((‘192.168.3.7’, 9000)) sever.listen(5) while 1: print(‘sever working 开始等待链接’) conn, addr = sever.accept() while 1: try: data = conn.recv(1024) res = subprocess.Popen(data.decode(‘utf-8’), # 创建子进程对象 第一个参数是操作系统命令string类型 shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE) err = res.stderr.read() # 操作系统命令标准错误 返回的字符串 out = res.stdout.read() # 操作系统命令标准输出 返回的字符串 if err: conn.send(struct.pack(‘i’, len(err))) conn.send(err) break else: conn.send(struct.pack(‘i’, len(out))) conn
  • 2021最新Java面经整理 | 计算机网络篇
    2021最新Java面经整理 | 计算机网络篇 目录 一、网络层次划分 1.1 应用层 1.2 传输层 1.3 网络层 1.4 数据链路层 1.5 物理层 二、TCP/IP协议(重点) 1、概述 2、TCP报文首部格式 3、TCP协议的三次握手和四次挥手 三、UDP协议  1、UDP的概述(User Datagram Protocol,用户数据报协议) 2、使用场景 3、UDP的首部格式 四、TCP和UDP的区别 五、TCP如何保证可靠传输 1、校验和 2、确认应答与序列号 3、超时重传 4、连接管理 5、流量控制 6、拥塞控制 六、TCP的三次握手四次挥手 1、TCP报文格式 2、三次握手 3、四次挥手 4、为什么三次握手和四次挥手? 5、为什么客户端最后还要等待2MSL? 七、TCP的粘包和拆包 1、粘包、拆包表现形式 2、粘包、拆包发生原因 3、粘包、拆包解决办法 八、其他协议 1、DNS协议 2、ARP/RARP协议 3、NAT协议 4、DHCP协议 5、HTTP协议 九、HTTP 与 HTTPS 1、基本概念 2、HTTP 与 HTTPS 区别 3、HTTPS 的工作原理 十、一个完整的HTTP请求流程 1、示例一 2、示例二 3、示例三 十一、其他问题 1、HTTP长连接、短连接 2、HTTP 1.0和HTTP 1.1的主要区别是什么? 3、HTTP是不保存状态的协议
  • 【6】Java基础51-60
    目录 知识点51:说一下 tcp 粘包是怎么产生的? 知识点52:OSI 的七层模型都有哪些? 知识点53:get 和 post 请求有哪些区别? 知识点54:如何实现跨域? 方式一:图片ping或script标签跨域 方式二:JSONP跨域 方式三:CORS 方式四:window.name+iframe 方式五:window.postMessage() 方式六:修改document.domain跨子域 方式七:WebSocket 方式八:代理 知识点55:说一下 JSONP 实现原理? 知识点56:jsp 和 servlet 有什么区别? 知识点57:jsp 有哪些内置对象?作用分别是什么? 知识点58:说一下 jsp 的 4 种作用域? 知识点59:session 和 cookie 有什么区别? 知识点60:说一下 session 的工作原理? 知识点51:说一下 tcp 粘包是怎么产生的? ①. 发送方产生粘包: 采用TCP协议传输数据的客户端与服务器经常是保持一个长连接的状态(一次连接发一次数据不存在粘包),双方在连接不断开的情况下,可以一直传输数据;但当发送的数据包过于的小时,那么TCP协议默认的会启用Nagle算法,将这些较小的数据包进行合并发送(缓冲区数据发送是一个堆压的过程);这个合并过程就是在发送缓冲区中进行的,也就是说数据发送出来它已经是粘包的状态了。
  • Go语言基础之网络编程
    目录一、互联网协议介绍二、互联网分层模型2.1 物理层2.2 数据链路层2.3 网络层2.4 传输层2.5 应用层三、socket编程四、socket图解五、Go语言实现TCP通信5.1 TCP协议5.2 TCP服务端5.3 TCP客户端六、TCP黏包6.1 黏包示例6.2 为什么会出现粘包6.3 解决办法七、Go语言实现UDP通信7.1 UDP协议7.2 UDP服务端7.3 UDP客户端更新、更全的《Go从入门到放弃》的更新网站,更有python、go、人工智能教学等着你:https://www.cnblogs.com/nickchen121/p/11517502.html现在我们几乎每天都在使用互联网,我们前面已经学习了如何编写Go语言程序,但是如何才能让我们的程序通过网络互相通信呢?本章我们就一起来学习下Go语言中的网络编程。 关于网络编程其实是一个很庞大的领域,本文只是简单的演示了如何使用net包进行TCP和UDP通信。如需了解更详细的网络编程请自行检索和阅读专业资料。一、互联网协议介绍互联网的核心是一系列协议,总称为”互联网协议”(Internet Protocol Suite),正是这一些协议规定了电脑如何连接和组网。我们理解了这些协议,就理解了互联网的原理。由于这些协议太过庞大和复杂,没有办法在这里一概而全,只能介绍一下我们日常开发中接触较多的几个协议。二
  • TCP与UDP的区别
    摘要:计算机网络基础 引言 网络协议是每个前端工程师都必须要掌握的知识,TCP/IP 中有两个具有代表性的传输层协议,分别是 TCP 和 UDP,本文将介绍下这两者以及它们之间的区别。 一、TCP/IP网络模型 计算机与网络设备要相互通信,双方就必须基于相同的方法。比如,如何探测到通信目标、由哪一边先发起通信、使用哪种语言进行通信、怎样结束通信等规则都需要事先确定。不同的硬件、操作系统之间的通信,所有的这一切都需要一种规则。而我们就把这种规则称为协议(protocol)。 TCP/IP 是互联网相关的各类协议族的总称,比如:TCP,UDP,IP,FTP,HTTP,ICMP,SMTP 等都属于 TCP/IP 族内的协议。 TCP/IP模型是互联网的基础,它是一系列网络协议的总称。这些协议可以划分为四层,分别为链路层、网络层、传输层和应用层。 链路层:负责封装和解封装IP报文,发送和接受ARP/RARP报文等。网络层:负责路由以及把分组报文发送给目标网络或主机。传输层:负责对报文进行分组和重组,并以TCP或UDP协议格式封装报文。应用层:负责向用户提供应用程序,比如HTTP、FTP、Telnet、DNS、SMTP等。 在网络体系结构中网络通信的建立必须是在通信双方的对等层进行,不能交错。 在整个数据传输过程中,数据在发送端时经过各层时都要附加上相应层的协议头和协议尾
  • 海量面经来袭!阿里钉钉、ICBU、CBU、蚂蚁、全在这里了,看完要个20K没什么问题!
    前言 阿里提前批面了很多部门,除了淘系一面其他都过了,最终点了国际化中台的内推,在焦急等hr面中,分享面经,希望能帮到大家,都能拿到满意的offer~ 3.3阿里CBU一面 项目30分钟(流程+项目难点+部署) JVM类加载过程 主要类加载器有什么 双亲委派模型的好处 双亲委派模型怎么打破 什么软件/应用打破了双亲委派模型 常用设计模式介绍(代理模式、包装模式、工厂模式、适配器模式、责任链模式…) 包装模式在JDK中哪里应用了、责任链模式在哪里应用 工厂模式在Spring源码中哪里有应用 多线程在项目中的应用 定义线程池的方法 Callable和Runnable的区别 FutureTask介绍 BeanFactory和ApplicationContext区别 Bean的生命周期 Java中实现Map接口的有什么 遍历HashMap的几种方法 Java8中JVM运行时数据结构变化是什么(元空间取代了方法区) 为什么用元空间取代方法区 业界大数据新技术,比如Hadoop了解吗? Java中的包装类有什么用(Integer Long Double),为什么需要包装类 TCP的粘包?粘包怎么解决?UDP会粘包吗? TCP面向什么传输,UDP面向什么传输? RPC了解吗? 线程的声明周期? 迪杰斯特拉最短路径算法? 选择排序是稳定的吗,时间复杂度? 快排稳定吗,时间复杂度,什么时候性能最差?
  • 一文读懂TCP协议UDP协议的特点(区别)
    最近复习到网络,Linux的复习也将接近尾声。在这我将改正自己做事龙头蛇尾的一贯作风。在网络编程这个模块中也会认真做好笔记。 网络模块是一个面试必问的模块,这一块内容较多,但大多都是知识点,代码量就一个TCP和UDP的编程流程。 从这篇文章开始,我会将网络编程的知识点一一进行总结。 一下内容参考《计算机网络》(谢希仁)第五版。 目录 1.TCP协议的特点 2.UDP协议的特点 1.TCP协议的特点 tcp协议的主要特点如下: TCP是面向连接的的运输层协议。 这就是说,应用程序在使用TCP协议之前,必须先建立TCP连接。在传送完数据之后,必须对已建立的TCP连接进行释放。这就是说,应用程序之间的的通信好像在“打电话”;通话前先要拨号,打电话建立连接,通话结束后要挂断电话释放连接。 TCP连接是点对点的。 每一条TCP连接只能有两个端点。但是一般在服务器上我们有不止一个客户端的请求,这时候就要建立多条TCP连接。 TCP提供可靠交付的服务。 也就是说,通过TCP连接传送的数据,无差错、不丢失、不重复并且按序到达。 TCP提供全双工通信 TCP允许通信双方的应用程序在任何时候都能发送数据。TCP连接的两端都设有发送缓存和接收缓存,用来临时存放双向通信的数据。应用程序在把数据发送给TCP的缓存后,就可以继续做自己的事情,而TCP在合适的时候会将缓存中的数据发送出去。在接收时
  • boost项目复盘(二)
    预处理1.首先是预处理模块,这里输入的是boost离线版本的html文件,需要从boost官网下载对应版本的离线包,我们这里使用的是boost1.53版本,从官网下载好以后从压缩包里可以找到一个doc目录,里面的html目录文件就是我么要使用的“原始数据”。光拿到html还不够,对于网页的html文件,会具有一下特点:这里拿boost官网首页源代码为例,可以明显看到有许多诸如<div>,<head>,<title>这样的结构,这种结构在前端的语言当中叫做标签。用于页面的渲染,而对于我们实现的功能而言,标签与正文是无关的,所以第一个要点就开始了——如何去标签。经过观察不难发现,标签的特点都是框在一对尖括号当中的,所以我们可以反向思考,只要是由 > 开始到 < 结束的就是正文部分。因此,对于此处我们是这样操作的:创建一个bool变量作为标记,判断当前是否为正文,以<为进入标签的标记,一旦进入<则接下来的内容就不会写入,而一离开>则开始写入最终结果,也就是代码中的content。但这里并不非常严谨,只是简单粗暴的把标签去掉,因为正文中出现的不一定就全是我们需要的。而此时预处理的过程还没有结束,我们现在得到的去掉标签的文件还是一团由标题,正文以及url组成的乱麻(此处涉及粘包问题,只要是涉及字节流的问题都会联系到粘包问题),想要作为下一个模块的输入部分还需要将他们按一定格式处理
  • python开发工程师面试题-超实用面试必看,Python工程师面试题
    原标题:超实用面试必看,Python工程师面试题 面试是公司挑选职工的一种重要方法。它给公司和应招者提供了进行双向交流的机会,能使公司和应招者之间相互了解,从而双方都可更准确做出聘用与否、受聘与否的决定。Python后端工程师面试题目有哪些? 1、推荐一本看过最好的python书籍? 2、python适合的场景有哪些?当遇到计算密集型任务怎么办? 3、tcp/udp的区别?tcp粘包是怎么回事,如何处理?udp有粘包吗? 4、time_wait是什么情况?出现过多的close_wait可能是什么原因? 3.epoll,select的区别?边缘触发,水平触发区别? 5、谈谈mysql字符集和排序规则? 6、varchar与char的区别是什么?大小限制? 7、primary key和unique的区别? 8、外键有什么用,是否该用外键?外键一定需要索引吗? 9、sql注入是怎么产生的,如何防止? 10、xss如何预防?htmlescape后能否避免xss? 11、csrf是什么?django是如何防范的? 12、一行代码实现1--100之和利用sum()函数求和 13、列出5个python标准库 os:提供了不少与操作系统相关联的函数 sys: 通常用于命令行参数 re: 正则匹配 math: 数学运算 datetime:处理日期时间 14、字典如何删除键和合并两个字典
  • Python入门(目录全览)-------已更新到第八篇完结
    文章目录 Python入门(目录全览)==已更新到第八篇完结==第一篇 计算机基础第二篇 Python解释器和集成环境第三篇 Python基础第四篇 Python进阶第五篇 文件处理第六篇 函数基础第七篇 函数进阶第八篇 模块基础第九篇 Python常用模块第十篇 面向对象基础第十一篇 面向对象进阶第十二篇 面向对象高阶第十三篇 网络编程第十四篇 并发编程第十五篇 MySQL数据库 Python入门(目录全览)已更新到第八篇完结 第一篇 计算机基础 002 计算机基础之编程 003 计算机组成原理 004 计算机操作系统 005 编程语言分类 006 网络的瓶颈效应 007 计算机基础小结 第二篇 Python解释器和集成环境 008 Python和Python解释器 009 Python解释器安装 010 Anaconada安装 011 Python解释器镜像源修改 012 执行Python程序的两种方式 013 Python的IDE之Pycharm的使用 014 Python的IDE之Jupyter的使用 015 pip的使用 第三篇 Python基础 017 变量 018 常量 019 Python变量内存管理 020 变量的三个特征 021 花式赋值 022 注释 023 数据类型基础 024 数字类型 025 字符串类型 026 列表类型 027 字典类型 028
  • 毕设学习过程 —— NIO、Netty
    1、NIO概述 什么是NIO NIO 被称为 New I/O ,相对于 Java 之前的 I/O 类库是新增(java 1.4) NIO 又被称为 Non blocking I/O 这是因为老的 I/O 类库是阻塞 I/O , New I/O 类库的目标就是要让 Java 支持非阻塞 I/O NIO 是同步 非阻塞 IO模型 NIO 的网络 IO 在 Linux 底层是通过 epoll 实现,在 Windows 的底层通过 IOCP 实现。【注:输入输出完成端口(Input/Output Completion Port,IOCP), 是支持多个同时发生的异步I/O操作的应用程序编程接口】 同步与阻塞 IO操作的两个对象和两个阶段 两个对象: 内核 Kernel 与用户进程 Process 两个阶段: 等待数据准备(Wait for data ready):read 等待数据到来,write 等待系统层的socket 写缓冲可用数据在内核拷贝和用户进程空间拷贝:read 从内核拷贝到用户进程,write 从用户进程拷贝到内核 NIO所谓非阻塞,是在第一个阶段 等待数据准备时,是非阻塞的。在需要维护大量的socket连接时(比如10w个),任意时刻只有少数socket是有数据(ready for read or write)的,这个时候的非阻塞能带来极大的性能提升。 NIO所谓的同步
  • 阿里钉钉、ICBU、CBU、蚂蚁、国际化中台Java后台面经
    前言 阿里提前批面了很多部门,除了淘系一面其他都过了,最终点了国际化中台的内推,在焦急等hr面中,分享面经,希望能帮到大家,都能拿到满意的offer~ 3.3阿里CBU一面 项目30分钟(流程+项目难点+部署) JVM类加载过程 主要类加载器有什么 双亲委派模型的好处 双亲委派模型怎么打破 什么软件/应用打破了双亲委派模型 常用设计模式介绍(代理模式、包装模式、工厂模式、适配器模式、责任链模式…) 包装模式在JDK中哪里应用了、责任链模式在哪里应用 工厂模式在Spring源码中哪里有应用 多线程在项目中的应用 定义线程池的方法 Callable和Runnable的区别 FutureTask介绍 BeanFactory和ApplicationContext区别 Bean的生命周期 Java中实现Map接口的有什么 遍历HashMap的几种方法 Java8中JVM运行时数据结构变化是什么(元空间取代了方法区) 为什么用元空间取代方法区 业界大数据新技术,比如Hadoop了解吗? Java中的包装类有什么用(Integer Long Double),为什么需要包装类 TCP的粘包?粘包怎么解决?UDP会粘包吗? TCP面向什么传输,UDP面向什么传输? RPC了解吗? 线程的声明周期? 迪杰斯特拉最短路径算法? 选择排序是稳定的吗,时间复杂度? 快排稳定吗,时间复杂度,什么时候性能最差?