传输层协议-TCP总结

TCP的文章参考下面链接

  1. TCP连接的建立和终止
  2. TCP的数据交互
  3. TCP的keepalive
  4. TCP的超时和重传
  5. TCP的未来和性能

TCP创建连接的函数调用过程

每个进程都有一个 task_struct的数据结构,里面有一个指向文件描述符的数组
通过这个文件描述符,可以找到这个进程打开的socket句柄
通过fd可以找到socket的inode,这个inode跟文件系统不一样,是保存在内存中的
最后可以找到struct socket这个结构体
这个结构体关联了发送队列,接收队列

UDP程序的调用过程

处理多任务的方式

1.多进程方式

父进程得到socket句柄后通过fork创建子进程,子进程得到跟父进程一样的内存拷贝
子进程因为有同样的内存,fd也是一样的,所以可以去操作socket句柄,直接业务逻辑
下图父进程通过fork调用,转到内核态,然后访问中断向量表,找到对应的中断号
执行sys_fork,复制父进程的内存到子进程中

2.多线程方式

通过phread_create创建新线程
多个线程共享相同的fd,和其他数据结构

3.多路复用

多线程可以提高效率,但是也会出现链接太多的问题
多路复用select就是为了解决这个问题的
某个线程查看每个socket的fd,当有变化时就设置fd_set对应的位置为1,表示socket可读或者可写,从而转给业务线程去处理

4.事件通知方式
事件通知就是epoll模型,select的方式当文件描述符有变化时需要轮询遍历一遍,文件一多效率就低了,因而使用select受到FD_SETSIZE的限制
改成事件通知方法,就会好很多,这是通过注册callback函数完成的
epoll_create创建了一个epoll对象,epoll对象内部维护了一个红黑树,然后socket句柄会添加到这个红黑树中
当有事件发生后就会从红黑树中得到socket然后调用callback函数
epoll的这种方式使得监听的socket数据非常多,而且效率也不会下降
epoll也被称为解决C10K问题的利器

猜你喜欢

转载自blog.csdn.net/hixiaoxiaoniao/article/details/82707006