1.OSI模型与TCP/IP协议体系结构
1.1OSI模型
1.1.1
高层
应用层:文件传输,电子邮件,文件服务,虚拟终端
表示层:数据格式化,代码转换,数据加密
会话层:解除或建立与别的节点的联系
底层
传输层:提供端对端的接口
网络层:为数据包选择路由
数据链路层:传输有地址的帧以及错误检测功能
物理层:以二进制数据形式在物理媒体上传输数据
1.2TCP/IP协议体系结构
应用层 传输层 网络层 网络接口和物理层
2.TCP和UDP协议
2.1TCP
有连接:正式数据传输之前确保双方都能够收和发
三次握手:
第一次握手:客户端给服务器发送连接请求(客户端能发)
第二次握手:服务器给客户端应答同时给客户端发送连接请求(服务器能收,服务器能发)
第三次握手:客户端给服务器应答(客户端能收)
四次挥手:
第一次挥手:客户端向服务器发送断开连接请求(客户端不发了)
第二次挥手:服务器应答(服务器不收了)
第三次挥手:服务器向客户端发送断开连接请求(服务器不发了)
第四次挥手:客户端应答(客户端不收了)
可靠:即数据无误、数据无丢失、数据无失序、数据无重复到达的通信
2.2UDP
无连接:直接传输数据,不管是否能收和发
不保证可靠:有可能会丢失、会出错、会失序或者重复到达
3预备知识
3.1套接字
Socket是一个连接应用层和传输层(用户空间和内核空间)的网络编程的接口,在linux中,也是一个特殊的文件,通过文件IO进行访问,位于应用层和传输层之间,有三种类型:
流式套接字(SOCK_STREAM) TCP
数据报套接字(SOCK_DGRAM) UDP
原始套接字(SOCK_RAW)
3.2 IP
同一个网络内区分不同的主机
IP地址的转换:
inet_aton() inet_addr() inet_ntoa()
3.3端口号
端口号:同一个主机区分不同的网络相关的进程
3.4字节序
大端序:高地址存放低字节,低地址存放高字节(大小端由cpu决定)
网络字节序:大端
小端序:高地址存放高字节,低地址存放低字节
4.TCP服务器与客户端
1)创建套接字 socket
2)绑定ip地址和端口号 bind
3)创建监听队列 listen
4)等待并建立连接 accept
5)通信 read/write recv/send
6)关闭套件字 close
TCP客户端流程
1)创建套接字 socket
2)绑定ip地址和端口号 bind
3)按照服务器的ip地址和端口号连接服务器 connect
4)通信 recv,send
5)关闭套接字 close
5.UDP客户端和服务器的实现
Udp:无连接(也就是说只要创建好了套接字绑定了地址信息之后就可以收发消息了)
服务器:
创建套接字
绑定地址信息
接收消息 recvfrom
关闭套接字
客户端:
创建套接字
发消息 sendto
关闭套接字
6.IO模型(IO多路复用)
复用:一个东西,多种功能,不同时候,使用其中某一个功能
IO多路复用:一个进程可以处理多路IO,多路IO互不干扰
IO多路复用的基本思想:
先构造一张有关文件描述符(一切皆文件,IO操作就是文件操作)的表,然后调用一个函数(检查有无IO准备好,如果准备好对应的位保持不变,否则清0)。当这些文件描述符中的一个或多个已准备好进行I/O时函数才返回。
函数返回时告诉进程那个描述符已就绪,可以进行I/O操作
详细实现过程:
1)创建文件描述符的表 fd_set fds;
2)将表清空 FD_ZERO(&fds);
3)将要被这个进程处理的IO的文件描述符加入表中(对应的位置1)
FD_SET(0,&fds); FD_SET(3, &fds); FD_SET(5, &fds);
4)将这个表交给select函数判断有无文件描述符准备就绪,如果没有,就阻塞,如果有就返回,并将没有准备就绪的位置0
ret = select(6 ,&fds, NULL,NULL, NULL);
int select(int n, fd_set *read_fds, fd_set *write_fds, fd_set *except_fds, struct timeval *timeout);
功能:t函数判断有无文件描述符准备就绪,如果没有,就阻塞,如果有就返回,并将没有准备就绪的位置0
参数:n 要遍历的次数,传的是最大的文件描述符+1
read_fds 要判断的需要读操作的文件描述符的表
write_fds 要判断的需要写操作的文件描述符的表
except_fds 要判断的有无异常的文件描述符的表
Timeout:NULL 表示阻塞
返回值:失败 -1
成功 准备就绪的文件描述符的个数
5)判断描述符的表哪些位现在是1
7.并发型服务器
TCP循环服务器:循环服务器在同一个时刻只能响应一个客户端的请求,不使用
Udp可以使用循环服务器
Tcp并发服务器:并发服务器在同一个时刻可以响应多个客户端的请求
客户端请求:连接(服务器listenFd)、数据传输(服务器connFd) 客户端
connFd 客户端
connFd 客户端
并发服务器模型:
1)多进程并发服务器
基本思想:建立连接和通信要分开分别使用不同的进程完成,父进程等待客户端来连接(使用的是listenFd),只要有客户端连接成功(就会产生一个新的connFd)就创建子进程用来和客户端进行通信,不同的子进程使用的是不同的connFd。
回收子进程:
子进程状态发生改变时,内核会给父进程发送SIGCHLD信号
进程的状态:运行态、等待态、停止态、僵尸态
2)多线程并发服务器
基本思想:建立连接和通信要分开分别使用不同的线程完成,父进程等待客户端来连接(使用的是listenFd),只要有客户端连接成功(就会产生一个新的connFd)就创建子线程用来和客户端进行通信,不同的子进程使用的是不同的connFd。
3)IO多路复用并发服务器
基本思想:只有一个进程,可以处理多路IO,先将listenFd加入文件描述符的表,然后将这个表交给select,只要有客户端来连接就返回,在listenFd的这个分支调用accept,就会产生新的connFd,加入文件描述符的表,又回到select这里,继续判断,此时不管是有新的客户端连接或者是有已经建立连接的客户端发消息,select都会返回,然后进入到不同IO操作的分支去处理这路IO。