为什么 TCP 中 ACK 确认是加 1?不加用原来的 SYN 号或者 FIN 号不行吗?为什么? - V2EX
aganlengzi

为什么 TCP 中 ACK 确认是加 1?不加用原来的 SYN 号或者 FIN 号不行吗?为什么?

  •  
  •   aganlengzi Mar 31, 2016 7591 views
    This topic created in 3700 days ago, the information mentioned may be changed or developed.
    不知道为什么。。。。
    19 replies    2016-04-01 08:38:06 +08:00
    aganlengzi
        1
    aganlengzi  
    OP
       Mar 31, 2016
    额,是不是发错地方了,应该发到问与答去。。。。
    wittyfox
        2
    wittyfox  
       Mar 31, 2016 via Android
    什么叫协议,协议就是约定。
    jimzhong
        3
    jimzhong  
       Mar 31, 2016
    这是约定的
    aganlengzi
        4
    aganlengzi  
    OP
       Mar 31, 2016
    @wittyfox 这个约定在设计的时候是因为某种原因,我想知道这种原因
    aganlengzi
        5
    aganlengzi  
    OP
       Mar 31, 2016
    @jimzhong 为什么这么约定?感觉总归有原因的吧?
    fantasticfears
        6
    fantasticfears  
       Mar 31, 2016   1
    @aganlengzi 另一端可以通过 stream 来确认状态,收到重复包就可以发现是丢包而重传;根据丢包的 ACK 号还可以知道是哪一段丢了。 SYN 和 FIN 跟 ACK 两码事
    cevincheung
        7
    cevincheung  
       Mar 31, 2016
    @aganlengzi

    因为 XXXXX 中 YYY 的 BBB or 其他 balabala 。
    你又要问,为什么 YYY 的 BBB 不能 XXXX 。

    不必深究,鬼知道当时的什么小组或什么组织的是怎么想的。而且对外公布的只有结果,一般木有原因。
    cevincheung
        8
    cevinceung  
       Mar 31, 2016
    @aganlengzi 不懂协议的人路过……
    BOYPT
        9
    BOYPT  
       Mar 31, 2016
    行啊,你喜欢,只是你的就不叫 TCP 了,也没法和标准的 TCP 服务器客户端通信。
    billlee
        10
    billlee  
       Mar 31, 2016
    这个数字其实就是初始序列号 + 下一个 fragment 的地址偏移,根据对方就能确定流已经成功发送到哪里了
    aganlengzi
        11
    aganlengzi  
    OP
       Mar 31, 2016
    @BOYPT 讨论一下嘛。。。。
    wy315700
        12
    wy315700  
       Mar 31, 2016 via Android
    @aganlengzi 十楼已经回答你了
    ACK 不仅仅是 SYN 要用 中间传输也要用
    aganlengzi
        13
    aganlengzi  
    OP
       Mar 31, 2016
    @cevincheung 鹅鹅鹅
    wind4
        14
    wind4  
       Apr 1, 2016
    TCP 有重传机制,如果同时收到多个相同包,你能区分是重传还是确认吗?
    pubby
        15
    pubby  
       Apr 1, 2016
    不一定+1 ,丢包的话还会 ack 丢包前的位置
    sack 参与的话又不一样了
    hooluupog
        16
    hooluupog  
       Apr 1, 2016   2
    SYN 和 FIN 是建立连接,握手阶段才使用。
    ACK 为 1 表示这是一个确认帧。 ack 和 seq 是对应的帧序号,两者是对应的。 A 发送帧给 B , B 收到 A 发送的帧之后向 A 发送确认帧,编号为已正确收到的最后一帧的下一个帧(也就是期望收到的帧的编号)。所以 B 的 ack 等于 A 的 seq+1 。
    gamexg
        17
    gamexg  
       Apr 1, 2016 via Android   1
    只是一个约定, ack 表示希望收到的下一个包数据的相对于流的位置。
    主要是用来做超时重传用的,而且在超时重传时也比较符合逻辑,例如:

    客户端发了 1 至 5 共 5 个包,但是 2 丢了。服务端在收到 3 时就会发现不符合预期,应该收到 2 的包结果收到了 3 ,这时就会发出 ack2 的包,表示希望收到 2 的数据。客户端在收到多次 ack2 的包就会启动快速重传重发服务端要求的 2 的数据。

    而要是不加 1 ,那么就有些不符合逻辑了,明明收到了 3 ,却发出 1 的 ack 。
    jimzhong
        18
    jimzhong  
       Apr 1, 2016
    @aganlengzi 楼主如果去看计算机网络书籍里面的 GBN 和 SR 协议。可以发现他们的 ACK 是目前已经收到的 SeqNo 。而 TCP 的约定是 ACK 是下一个期待收到的 SeqNo.
    caiyangjieto
        19
    caiyangjieto  
       Apr 1, 2016
    因为 ACK 同时是对方下一次的序列号,所以得加一啊
    About     Help     Advertise     Blog     API     FAQ     Solana     2565 Online   Highest 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 51ms UTC 15:31 PVG 23:31 LAX 08:31 JFK 11:31
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86