计算机自定向下笔记:https://gy23333.github.io/2020/03/16/%E3%80%8A%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C-%E8%87%AA%E9%A1%B6%E5%90%91%E4%B8%8B%E6%96%B9%E6%B3%95%E3%80%8B%E7%AC%94%E8%AE%B0/
1.TCP字节流服务和UDP数据报服务的区别
1)表现形式:通信双方是否执行相同次数的读、写操作;
2)具体区别:
字节流:
发送端应用程序执行多次写操作时,TCP模块先将这些数据放入TCP发送缓冲区中。当TCP模块真正开始发送时,发送缓冲区的数据被封装成一个或多个TCP报文段发出。因此,TCP模块发出的TCO报文段个数和应用程序执行的写操作次数没有固定的数量关系;
接收端类似,TCP模块将接受到的报文携带的应用程序数据按照TCP报文段序号依次放入接受缓存区,通知应用程序读取数据,应用程序依据用户指定的应用程序读缓存区大小,分一次或多次读取缓存区。因此,读操作次数和接受到的报文段也没有固定数量关系。
发送端执行的写操作次数和接收端执行的读操作次数没有任何数量关系,这就是字节流的概念:应用程序对数据的发送和接受没有边界限制。
UDP则不然,一次写操作,发送一个UDP数据报,接受端必须及时针对每一个UDP数据报执行读操作,否则丢包。
2.错误检查
错误检查方法:
1)用专门的包装函数代替原api
2)在每次函数调用下面加上一个assert()宏
比如:
ret=listen(sock,5);
assert(ret!=-1);
3.“同步”与“异步”
在I/O模型中,“同步”和“异步”区分的是内核向应用程序通知的是何种I/O事件(是就绪事件还是完成事件),以及该由谁来完成I/O读写(是应用程序还是内核),同步都是前者,异步都是后者。
在并发模式中,“同步”指的是程序完全按照代码序列的顺序执行;“异步”指的是程序的执行需要由系统事件来驱动。常见的系统事件包括中断、信号等。
4.阻塞与非阻塞
阻塞非阻塞: 请求不能立即得到应答,需要等待,那就是阻塞;否则可以理解为非阻塞。
6.I/O复用函数中可写意味着socket写缓冲区有足够空间可写入。
一般只有在write一次没有写完,写缓冲区不够时需要注册POLLOUT/EPOLLOUT,等待socket缓冲区中的数据被对方接收之后,写缓冲区就会有空闲空间可以继续write。
查看tcp缓冲区大小:
读缓冲区:/proc/sys/net/ipv4/tcp_rmem
该文件包含3个整数值,分别是:min,default,max
写缓冲区:/proc/sys/net/ipv4/tcp_wmem
该文件包含3个整数值,分别是:min,default,max
7.epoll的LT(电平触发)和ET(边沿触发)
LT支持阻塞或非阻塞文件描述符,E