网络编程和IO基础

OSI七层模型

应用层:ttp协议、电子文件传输、文件服务器等

表示层:解决我们不同系统之间语法的通讯

会话层:建立与应用程序之间的通讯

传输层:提供了端口号和接口协议TPC/UDP

网络层:为数据包选择路由器、交换机

定义了ip地址,可以根据ip地址找到对应的服务器

数据链路层:传输有地址的帧以及错误检测功能

物理层:以二进制形式,在物理机器上实现传输

TCPUDP协议

Socket

Socket(套接字)是两个程序之间通过双向信道进行数据交换的端,可以理解为接口。使用Socket编程也称为网络编程,Socket只是接口并不是网络通信协议。

TCPUDP区别

TCP是一种面向连接的、可靠的、基于字节流的传输层通信协议

TCP协议应用场景:HTTP、HTTPS、FTP协议

UDP是面向无连接通讯协议,udp通讯时不需要接受方确定,属于不可靠传输,可能会存在丢包的现象。

UDP协议应用场景:QQ语音、QQ视频

连接与短连接区别

短连接:每次请求完了之后都会关闭连接,如果频繁发送请求的情况下效率是非常低。

长连接:每次发送完请求之后,该请求不会立马断开,实现复用类似于线程池

Http协议1.0: 规定客户端与浏览器保持短暂的连接,服务器完成数据传输数据之后就会立马关闭连接,如果频繁的向服务器端发送请求的话,这时候是非常消耗服务器资源。

Http协议1.1: Http协议从1.1开始就支持长连接,会根据特定时间保持当前连接状态,不会立马关闭掉tcp连接; 

Http协议建立长连接之后,默认情况下300s为空闲状态情况下会主动断开连接;

BIONIOAIO 模型

1BIO(Blocking I O) 同步阻塞模型,一个线程对应一个客户端连接。

应用场景:

BIO 方式适用于连接数目比较小且固定的架构, 这种方式对服务器资源要求比较高, 但程序简单易理解。

 2NIO(Non Blockin g IO) 同步非阻塞,

服务器实现模式为一个线程可以处理多个请求(连接),客户端发送的连接请求都会注册到 多路复用器selector上,多路复用

器轮询到连接有IO请求就进行处理。

应用场景:

NIO方式适用于连接数目多且连接比较短(轻操作) 的架构, 比如聊天服务器, 弹幕系统, 服务器间通讯,编程比较复杂, JDK1.4 开始支持

 3AIO(NIO 2.0) 异步非阻塞,

由操作系统完成后回调通知服务端程序启动线程去处理, 一般适用于连接数较多且连接时间较长的应用。是在NIO的基础上进一步封装的。

应用场景:

AIO方式适用于连接数目多且连接比较长(重操作) 的架构,JDK7 开始支持

 

同步和异步的区别

同步也就是程序从上往下实现执行; 单线程

异步从新开启一个新分支,相互不会影响;多线程

站在Http协议上分析同步与异步区别:

我们的Http协议请求默认情况下同步形式调用,如果调用过程非常耗时的情况下客服端等待时间就非常长这种形式我们可以理解阻塞式;

解决办法:耗时的代码我们可以使用多线程或者MQ实现处理,但是不能立马获取结果客服端可以主动查询

 

同步与异步描述的是被调用者的。

譬如A调用B。

如果是同步,B在接到A的调用后,会立即执行要做的事。A的本次调用可以得到结果。

如果是异步,B在接到A的调用后,不保证会立即执行要做的事,但是保证会去做,B在做好了之后会通知A。A的本次调用得不到结果,但是B执行完会通知A。

阻塞与非阻塞描述的是调用者的。

如果是阻塞,A在发出调用后,要-直等待,等着B返回结果。
如果是非阻塞, A在发出调用后,不需要等待,可以去做自己的事情。
同步不-定阻塞,异步也不一定非阻塞。没有必然关系。


举个简单的例子,老张烧水: 
1.老张把水壶放到火上, - -直在水壶旁等着水开。(同步阻塞 )
2.老张把水壶放到火上,去客厅看电视,时不时去厨房看看水开没有。(同步非阻塞 )
3.张把响水壶放到火上,- 直在水壶旁等着水开。(异步阻塞)
4.老张把响水壶放到火上,去客厅看电视,水壶响之前不再去看它了,响了再去拿壶。(异步非阻塞 )
1和2的区别是,调用方在得到返回之前所做的事情不一样。
1和3的区别是,被调用方对于烧水的处理不-样。

 

选择器IO多路复用底层原理

 IO多路复用  一个线程Thread使用选择器Selector通过轮询的方式去监听多个通道Channel上的事件,从而让一个线程可以处理多个事件。

 

I/O多路复用底层一般用的Linux APIselectpollepoll)来实现

 

1.使用select的情况下,底层采用该数组方式存放  每次调用遍历的时间复杂度就是为O(n),有可能会产生空轮训,比如 保存1千个连接,最终只有10个连接有传输数据。

2.使用poll底层采用链表结构存放,每次调用遍历的时间复杂度就是为O(n)

 Poll与select之间区别不是很大;select监视器单个进程可监视的fd数量被限制

可以通过>cat /proc/sys/fs/file-max, poll 是没有监视的fd数量限制。

 Linux服务器中创建Socket服务器端  单个select进程可监事的fd(连接数据)限制

3.epoll采用事件通知回调方式,避免空轮休时间复杂度为o(1);

 

accept()与read()的区别

accept()需要建立三次握手,否则阻塞

read()建立完三次握手,需要发送消息,否则阻塞

大致流程图

 

 

posted @   彷佛昨天  阅读(22)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示