Chinaunix首页 | 论坛 | 博客
  • 博客访问: 163953
  • 博文数量: 67
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 622
  • 用 户 组: 普通用户
  • 注册时间: 2014-11-19 19:12
文章分类

全部博文(67)

分类: LINUX

2014-12-04 15:50:04

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中发过了,而正常的三次握手中第二次握手(收到对端的SYNSYN和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协议的实现,纯属猜测,有机会验证,同时希望知道的大牛不吝赐教。
阅读(1259) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~