Richards Stevens 《UNIX网络编程 卷1 第3版》35页,TCP状态转换图,有两个特殊情况:同时打开、同时关闭,虽然极其罕见,但可以想象一下:
假设两台电脑A、B
一、同时打开
1、A发SYNa给B,B在未收到SYNa之前发SYNb给A,此时A、B都进入SYN_SENT状态
2、假设B先收到SYNa(因为A先发的SYNa),此时B回一个(SYNb与ACKa+1),同时B进入SYN_RCVD状态
3、A收到SYNb,回一个(SYNa与ACKb+1),同时A进入SYN_RCVD状态
4、A收到(SYNb与ACKa+1)进入ESTABLISHED
5、B收到(SYNa与ACKb+1)进入ESTABLISHED
说明:(SYNb与ACKa+1)表示SYN和ACK一起发送
疑问:步骤2中,B回一个(SYNb与ACKa+1)还是只回一个ACKa+1??SYNb已经在步骤1中发过了,而正常的三次握手中第二次握手(收到对端的SYN)时SYN和ACK是一起发送的。步骤3同理
猜测:步骤4中,A不会再发送ACKb+1,因为已经在步骤3中发了。步骤5同理。
二、同时关闭
1、A发FINa给B,B收到FINa之前发FINb给A,二者都进入FIN_WAIT_1
2、假设B先收到FINa,B回一个ACKa+1并进入CLOSING
3、A收到FINb,A回一个ACKb+1并进入CLOSING
4、A收到ACKa+1,进入TIME_WAIT
5、B收到ACKb+1,进入TIME_WAIT
猜测:此时不会出现FIN与ACK一起发送的情况(该情况下会导致由FIN_WAIT_1直接进入TIME_WAIT),因为FIN已经发过了。
未看过TCP协议的实现,纯属猜测,有机会验证,同时希望知道的大牛不吝赐教。
阅读(1286) | 评论(0) | 转发(0) |