当前位置:网站首页>补补网络缺口
补补网络缺口
2022-04-23 06:07:00 【独饮敌敌畏丶】
1.什么是零拷贝
零拷贝,不是不需要拷贝,而是尽可能地减少不必要的拷贝,以节省CPU的资源,减少因上下文切换而造成的资源浪费
上下文切换:比如用户在占着CPU,然后此时操作系统要用,那么就要把用户挪开,把操作系统放上去。也就是把上一个进程的东西挪走,下一个进程的东西挪进来。这就是一次上下文切换
重点:Linux用到的零拷贝
①传统的数据传送
buffer = File.read
Socket.send(buffer)
此时会经过4次拷贝,4次上下文切换。
先来看四次拷贝
再来看四次上下文切换
②MMAP内存映射
将磁盘上的数据,直接和应用进程缓冲区进行一个映射。省掉了文件缓冲区这一步
发生了3次拷贝,4次上下文切换
③Linux2.1里面,提出了sendfile(从这开始就已经提供了零拷贝)
3或者2次拷贝,2次上下文切换
如果硬件支持,可以是2次拷贝。就是中间的CPU拷贝都不需要了。直接传文件读取缓冲区的起始地址和长度,右边的DMA拷贝直接拷贝文件读取缓冲区的。
④Linux之slice
2次拷贝,2次上下文切换
PIPE是管道,本质上来讲就是两个缓冲区共用了同一块物理内存。
2.网络传输时,直接内存比堆内存快在哪?
进行网络通信的时候,尽量用直接内存。原因?
①每个TCP的Socket的操作系统内核中,都有一个发送缓冲区和一个接收缓冲区。任何语言都是这样,如图
应用进程将需要发送的数据发送到套接字发送缓冲区,然后再发送出去
②如果将应用进程缓冲区设置在堆
那么发送数据时,会先将数据发送到直接内存中的缓冲区,然后再发送到socket缓冲区。
如果本来就设置在直接内存,就避免了第一次拷贝,也就是避免了二次拷贝。
为什么非得先拷贝到直接内存呢?
因为堆中有垃圾回收机制,如果从堆中,直接发送到socket,那么此时如果发生了GC,相应的内存地址,就会发生变化。只有发生Full GC的时候,才会顺便回收下直接内存。所以在直接内存中,更有保障
3.TCP拆包/粘包
拆包,就是一分多,粘包,就是多合一
我的理解,拆包就是,不能一次性发送很多数据,需要把整个数据拆分成多个。粘包,就是一次发的数据量太少了,把多个数据量少的包,粘在一起,就是粘包。
如何解决TCP的粘包拆包特性?
①消息弄成定长的
②或者消息头包括消息的长度
③使用特殊的分隔符(比如ftp协议,对不同的消息,使用回车换行符,来区分不同的消息)
4.UDP用在哪
①需要多播的,TCP只能单播
②丢包不影响正常使用的软件
UDP实现的软件,不想让他丢包,怎么办?
上层应用自己来实现可靠性传输。如UDT。据说HTTP3会用UDT来实现
5.DDOS攻击是啥
DDOS就是利用合理的服务请求,去占用非常多的服务资源,使得正常的用户无法得到响应。
常见的DDOS有:计算机网络带宽攻击和连通性攻击
前者的意思就是以极大的通信量去冲击网络,使所有可用的网络资源消耗殆尽,使得合法的用户的请求无法得到响应
后者的意思是大量的连接请求去冲击服务器,使得所有可用的资源被消耗殆尽
SYN洪水攻击就是连通性攻击,利用了TCP协议的缺陷,发送了大量的半连接请求,耗费资源
6.socket是啥
TCP用主机的IP地址加上主机上的端口号作为TCP连接的端点,这种端点就叫做套接字socket。
操作系统把底层的所有与网络通信相关的细节都隐藏起来了,用socket来进行操作,它是一个门面模式,调用connect方法就连接了,内部的细节不用管。
可以理解为它把传输层,及以下的协议,全都封装起来了。从应用层视角往下层看,就是socket
7.一次完整的http请求的过程
http1.0,在客户端渲染完了之后,就关闭TCP连接了(短连接)
而1.1就有个keep_alive,先保留一会这个连接,类似于长连接
2.0就有个多路复用,服务端推送和请求头压缩
DNS劫持,意思就是把DNS解析来的ip地址,换成一个错误的ip地址,有可能是钓鱼网站的ip地址
HTTP劫持,意思就是劫持http请求报文或者响应报文。解决办法:用https
8.TCP UDP区别
TCP面向连接,有三次握手和四次挥手,UDP没有连接,所以也可用于广播
TCP有可靠性,具体为超时重传(根据往返时延来计算等多久需要重传)和应答确认
TCP有数据排序,即在对端,各个组结合的时候,如何根据编号排序
TCP有流量控制(滑动窗口)和拥塞控制
TCP是全双工,udp应该也是,但是udp偏向单工
洪泛攻击就是有很多客户端,客户端第一次发送的报文,源ip地址是假的,所以服务器发送了确认报文之后,就一直得不到回应,就一直等待,浪费着资源。如SYN洪水攻击
9.关于TCP的四次挥手
四次挥手全过程(这个图,四次挥手这里有错误,需要把返回的seq改成ack)
为什么需要四次挥手?
因为TCP是全双工的,客户端发送给服务端FIN的时候,说明客户端不往服务端发数据了,但是服务端可以往客户端发数据,客户端还可以接收数据。只有两边都单独发送了FIN的时候,才能确保连接需要断开了。
注意:四次挥手,在实际情况中,不一定非得是四次,中间两步,有可能合并
为什么需要TIME_WAINTING状态?
①处于TIME_WAINTING状态时,不允许应用立即释放端口,等TIME_WAINTING的时间,服务器一般会把数据全部传完,此时再释放
②如果客户端发送的分手确认信号,即第四次挥手,丢失了,那么服务端会再次发送,如果不等TIME_WAINTING的时间,那么服务端重新发送的第三次挥手,客户端就接受不到了
版权声明
本文为[独饮敌敌畏丶]所创,转载请带上原文链接,感谢
https://blog.csdn.net/afdafvdaa/article/details/121232921
边栏推荐
- 基于ECS搭建云上博客(体验有礼)
- 一个DG环境的ORA-16047: DGID mismatch between destination setting and target database问题排查及监听VNCR特性
- Alertmanager重复/缺失告警现象探究及两个关键参数group_wait和group_interval的释义
- oracle分区的相关操作
- RAC环境报错ORA-00239: timeout waiting for control file enqueue排查
- Introduction to RDMA network
- Exception record-8
- Apache SeaTunnel 2.1.0部署及踩坑
- Oracle Job定时任务的使用详解
- Explore how @ modelandview can forward data and pages through the source code
猜你喜欢
Ali vector library Icon tutorial (online, download)
Prometheus Cortex架构概述(水平可扩展、高可用、多租户、长期存储)
PG SQL截取字符串到指定字符位置
冬季实战营 动手实战-MySQL数据库快速部署实践 领鼠标 云小宝
Chaos takes you to the chaos project quickly
阿里云日志服务sls的典型应用场景
Winter combat camp hands-on combat - first understand the cloud foundation, hands-on practice ECS ECS ECS novice on the road to get the mouse cloud Xiaobao backpack shadowless
Chaos帶你快速上手混沌工程
Implementation of multi tenant read and write in Prometheus cortex
双指针仪表盘读数(一)
随机推荐
select命令产生redo日志问题的分析
"Write multi tenant" implementation of Prometheus and thanos receiver
通过rownum来进行区间查询
When switch case, concatenate the error case and if of the conventional judgment expression and use L
Comparison between Prometheus thanos and cortex components
Prometheus monitoring method and index interpretation of influxdb
oracle对表字段的修改
JS function package foreach use return can not jump out of the outer function
双指针仪表盘读数(一)
oracle给对象重命名
关于我
Thanos compact component test summary (processing historical data)
Problems related to Prometheus cortex using block storage
实践使用PolarDB和ECS搭建门户网站
ARGB透明度换算
一个DG环境的ORA-16047: DGID mismatch between destination setting and target database问题排查及监听VNCR特性
oracle表的约束详解
常用于融合去重的窗口函数row_number
Dolphinscheduler源码包src.tar.gz解压问题
oracle杀死正在执行的sql