1. OSI通讯7层协议
包括: 物理层, 数据链路层, 网络层, 传输层, 回话层, 表示层, 应用层, 平时我们一般的数据访问操作都是在应用层
1.1 物理层-电信号层
- 负责电脑通讯设备与网络媒体之间的互通,
- 通过硬件连接, 如网卡,电压,针脚等,
- 传递电信号(0,1,0,1)
1.2 数据链路层-帧,数据包层
1.3 网络层-IP层
-
决定路径的选择和转寄, 在不同位置的网络中的两个主机之提供连接和路径选择
-
定义IP协议, 通过网关+IP地址+MAC地址找到你要通讯的那一台电脑
1.4 传输层-TCP协议层
-
网络层通过IP帮我们区分子网,mac帮我们找到主机
-
电脑上开的应用程序很多, 我们要找到传输到哪个应用程序, 那么就要定义一个端口, 每个应用程序都有自己的端口
-
传输层就是建立端口到端口的通讯
-
端口范围: 0-65535, 其中0-1023为系统占用端口
1.5 会话层-寻址层
-
负责数据传输中设置和维护两台计算机的通讯连接
-
不可能每次通讯都要通过网络层寻址, 再通过传输层找到我们的程序, 回话层就是建立一个自动寻址功能
-
已弃用, 第七层HTTP,RPC,SDP,RTCP有相同的功能
1.6 表示层-数据协议层
1.7 应用层-应用程序层
- 用户使用的都是应用程序, 规定应用程序的数据格式, 传输层可以为很多程序传递数据, 必须有不同的协议规定数据格式, 这些协议就构成了应用层
- 常用协议: DNS(域名解析), FTP(文件传输), SMTP(邮件传送), SNMP(网络监控), HTTP(超文件传输)等
注意:
- 数据链路层的协议是对电信号分组使用的以太网协议
- 应用层的协议则是针对数据格式进行规定
2. TCP协议-传输层详解
2.1 应用读取数据
- 需要系统内核建立连接, 然后通过应用层协议进行读取数据
2.2 什么是TCP协议
2.3 TCP的三次握手
- 主机1想与主机2建立连接
- 第一次握手: 主机1发送SYN(建立连接的握手信号)到主机2
- 第二次握手: 主机2接受到信息返回一个SYN+ACK(确认字符)到主机1
- 第三次握手: 主机1接受数据返回ACK到主机2

2.4 TCP的四次挥手
- 主机1要与主机2断开连接
- 第一次挥手: 主机1发送fin到主机2, 表示我想要断开连接
- 第二次挥手: 主机2返回fin+ack到主机1, 表示我知道你想要断开
- 第三次挥手: 主机2返回fin到主机1, 告诉主机1我也想要断开
- 第四次挥手: 主机1接收信息, 返回ACK, 至此连接断开
- 其中在第二次挥手到第三次挥手过程中, 主机1要等待主机2的也想要断开的信息, 才能继续挥手

2.5 Socket
-
一个socket就是一个连接, socket都是唯一的
-
socket-套接字, 就是客户端的ip+port和服务端的ip+port, 一起组成一个socket
-
只要ip1:port1 - ip2:port 其中一个变化就是另一个socket
-
socket里面有ip-port对, 及资源数据
3. IO模型
3.1 BIO模型
- 同步阻塞IO模型, 服务器通讯实现为一个线程对应一个连接的方式, 客户端有连接, 那么服务器就要启动一个线程, 如果使用单线程, 那么必须到等上一个连接断开才可以继续使用
3.2 NIO模型
- 同步非阻塞IO模型,服务器实现一个线程处理多个连接
- 模式1: 服务器轮训accept所有端口,获取是否有事件发生
- 模式2: select poll 服务器将连接注册到多路复用器上,通过感知事件,进而处理连接,连接存储在服务器上, 每次要处理连接都要将注册的所有连接信息发送给内核
- 当有新的连接就在服务器上的selector上注册一下
- 每次要数据都将注册的所有连接发给内核, 内核判断那个连接数据 准备就绪,返回连接信息
- 通过内核返回的连接信息, 读取连接中的数据
- 模式3: epoll 服务器将连接注册到多路复用器上,通过感知事件,进而处理连接,连接存储在服务器和内核上, 每次通过调用epoll_wait获取连接是否有事件发生
- 调用epoll_create创建一个记事本在内核上
- 当有连接就调用epoll_ctl_add 将新的连接加入到记事本上
- 线程只需要调用epoll_wait就可以得知那个socket数据已经准备就绪, 返回连接信息
3.2.1 select poll模型

3.2.2 epoll模型

- 断开连接直接调用epoll_crtl del将内核记事本上的连接信息删除
3.3 AIO模型
- 异步非阻塞IO模型, 采用Proactor模式, 简化程序编写, 有效的请求才启动线程, 优点是当操作系统处理完才通知服务器端启动线程去处理