《Linux系统编程手册》读书笔记

251 阅读30分钟

第56章 SOCKET简介

1. socket类型:流和数据包,对应TCP和UDP

2. 系统调用流程

socket、bind、listen、accept、connect

3. listen:一个已经调用过connect或accept的socket不能再调用listen

未决的socket连接:调用connect后,服务端的socket未accept,导致被阻塞

4. accept:直到对端connect,否则一直阻塞

关键:accept又会创建一个新socket (有别于socket调用返回的socket:监听socket和连接socket)

linkexin.github.io/notes/%E7%9…

第58章 SOCKET:TCP IP协议简介

1. 分层

2. 数据链路层

MTU

3. 网络层

无连接、不可靠(无序,可能丢,可能重复)

ip报,根据MTU分段,传输层要尽量避免分段的发生

4. 传输层

UDP:无连接不可靠,如何避免IP分段

TCP:连接建立、ack、重传、超时、seq、流量控制(防止打挂接收方)、拥塞控制(防止打挂网络)

第60章 SOCKET:服务器设计

1. 并发型

服务器主进程,创建子进程/线程服务于每个客户端请求

2. 实践:fork后,父子进程共享监听和连接socket,父进程要close连接socket,否则socket fd永远无法释放;子进程close监听socket

3. 子进程pool:父进程创建监听socket,然后有请求时从pool选一个子进程,子进程进行accept

4. 一个进程如何处理多个客户端请求?IO多路复用

第61章 SOCKET:高级主题

1. 流式(TCP)socket IO部分写和部分读问题(循环)

2. shutdown调用,半关闭。和close区别:shutdown会影响其他使用该socket的进程,shutdown不会关闭socket的df

最常用的是客户端关闭写端,让对端感知写入结束了

3. recv send调用

4. 零拷贝 sendfile

sendfile目前只能从文件向socket传,反之不行,两个socket间互传也不行

www.jianshu.com/p/fad3339e3…

5. 获取本端、对端socket信息

6. TCP协议深入理解

第63章 其他IO选型

1. IO多路复用(select, poll)、信号驱动、epoll 的核心涉及思路:同时检查多个文件描述符,看是否有文件描述符准备好。它们不会进行实际的IO操作,只是检查文件描述符是否就绪

2. 水平触发和边缘触发:

水平触发:任意时刻都可以检查文件描述符是否处于就绪状态,所以无需在文件描述符就绪后立刻进行IO操作

边缘触发:只有当I/O状态改变时,才触发事件,才可以检查文件描述符是否处于就绪状态

两种方式都应该结合非阻塞IO使用,因为文件描述符就绪状态可能在接受通知和执行IO中间发生变化,不适合用阻塞IO

3. IO多路复用

select系统调用:直到一个或多个文件描述符就绪返回,否则一直阻塞

poll系统调用:和select相似,只是api不同

判定文件描述符就绪的标准:调用IO函数不被阻塞即可认定,但不保证数据传输能否成功

当多个文件描述符分布不密集时,poll性能好于select,否则两者性能接近。当文件描述符数量过多时,性能都很差

4. 信号驱动IO

什么时候会触发信号发送

为什么性能好于select和poll:内核可以记住要检查的文件描述符

5. epoll