Unix网络编程上卷--第二章

 TCP连接的建立:3次握手。

 TCP连接的终止:4次应答。

Unix网络编程上卷--第二章_第1张图片

 TCP连接的终止挺难理解的。关键是要理解如果其中的每一步的消息丢失了会出现什么情况,而最关键的是理解TIME_WAIT状态。

 TIME_WAIT之前的所有应答,如果对方在规定时钟时间内没有“回信”,则重新发送消息。但是最后一次服务器给客户发送FIN后,客户收到FIN要进入TIME_WAIT状态,而不是关闭,这是为什么呢?

书中给出的两个理由:

1,如果客户最后给服务器的ACK N+1丢失了的话,在客户设置的TIME_WAIT之后的2MSL时间内可能会收到服务器端的FIN N,则客户端重新发一下ACK N+1.

2,网络中可能残余的有分组没有到达,则经过TIME_WAIT后的2MSL时间,所有这些分组消逝,从而不会影响客户端与服务器间新的连接的建立。

有个疑问:就是在于红字“可能”所在的地方,如果服务器端发送的FIN N很不幸也丢失的话,怎TIME_WAIT后的2MSL时间后客户关闭,但是服务器却依然没有收到ACK N+1,这时候该怎么办呢? 是不是以后服务器再发送FIN N时客户端会返回“不可达”呢,还是服务器尝试几次之后就认为客户已经关闭,从而自己也关闭呢?


对read,write函数的误解:

以前以为write就是在网络中发送一个消息,而read就是读取一个消息。

正解:从写一个TCP套接口的write调用成功返回仅仅表示系统已经把进程要发送的数据从进程的缓冲区copy到了内核的缓冲区,而并不一定发送出去了。而read读到的消息,并不一定是write一次写入的消息(也有可能是多次),只有当read返回0的时候才认为数据传输结束了。



你可能感兴趣的:(Unix网络编程上卷--第二章)