1.协议
1.1 网络的概念
在计算机网络中协议是个很重要的概念,是数据传输和数据解释的规则。
1.2 典型的协议有TCP/UDP、HTTP、FTP、IP、ARP。
2.分层模型
2.1 OSI 7层模型:物数网传会表应
物 - 物理层
数 - 数据链路层
网 - 网络层
传 - 传输层
会 - 会话层
表 - 表示层
应 - 应用层
2.2TCP/IP 4层模型:网络接口层,网络层,传输层,应用层
每层对应的协议:
数据链路层 — 以太网帧协议
网络层 — IP
传输层 — TCP/UDP
应用层 — FTP, HTTP, SSH…
协议的种类有很多,以上提到的协议是运用比较广泛的协议
3.tcp,udp传输层协议
3.1 tcp:面向连接的安全可靠的流式传输协议
tcp这里所说的安全可靠是指数据在传输时的完整,不会在传输时丢失。
tcp之所以安全可靠是因为在连接的时候要进行三次握手,发送数据的时候会进行数据确认,断开连接时会进行四次握手。正常情况下,数据在丢失后,会进行数据重传。
3.2 udp:面向无连接的不安全的报式传输
- 连接的时候不会握手
- 数据发送出去之后就不管了
- 如果数据包丢失就全丢,不存在丢失一半的情况
4.三次握手,四次挥手
标志位:
- SYN:请求建立连接
- ACK:应答
- FIN:断开连接
三次握手过程(建立连接):
第一次握手:
客户端携带标志位SYN,并随机产生一个32位序号,后面可以携带数据,可以为0
服务器端检测SYN的值是否为1,如果为1第一次握手成功
第二次握手:
服务器端携带ACK标志位和确认序号(随机序号+1),同时发起连接请求,携带SYN和32位随机序号
客户端检测SYN标志位是否为1,并检测确认序号是否正确,正确的话第二次握手成功
第三次握手:
客户端发送数据包携带ACK和确认序号(服务器的随机序号+1)
服务器端检测ACK端是否为1,并校验确认序号是否正确,正确的话第三次握手成功
四次挥手过程(断开连接):
断开连接哪一方都可以是主动断开
需要的标志位:FIN(编号为最后发送ACK的时候携带的确认序号)
下面假设是客户端主动断开连接
第一次挥手:
客户端发送断开连接的请求,携带FIN和编号,还有ACK和序号
服务器端检测FIN的值是否为1,ACK的作用告诉对方之前发的数据收到多少
第二次挥手:
服务器发送确认数据包,ACK和确认序号(FIN对应的序号+1)和数据大小
客户端检测ACK的值,并检测确认序号
第三次挥手:
服务器发送断开连接的请求,携带FIN+序号和ACK+序号
客户端进行数据监测,检测FIN,并校验确认序号
第四次挥手:
客户端发送ACK,服务器端进行数据监测
5.IO多路转接
什么事I/O多路转接技术:
- 先构建一张有关文件描述符的列表,将要监听的文件描述符添加到该表中
- 然后调用一个函数,监听该表中的文件描述符,知道这些描述符表中的一个进行I/O操作时,该函数才返回
- 该函数为阻塞函数
- 函数对文件描述符的检测操作是由内核完成的
- 在返回时,它告诉进程有多少(哪些)描述符要进行I/O操作
epoll函数简述:
三个函数:
- 生成一个epoll专用的文件描述符,生成一个树的根节点
int epoll_create(int size);
size:epoll上能关注的最大描述符数
- 用于控制某个epoll文件描述符时间,可以注册、修改、删除
int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event);
typedef union epoll_data {
void *ptr;
int fd;
uint32_t u32;
uint64_t u64;
} epoll_data_t;
struct epoll_event {
uint32_t events; /* Epoll events */
epoll_data_t data; /* User data variable */
};
events:
- EPOLLIN - 读
- EPOLLOUT - 写
- EPOLLERR - 异常
参数:
- epfd:epoll_create生成的epoll专用描述符
- op:
- EPOLL_CTL_ADD – 注册
- EPOLL_CTL_MOD – 修改
- EPOLL_CTL_DEL – 删除
- fd:关联的文件描述符
- event:告诉内核要监听什么事件
- 等待IO事件发生 - 可以设置阻塞的函数
int epoll_wait(
int epfd,
struct epoll_event *events, //数组
int maxevents,
int timeout
);
参数:
- epfd:要检测的句柄
- events:用于回传待处理事件的数组
- maxevents:告诉内核这个events的大小
- timeout:为超时时间
- -1:永久超时
- 0:立即返回
- 大于0:阻塞时间