Netty基础—3.基础网络协议二

大纲

1.网络基础的相关问题总结

2.七层模型和四层模型

3.物理层(网线 + 光缆 + 01电信号)

4.数据链路层(以太网协议 + 网卡mac地址)

5.网络层(IP协议 + 子网划分 + 路由器)

6.传输层(TCP和UDP协议 + Socket + 端口)

7.应用层(HTTP协议 + SMTP协议)

8.浏览器请求一个域名会发生什么

9.TCP三次握手建立连接的过程

10.如果TCP建立连接只握手两次

11.TCP断开连接的四次挥手

12.Socket编程和TCP/IP协议的关系

13.HTTP的工作原理

14.HTTPS的实现原理

15.全双工和半双工

16.Java进行IO读写的底层流程

17.同步和异步 + 阻塞和非阻塞

18.Linux的常用IO模型

19.IO多路复用技术

20.select、poll、epoll的区别

12.Socket编程和TCP/IP协议的关系

(1)Socket通信的原理

首先服务端会有一个ServerSocket无限等待客户端来进行连接。然后某个客户端如果要跟服务端连接,就需要在客户端本地创建一个Socket去连接服务端。接着建立连接后,服务端上的ServerSocket也会创建出一个Socket,这样就可以由客户端的Socket跟服务端的Socket进行通信。

其中连接的建立和释放,都是基于TCP三次握手和四次挥手来实现的。其中数据的传输是基于TCP协议的:封装TCP数据包 + TCP头(端口) -> 封装IP数据包 + IP头(IP地址) -> 封装以太网数据包 + 以太网头(mac地址)。

(2)Socket编程的核心方法

TCP服务端:socket() -> bind() -> listen() -> accept() -> read() -> write() -> close()。

TCP客户端:socket() -> connect() -> write() -> read() -> close()。

13.HTTP的工作原理

(1)请求报文和响应报文的结构

请求报文的结构:请求行(方法 + 地址 + 版本)、请求头、请求体。

响应报文的结构:响应行(版本 + 状态码 + 原因)、响应头、响应体。

(2)HTTP工作原理

经过TCP三次握手建立TCP连接后,会先将HTTP请求封装到应用层数据包,再封装到TCP数据包,再封装到IP数据包,最后封装到以太网数据包。

如果以太网数据包过大,那么会拆成几个包,然后通过以太网协议 + mac地址 + 交换机将数据包广播到网关(路由器)上。

以太网数据包来到网关后,又会经过多个网关进行转发,最后到达目标机器。接着通过一层层拆包获取到HTTP请求报文,交给应用程序进行处理。

最后目标机器会将HTTP响应按原路径返回给客户端,之后经过TCP四次挥手断开TCP连接。

(3)HTTP 1.0

默认是短连接,也就是底层的TCP连接是短连接。比如一个网页要向服务端发送30个请求,则要进行30次TCP连接的建立和释放。

(4)HTTP 1.1

默认是长连接,也就是底层的TCP连接是长连接。比如浏览器打开一个网页后,底层的TCP连接就保持着,不会马上断开。后续该网页发送的这30个请求就会共用一个TCP连接。

HTTP本身其实是没有所谓的长连接和短连接之说,HTTP是长连接还是短连接指的是,底层的TCP连接是长连接还是短连接。

HTTP服务一般用短连接,请求量大但每个请求不会频繁操作一般用短连接。数据库的连接一般用长连接,连接池一般使用的也都是长连接,而Dubbo://协议是基于长连接的。

14.HTTPS的实现原理

HTTPS的工作原理会在TCP连接3次握手的基础上附加一些信息。

步骤一:客户端把支持的加密规则发送给服务端。

步骤二:服务端从这套加密规则里选出一套加密算法和Hash算法,然后把自己的身份信息用证书的方式发给客户端,证书里会有服务端的地址、加密公钥、证书颁发机构。

步骤三:客户端收到消息后会验证证书的合法性,然后会生成一串随机数密码,并用证书里的公钥进行非对称加密,接着使用约定好的Hash算法生成握手消息的Hash值,然后用随机密码对消息进行对称加密,最后把加密数据、加密后的随机密码、Hash值发给服务端。

