网络IO的基础知识

本期笔记大纲

1 TCP 的服务器和客户端的函数调用

2 UDP如何实现服务器的并发

3 socket 的解释

4 sigio的具体实现

5 select poll 和epoll的具体原理

目录

1 TCP 的服务器和客户端的函数调用

TCP服务器的函数调用

TCP客户端的函数调用

2UDP如何实现服务器并发

3 socket的解释

4  sigio的具体实现

     1 进程的信号集合是如何保存的

     2 当我们调用signal这个函数的时候如何将对应的信号保存在新进程中

     3  这个信号如何发送

4 select &poll&epoll的具体原理


1 TCP 的服务器和客户端的函数调用

TCP服务器的函数调用

fd = socket();

bind(ip);

fd = listen();

clientfd = accept();

recv()&&send();

close();

TCP客户端的函数调用

fd = socket();

bind();

connect();

send&&recv

close();

(1)

tcp的三次握手在哪个函数阶段完成的

server:listen之后 accept之前

client: connect

2UDP如何实现服务器并发

1 数据包上面再加一层协议

注:此方法并不可取。使用此方法的情况必须得满足先发的先到后发的后到,但是当我们的网络通信一旦要通过路由器的时候我们人为就无法保证的先发的先到后发的后到。所以在服务器上实现的时候就可能会有收到的数据会乱。

2 模拟TCP的三次握手的方式

首先客户端会给服务端发送数据,服务端 给这个客户端单独分配一个fd,然后再用这个fd发送数据返回给客户端,那么就实现了一个客户端对应一个fd。那么就不会造成服务器收到的数据乱的情况。

3 socket的解释

socket起源于Unix,而Unix/Linux基本哲学之一就是“一切皆文件”,都可以用“打开open –> 读写write/read –> 关闭close”模式来操作。

socket现在已经演化为一种通信规范。计算之间的通信,甚至进程间的通信都可以使用这种编程规范。不同的地方实现该规范的方式不同:

1. Unix中实现进程间通信socket

使用文件系统传输介质,按照socket的方式读写文件,完成进程间的数据通信

2. 通信协议的抽象层socket

Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。
在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,一组简单的接口就是全部,让Socket去组织数据,以符合指定的协议。

网络IO的基础知识

 Socket已经成为一种通信接口,通信模型,通信规范,所有涉及到通信的场合,都可以采用该模型。后来出现的webSocket同样是使用了Socket模型。

Socket

数字

文件

文件描述符

fd

英文意思是插座

fd是插     五元组(原ip 原port 目的ip 目的port 协议)为座。

可以当作一个文件描述符来理解。也可以当作一个客户端。

4  sigio的具体实现

     1 进程的信号集合是如何保存的

        sigaction--->action[64]  用数组的方式存储。

        当某一个signal的信号被触发后,调用action[signo]对应的sigal信号回调函数。

     task_struct--->sighand_struct---->k_sigaction   action[64]

        再由重复的sigal会覆盖前一个相同的信号

     2 当我们调用signal这个函数的时候如何将对应的信号保存在新进程中

      signal --->syscall_define2--->do_sigaction{

        k = &p->sighand->action[sig-1];        

        }

        将对应的signal保存到action[64]这个数组当中

     3  这个信号如何发送

   kill(PID,sigio)--------->signalfd_notify()激活对应的进程的某个信号的条件等待,当调用signal这个系统函数的时候,将对应的signal保存按照action[sig-1].然后这个信号进入条件等待当中。当kill发送该信号的时候,触发该信号的条件等待,然后就条用相应的回调函数。

4 select &poll&epoll的具体原理

具体现实生活的例子。

一个餐馆有很多个服务员,当有很多个客户来的时候,一个桌子对应一个服务员,一个大堂经理就会拿三个本子挨个询问桌子的服务员哪个桌子需要点酒,哪个桌子需要点菜,哪个桌子需要结账。

select(酒店的服务员的数量,点菜的集合,点酒的集合,结账的集合,多长时间一次);

点菜的集合:可读的fd集合   

点酒的集合:可写的fd集合

结账的fd集合:出错的fd集合

seletc(ionum,rfds,wfds,wfds,timeout);

专门询问的大堂经理就是这个select,这个需要select根据这个timeout进行轮询。效率不是很高。

poll和上面的select的唯一区别就是只会拿到一个小本子记录点菜的,点酒的,和结账的。比select差不多。

epoll实现;

epoll通过信号的方式将所epoll对应的红黑树上面的(可读,可写,出错)的fd单独拿出来存放在一个集合当中,然后依次遍历取出数据进行业务处理。效率比selet 和 poll效率要高(在客户端多达到一定的数量的情况下)。


        

上一篇:十九、客户端多线程分组模拟高频并发数据


下一篇:阿里云语音服务