UNP学习笔记(1)

这几天开始阅读UNP《UNIX 网络编程》这本书,书中作了一些笔记,摘录到BLOG上方便查阅,可结合《TCP/IP详解》以及《TCP/IP高效编程》来复习。

第一章 简介

1、P11:线程函数遇到错误时并不设置Unix的errno变量,而是把errno的值作为函数返回值返回函数者。这意味着每次调用pthread_开头的某个函数时,必须分配一个变量来存放函数的返回值。

2、P12:errno的值只在函数发生错误时设置。如果函数不返回错误,errno的值就没有定义。

3、P13:listen的调用的第二个参数:指定系统内核允许在监听描述符上排队的最大客户连接数,即在accept返回前最大的排队客户数。

4、P21:找出本地网络中众多主机的IP地址的方法之一是:针对ifconfig中找到的本地接口的广播地址执行ping命令。

第二章 传输层:TCP、UDP和SCTP

1、P34:当一个Unix进程无论自愿地(调用exit或从main函数返回)还是非自愿地(收到一个终止本进程的信号)终止时,所有打开的描述符都被关闭,这也导致仍然打开的任何TCP连接上也发生一个FIN。

2、P36:捎带ACK的发生时机:通常在服务器处理请求并生产应答的时间少于200ms时发生。

3、P37:TIME_WAIT状态存在的两个理由:可靠地实现TCP全双工连接的终止(最后一个ACK丢失,对端需要重传FIN);允许老的重复分节在网络中消逝。

4、P37:TIME_WAIT时间:2MSL

5、P46:IPv4要求的最小链路MTU是68字节(以太网MTU为1500字节,取决于物理实现),IPv6要求的最小链路MTU为1280字节

6、P46:两个主机之间相反的两个方向上路径MTU可以不一致,因为在因特网中路由选择往往不是对称的

7、P47:IPv4和v6都定义了最小重组缓冲区大小,是IPv4或v6的任何实现都必须保证支持的最小数据报大小。IPv4为576字节,IPv6为1500字节。由于并不知道对端是否接受大于此值的数据报,为此很多使用UDP的IPv4网络应用(如DNS、RIP、TFTP、BOOTP、SNMP)都避免产生大于这个大小的数据报。

注:具休实现中有可能大于576,但并不确定。(针对UDP)

8、P47:TCP有一个MSS(maximum segment size,最大分节大小),用于向对端TCP通告对端的每个分节中能发送的最大TCP数据量。SYN分节上有MSS选项,用于告诉对端其重组缓冲区大小的实际值(区别7,由于UDP没有SYN以及ACK等,通信双向并不知道对端重组缓冲区的大小),从而试图避免分片。在以太网中IPv4的MSS值为1460,IPv6的MSS为1440(MTU为1500,两者的TCP首部为20字节,IPv4首部20字节,v6首部40字节)

注:对于UDP,由于没有MSS通告机制,因此为了保证通用性,应尽量避免UDP数据报大于576字节;对于TCP,由于可以通过ACK或SYN通告MSS的大小,于是可以利用此大小避免分片产生。网络层分片当且仅当IP数据报大小超过相应链路的MTU值。例如当在以太网(MTU=1500)上发送800字节的UDP,则不保证对端能正常接收。

9、P48:任何UDP套接字都有发送缓冲区大小(可以使用SO_SNDBUF套接字选项更改),不过它仅仅是可以写到该套接字UDP的数据报大小上限。如果一个应用进程写一个大于套接字发送缓冲区大小的数据报时,内核将返回进程一个EMSGSIZE错误。UDP没有一个真正的发送缓冲区,数据会被直接复制到一个内核缓冲区中,发送后不会被缓存。

第五章 TCP客户/服务器程序示例

1、P99:接收到对端的FIN将导致read函数返回0

2、P106:设置僵死状态的目的是维护子进程的信息,以便父进程在以后某个时刻获取。这些信息包括子进程的进程ID、终止状态以及资源利用信息(CPU时间、内存使用量等等)

3、P107:在编写捕获信号的网络程序时,我们必须认清被中断的系统调用且处理它们。适用于慢系统调用的基本规则是:当阻塞于某个慢系统调用(accept、read等)的一个进程捕获某个信号且相应信号处理函数返回时,该系统调用可能返回一个EINTR错误,我们必须对慢系统调用返回EINTR有所准备

4、P110:(1)当fork子进程时,必须捕获SIGCHLD信号;(2)当捕获信号时,必须处理被中断的系统调用;(3)SIGCHLD的信号处理函数必须正确编写,应使用waitpid函数以免留下僵死进程

5、P113:服务器进程异常终止时,会向客户端发送FIN,而客户端TCP则响应一个ACK。当客户端进程继续向服务端write时,由于先前打开那个套接字的进程已经终止,于是服务端响应一个RST。
若客户端继续write,即进程向某个已收到RST的套接字执行写操作时,内核向该进程发送一个SIGPIPE信号。该信号的默认行为是终止进程,因此进程必须捕获它以免不情愿地被终止;

若客户端执行read,分两种情况:(1)若read在FIN后RST前,则read返回0,表明对端已关闭;(2)若read的时候对端发来RST,则read返回一个ECONNRESET错误

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值