步骤四:服务端收到消息后会从中取出公钥加密后的随机密码,然后用本地的私钥对公钥加密后的随机密码进行解密取出随机密码。接着用随机密码解密客户端发来的握手消息,然后计算握手消息的Hash值并验证是否与客户端发过来的Hash值一致,最后用随机密码加密一段握手消息发给客户端。

步骤五:客户端拿到消息后,解密握手消息,然后计算消息的Hash值。如果计算的Hash值与服务端发来的Hash值一样,则握手结束。之后所有的数据都会由之前生成的随机密码,通过对称加密来加密。

**非对称加密:**加密的时候是用了一个公钥去加密,然后解密的时候是用私钥去解密。

**对称加密:**加密的时候用的算法,跟解密的时候用的算法是一样的。

常用的非对称加密算法是RSA算法,常用的对称加密算法是AES、RC4等,常用的Hash加密算法就是MD5。

15.全双工和半双工

全双工和半双工主要发生在交换机层面的。

如果是全双工,发送数据和接收数据可以同时进行。如果是半双工,同一时刻要么只能发送数据、要么只能接收数据。

使用半双工,需要先判断是否有数据正在接入,避免出现信号碰撞。使用全双工,不需要处理信号碰撞的问题,直接发送数据出去即可。

16.Java进行IO读写的底层流程

用户程序进行IO读写,基本上会用到系统调用read和write。系统调用read把数据从内核缓冲区(内核空间)复制到进程缓冲区(用户空间),系统调用write把数据从用户缓冲区(用户空间)复制到内核缓冲区(内核空间)。它们并不等价数据在内核缓冲区和磁盘之间的交换。

Java服务端处理网络请求的典型过程:

步骤一:接收客户端请求

Linux通过网卡,读取客户断的请求数据,将数据读取到内核缓冲区。

步骤二:获取请求数据

服务端从内核缓冲区读取数据到Java进程缓冲区。

步骤三:服务器端业务处理

Java服务端在自己的用户空间中处理客户端请求。

步骤四:服务器端返回数据

Java服务端已构建好的响应,从Java进程缓冲区写入内核缓冲区。

步骤五:发送数据给客户端

Linux内核通过网络IO ,将内核缓冲区中的数据,写入网卡。网卡通过底层的通讯协议,会将数据发送给目标客户端。

17.同步和异步 + 阻塞和非阻塞

同步和异步关注的是:是否亲自等消息、是否由其他线程告知自己。阻塞和非阻塞关注的是:当前事情还没做好时,是否还能做其他事情。

同步阻塞:事情没做好时,亲自等该事情做好的消息,且不做其他事情。

同步非阻塞:事情没做好时,会做其他事情,但会经常亲自等消息,轮询该事情是否做好。

异步阻塞:事情没做好时,不会做其他事情,但也不会亲自等消息,而是由其他线程告知。

异步非阻塞:事情没做好时,会做其他事情,也不会亲自等消息,而是由其他线程告知。

18.Linux的常用IO模型

一.阻塞IO模型

进程(用户线程)会在用户空间中执行recvfrom系统调用,recvfrom会一直等待直到数据已经从内核空间的内核缓冲区复制到用户空间的用户缓冲区或者发生错误时才返回。

所以进程(用户线程)从执行recvfrom系统调用开始,到recvfrom系统调用返回数据的这段时间内,都是阻塞的。

优点:程序简单,用户线程不会占用CPU资源。

缺点:一条线程维护一个连接,不适合高并发。

二.非阻塞IO模型

进程(用户线程)会在用户空间中执行recvfrom系统调用,如果用户空间的用户缓冲区没有数据,那么recvfrom就不要等了,而是直接返回一个错误,从而不阻塞进程(用户线程)。

但进程(用户线程)此后要不断轮询用户空间的用户缓冲区是否已经准备好数据,所以一般不推荐使用。

特点:进程(用户线程)要不断轮询recvfrom系统调用,看数据是否已经准备好,直到数据准备好已完成recvfrom系统调用为止。

