09_网络
2024-05-23 22:04:02 0 举报
网络核心基础分析,TCP/IP模型,BIO,NIO,AIO,单工,双工
作者其他创作
大纲/内容
随机密码加密
释放资源
N
获取底层基于TCP的原生ServerSocket
卡住1分钟
HTTP 2.0
建立一次连接默认是长连接同一时间同一个域名的请求限制
创建和client对应的channel即可
数据链路层
为什么TCP不能是2次握手?4次握手?
GoogleWEB应用服Tomcat,Nginx
如果有数据
文件a 地址
HTTP包
channel
局域网内电脑
IP包
文件a
写操作
这次广播发现目标IP地址和路由器C在一个子网下面
HTTP 1.1
拿到所有SelectionKey
写缓存
操作系统
Buffer
FIN-WAIT-2释放连接
是否有数据?
创建工作线程(处理完任务后销毁)
Client
以太网标头
用户态
电脑
再次 第一次握手
建立连接,完成业务
组装
SelectorImpl selector
返回域名对应的IP地址
ack = y + 1,ACK = 1,seq = x + 1
CLOSE
异步发buffer让操作系统读取channel中的数据
TCP包
一个client要在server端维护一个线程,代价巨大,撑爆服务器
发送
以太网标头MAC地址
内核态
网卡MAC
接收
异步刷盘
开辟资源
监控线程监听各channel有没有数据发过来
单工、半双工、双工
开辟资源一直占有无法释放
FIN-WAIT-1
1 阻塞读
1、进程打开socket文件描述符数量不受限制,仅仅受限于系统文件句柄数限制2、不会随着DF数量增加而性能线性下降。epoll只会对活跃的socket进行操作,只会遍历内核IO异步唤醒而加入ready队列的DF集合3、使用mmap加速内核和用户空间消息传递,内核和用户空间mmap映射同一块内存实现。
服务端 第3次要主动发送断开报文
1 先读取文件
物理层
2 读取
HTTP 1.0 、1.1 、2.0区别
磁盘文件
交换机(工作在以太网层)
Server side
传输层(TCP协议)端口
返回同样的数据包,响应请求
4 写入
IO线程
输入 www.google.com
SYN_RECV
终端
1、消息( 随机密码【对称加密AES】)2、握手消息的hash值3、随机密码(公钥加密)
传输内容:数据包
阻塞selector.select();不断获取channel最新消息
后面的重试握手都成功后,这里才刚刚请求到服务器
TCP三次握手建立连接
Google
指定ip和监听的端口
证书(网站地址,加密公钥,颁发机构)
selector.register()创建SelectionKey
建立连接,无效的,闲置
1 mmap映射
网络层(IP协议)
多路复用,并发加载
PS:如果以太网包被拆成多个,这里就会按序号将数据包还原,最后传输给程序
server
应用层(HTTP协议)报文规范
应用层 HTTP协议
FIN=1,ack=u+1,seq=w
cached线程池
网卡MAC地址
网络层 IP协议
不是完全针对网络模型去说的,而是针对磁盘读写。同步阻塞:BIO的工作线程要hang住进行io操作。同步非阻塞:NIO的FileChannel发起IO操作后,可以去做别的事情,但是需要时不时的看看io处理结果。异步非阻塞:通过aio的api接口发起文件读写操作,底层就交给操作系统了,等文件读完后,会回调
DNS服务器8.8.8.8
Y
HTTP 1.0
3 拷贝
1
AbstractSelectableChannelregister()
如果有三次握手,客户端会发送复位报文,让服务端撤销开辟的资源
SocketServer
验证证书合法性,出现一把小锁
TCP报文头:SYN=1、ACK=0、seq = x
第二次握手
IP包:IP地址
HTTP数据
上锁
1、随机密码解密2、比较hash值防止篡改
read()
2 读数据
网关(工作在IP层)路由器A
同时放入keys中
进程
在以路由器代表的子网中进行传输接力数据包在传输过程中一次一次被【拆包】,通过拿子网掩码和IP地址做【与运算】确定是否和目标IP在同一个子网,如果不是就,继续传输接力,广播到子网的下一个交换机。
传输层 TCP协议
key.isAcceptable()如果是非阻塞的channel,并且没有客户端去建立连接的时候,这里返回null
BIO
2
6 拷贝
write()
创建ServerSocketChannel
HTTP包头
传入下层
虚拟内存 os cache
SelectionKey[] keys
注册
单工:电视、广播
表示层功能:数据的编码、翻译、压缩、解压缩、加密、解密,将数据翻译为相对应的编码格式,然后展现到应用程序
FIN=1,seq=u
读操作
HTTPS加密通信原理
1、用私钥解密,获取随机密码2、用随机密码解密握手消息3、摘要算法处理消息并比较hash值,检查是否被篡改
线程
NIO selector/poll 和epoll原理
获取数据
2 直接写文件
建立无数连接,断开无数次默认是短连接
读取完后回调
浏览器把自己支持的加密规则发送给网站
第一次握手
以太网标头:MAC地址
修改selector监听的操作,告诉selector要监听这个channel的什么操作
Server低效
key.isReadable()
3 拷贝数据到os cache(临近的数据块也一同拷贝进去)
会话层功能:建立、维护、终止会话
创建Buffer
用户态
对应的操作
建立连接 成功
数据链路层 以太网协议
网站选择一套加密算法(rsa)和hash(md5)算法
Server累死
创建一堆线程
数据 大量传输
底层肯定是基于操作系统级别的库什么的来实现一个select机制,就是可以实现多路复用的效果,一个selector监听N多个channel对应的Socket接受到的请求
子网内ARP请求,各终端互相获取MAC和IP的映射关系,这样在封装以太网包时,才能将MAC地址写入
ACK=1,ack=u+1,seq=v
ack = x + 1,SYN=1,ACK = 1,seq = y
连接方式:光纤、网线传输内容:01010101电信信号
应用层主要是规范报文,说明请求格式,响应格式,请求体等
获取channel
打开TCP包,获取端口,找到服务器在此端口上监听的程序完成业务,原路返回响应。
我的电脑
读取/写入数据
5 拷贝
返回 selectionKey
返回数据
PS:一个以太网包最多1500个字节,如果超过,就拆成N个包发送
打开Selector
将处理后的数据放入buffer交给操作系统写回channel
服务端
物理层硬件
TCP/IP 四层模型
selector
开启一个NIO ServerSocket
双工:现代网卡
key.isWritable()
TCP包:端口
selector.selectedKeys().iterator()
写入数据
同时只允许一种
Server
每个线程和client一对一
异步刷磁盘
SOCKET工作原理
握手成功后所有的数据都会由之前浏览器生成的随机密码,然后用对称加密来进行进行加密
当有数据请求时,才去创建工作线程,节省服务器开支
普通写操作缺点:4次拷贝
socket
路由器C
底层操作系统select机制实现
握手消息hash值
收到SYN=1返回确认报文
服务器
感兴趣的操作
ACK=1,ack=w+1,seq=u+1
CLOSE-WAIT
NIO
半双工:对讲机
NIO socket原理
Server高效
高速缓存
Browser
建立一次连接默认是长连接同一时间同域名 并发请求
ARP缓存
LAST-ACK
SYN_SENT
1、当有数据请求时,才去创建工作线程,节省服务器开支2、对于IO读写,全部交给操作系统,工作线程只处理业务,进一步提高性能
开辟资源后,客户端不知道,因为已经在重试中建立了连接,处理完任务,造成资源一直占有。4次连接没有必要,浪费资源
程序层层解包,获取HTTP报文
socket是传输层的一个编程规范,就是在传输层里把tcp/ip协议给封装了一下,我们程序员一般都是面向socket来编程的,比如java原生就支持socket网络编程
selector是否存在?keys[i].selector() == sel
TCP断开连接4次挥手
路由器B
mmap + os cache写操作优点:写:0拷贝,读:1次拷贝
子网广播:发送一个以太网包
找到MAC对应的终端
返回SelectionKey
AIO
TIME-WAIT
0 条评论
回复 删除
下一页