当前位置:首页 > Windows程序 > 正文

[转载] 读《UNIX网络编程 卷1:套接字联网API》

2021-03-28 Windows程序

文章写的很清楚, 适合初学者

最近看了《UNIX网络编程 卷1:套接字联网API》, 英文名叫Unix Network Programming啦,后来上网查了查, 一般都叫UNP逼格会高一点, 就像APUE一样。 他们的作者都是W. Richard Stevens。 另外,他也是TCP/IP Illustrated的作者。 靠,看完作者简介,简直崇拜得五体投地了。

说说这本书中比较让我印象深刻的内容吧,我只看了书中关于关于TCP和UDP的主要部分,略过了一些章节,所以可能有一些遗漏。

TCP和UDP的工作过程

TCP连接在“非正常”情况下的工作状况

各种I/O模型(阻塞/非阻塞/IO复用/信号驱动/异步)

守护进程和inetd的工作原理

服务器程序设计范式

客户端程序设计范式

TCP和UDP的工作过程

UDP的工作过程是简单的,仅仅将用户数据封装到一个IP数据报中发送到目的地而已,而不关注其他方面。

TCP却是一个极其复杂的协议,以下只是冰山一角

TCP连接在“非正常”情况下的工作状况

服务器进程终止

首先,服务器进程终止(收到SIGKILL信号)。作为进程中止处理的工作之一,该进程所有打开着的描述符将被关闭,这会导致向对端(客户端)发送(FIN N),而客户端则回复(ACK N+1),这就是TCP断开连接的前半部分。

然后,此时客户端收到(FIN N)并不意味着连接断开(虽然在这个例子中,确实断开了),,只是意味着服务器不再向客户端发送数据了,客户端还可以继续向服务器发送数据。如果此时客户端还继续向服务器发送数据,服务器TCP将发现之前的打开该套接字的进程已终止,于是回应一个RST。客户端在收到这个RST之前的read操作将会返回EOF,在收到这个RST后的read操作会返回ECONNRESET错误,在收到这个RST后的write操作会使当前进程收到SIGPIPE信号。

以上过程如下图所示:

技术分享

服务器主机崩溃

服务器主机崩溃的意思是,没有任何预兆,来不及在网络上发送任何消息,主机就无法工作了。这种情况等价于直接切断网络,或者通俗的说,可以直接拔掉网线来模拟这一情况。

这时,如果客户端向服务器发送数据,后调用read操作,TCP会一直等待服务器的ACK确认消息,并且不断的超时重传(按照Berkeley的实现,重传12次,共需9分钟),直到到达重传次数,返回ETIMEOUT错误。如果是由中间的路由器判定服务器主机不可达,响应“destination unreasonable”的ICMP消息,将返回EHOSTUNREACHENETUNREACH错误。

服务器主机崩溃后重启

重启之后的服务器已经丢失了之前的TCP信息,所以即使收到了客户端发来的TCP数据,也会回复RST,往后的情况和“服务器主机崩溃”中提到的类似。

服务器主机关机

Unix系统关机时,init进程通常会给其他进程发送SIGTERM信号,然后等待10s左右给仍在运行的进程发送SIGKILL信号。所以如果进程不捕获SIGTERM信号,则将由SIGKILL信号终止,和“服务器进程终止”中提到的类似。

温馨提示: 本文由Jm博客推荐,转载请保留链接: https://www.jmwww.net/file/69044.html