优点:不会阻塞用户线程。

缺点:需要轮询系统调用,占用CPU资源。

三.IO复用模型

IO多路复用模型就是通过一种新的系统调用,让一个进程(用户线程)可以监视多个连接(文件描述符),一旦某个连接就绪(文件描述符可读可写),那么内核就会通知进程(用户线程)进行相应的IO系统调用。

IO复用模型:两次调用、两次返回,同步IO、阻塞IO。该模型中首先执行的不是recvfrom系统调用,而是select/epoll系统调用。

步骤一:执行select/epoll系统调用查询可以读的连接(就绪的文件描述符)

此时内核会查询所有可以查询的socket列表。当任何一个socket中的数据准备好了之后,select/epoll系统调用就会返回。所以当进程(用户线程)调用了select/epoll系统调用时,是会被阻塞的;

步骤二:进程(用户线程)获得了目标连接(准备好数据的socket)后,会发起recvfrom系统调用,此时进程(用户线程)也会被阻塞。此时数据会从内核缓冲区复制到用户缓冲区,recvfrom系统调用会将数据返回给进程(用户线程)。

select/poll是顺序扫描文件描述符fd是否就绪。epoll是用事件驱动代替顺序扫描,当文件描述符fd就绪时,立即进行回调。

优点:select/epoll可以同时处理成千上万个连接,不必每个连接创建一个线程。

缺点:select/epoll系统调用还是属于同步阻塞IO。

19.IO多路复用技术

IO多路复用技术通过把多个IO的阻塞复用到同一个select的阻塞上,从而使得系统在单线程的情况下可以同时处理多个客户端请求。

与传统的多线程/多进程模型相比:IO多路复用的最大优势是系统开销小,系统不需要创建新的额外进程或线程,也不需要维护这些线程和进程的运行,降低了系统维护的工作量,节省了系统资源。

20.select、poll、epoll的区别

区别一:

epoll支持一个进程打开的socket描述符fd的数量不受限制。select最大的缺陷是单个进程所打开的socket描述符fd的数量是有限制的,默认1024。epoll在1G内存的机器上可以打开10万左右的连接,内存越大,打开的连接越多。

区别二:

epoll的IO效率不会随着fd数目的增加而线性下降。select/poll每次调用都会线性扫描全部socket集合,导致效率线性下降。epoll是根据每个fd上面的回调函数实现的,只有活跃的socket才会主动调用回调函数。

区别三:

epoll使用mmap加速内核与用户空间的消息传递。为了能让内核把fd消息通知给用户空间,select和poll需要通过内存复制来实现。epoll则通过mmap让内核和用户空间共享一块内存来避免内存复制。

相关推荐
sakoba2 分钟前
Docker学习其二(容器卷,Docker网络,Compose)
运维·网络·学习·docker·容器·基础
惜.己2 小时前
appium中urllib3.exceptions.LocationValueError: No host specified. 的错误解决办法
网络·appium
吉凶以情迁2 小时前
window服务相关问题探索 go语言服务开发探索调试
linux·服务器·开发语言·网络·golang
专注VB编程开发20年2 小时前
UDP受限广播地址255.255.255.255的通信机制详解
网络·udp·智能路由器
189228048613 小时前
NX947NX955美光固态闪存NX962NX966
大数据·服务器·网络·人工智能·科技
Sadsvit4 小时前
Linux 进程管理与计划任务
linux·服务器·网络
一碗白开水一5 小时前
【模型细节】FPN经典网络模型 (Feature Pyramid Networks)详解及其变形优化
网络·人工智能·pytorch·深度学习·计算机视觉
什么都想学的阿超5 小时前
【网络与爬虫 38】Apify全栈指南:从0到1构建企业级自动化爬虫平台
网络·爬虫·自动化
D-海漠6 小时前
安全光幕Muting功能程序逻辑设计
服务器·网络·人工智能
都给我7 小时前
可计算存储(Computational Storage)与DPU(Data Processing Unit)的技术特点对比及实际应用场景分析
运维·服务器·网络·云计算