1
shuax 2016-02-23 18:22:10 +08:00
tcp/ip 详解 卷一
|
3
mengzhuo 2016-02-23 20:33:55 +08:00 via iPhone 1
书最好还是看看,配合 wireshark 抓包就清楚了。
必须有 fin 包双方才开始四次断开,否则就是超时。 而且发了 fin 没发够的话也会触发 timewait 行为。 根据包结构和位解析来说, fin 包还可以放 psh 数据,不过一般没这么实现的罢了。 |
4
gamexg 2016-02-23 20:40:26 +08:00 via Android 1
没试过,但是客户端 write 空应该不会实际发包,也就是服务端不会知道。虽然客户端系统有时会发送空包( ack 等)但是服务端 read 不会返回空的(阻塞模式)。
|
5
Strikeactor 2016-02-23 21:04:32 +08:00
你举的那个栗子,在没读到的时候,函数是阻塞的。。
就像你在那儿儿接水,接一盆端走接一盆端走,中间水压不够水暂时断流的话,人是会等在那儿一直到出水的。人走了而桶里没水,就一种可能,那就是水龙头被拧上了。。 |
6
skydiver 2016-02-23 21:06:27 +08:00 via iPad
@Strikeactor 哈哈哈哈
|
7
quietin OP @Strikeactor 阻塞这个我知道啊,感觉例子举得不好,基础不好容易被误导比如我
|
8
XiaoxiaoPu 2016-02-23 23:02:01 +08:00 1
@quietin 以用 read 函数读取 socket 为例:对于 socket 连接的*阻塞*读请求, 1: 如果对端没有写数据,那么会一直阻塞直到后面两种情况发生, 2: 如果接收到对端写的数据,那么会返回这次请求接收的数据的字节数, 3: 如果对端关闭连接\结束写操作(即发送 FIN),那么会返回 0 。你说的客户端发送空字符的情况,说法是不准确的, socket 上发送或接受的都是字节流,要么有数据,要么没数据,无所谓数据的内容,只看数据的字节数。
|
10
quietin OP @XiaoxiaoPu 我用 python 实验,对端关闭时就是收到空字符,不是 0
另外 tcp 不会发空包 |