补补网络缺口

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的时间,那么服务端重新发送的第三次挥手,客户端就接受不到了

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
THE END
分享
二维码
< <上一篇
下一篇>>