TCP 可以使用两次握手建立连接吗? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘 AI 生成的内容
scriptB0y
V2EX    程序员

TCP 可以使用两次握手建立连接吗?

  •  
  •   scriptB0y
    laixintao 2018-02-07 11:46:41 +08:00 7026 次点击
    这是一个创建于 2804 天前的主题,其中的信息可能已经有所发展或是发生改变。
    最近在想这个问题,研究了一下,写了一篇博客总结了自己查到的资料和结论。不知道有没有错误,请 V 友讨论。

    https://www.kawabangga.com/posts/2722
    26 条回复    2018-02-09 12:31:21 +08:00
    rensuperk
        1
    rensuperk  
       2018-02-07 11:50:54 +08:00
    UDP 协议,可以了解下
    scriptB0y
        2
    scriptB0y  
    OP
       2018-02-07 11:56:47 +08:00
    @rensuperk

    好的,不过是哪部分? UDP 好像没有握手和确认之类的机制,包发出去就不管了吧。好像跟我的问题没有什么关系的样子……
    zhengxiaowai
        3
    zhengxiaowai  
       2018-02-07 11:57:58 +08:00   2
    看看 tcp fast open
    lhx2008
        4
    lhx2008  
       2018-02-07 12:01:24 +08:00 via Android   1
    第三个包带数据好像是可以的,但是必须也要有 ack,就是三次握手和第四次数据合并在一起了而已
    feather12315
        5
    feather12315  
       2018-02-07 12:03:10 +08:00 via Android   1
    这是一个数学问题,大于 3 次与 3 次效果一样,小于 3 次就不一样了
    scriptB0y
        6
    scriptB0y  
    OP
       2018-02-07 12:03:56 +08:00
    lhx2008 嗯我也是这么理解的。
    hjc4869
        7
    hjc4869  
       2018-02-07 12:10:39 +08:00   1
    TFO,SYN 包可以设 PSH bit 并且带上 data (也可以不带 PSH 但是带 data ),直接一来一回就建立连接顺便还能发点数据。
    Shura
        8
    Shura  
       2018-02-07 12:42:36 +08:00
    https://zh.wikipedia.org/wiki/TCP%E5%BF%AB%E9%80%9F%E6%89%93%E5%BC%80
    利用三次握手的 SYN 报文来传输应用数据,更加实用。
    honeycomb
        9
    honeycomb  
       2018-02-07 13:19:30 +08:00 via Android
    @scriptB0y TCP 有一个 fast open 特性
    hxndg
        10
    hxndg  
       2018-02-07 13:25:11 +08:00
    我觉得这个没必要说的那么麻烦,打个比喻:
    登山的时候,上面一个人拉着绳子,你在下面准备登山,你不知道他好没好,他不知道你好没好,你们必须得两个人各自一下绳子来告诉对方,这个是通知作用。

    除非你知道对方好了,直接爬上去告诉他:我要爬上去了。
    cloverii
        11
    cloverii  
       2018-02-07 13:29:29 +08:00 via Android
    所以你没解释两次为啥不行?
    eeljiang
        12
    eeljiang  
       2018-02-07 13:36:54 +08:00   2
    握手没学到,学到了 [dèn]
    scriptB0y
        13
    scriptB0y  
    OP
       2018-02-07 13:37:15 +08:00
    @cloverii 解释了啊,引用的那段话,server 浪费资源。如果发起端将第三次和数据一起发是可以的。
    LGA1150
        14
    LGA1150  
       2018-02-07 13:47:37 +08:00 via Android
    HTTP 响应可以放在 FIN 里面
    GjriFeu
        15
    GjriFeu  
       2018-02-07 14:06:36 +08:00
    假设 A 端发起关闭连接请求, 四次挥手中第二次的作用是通知 A 端,我收到了你的关闭请求,我也准备关闭;这时 B 端写缓冲区如果有数据的话会将这些数据发送完成再发 FIN 给 A 端。 这么说是不是 B 端写缓冲区没有数据 所以将第二次和第三次挥手合并到一个报文中了
    ai277014717
        16
    ai277014717  
       2018-02-07 14:22:29 +08:00
    用 UDP 假装 TCP
    scriptB0y
        17
    scriptB0y  
    OP
       2018-02-07 14:57:23 +08:00
    @GjriFeu 我的理解是这样的,而且这是一个通常的做法将 2,3 合并。

    > It is also possible to terminate the connection by a 3-way handshake, when host A sends a FIN and host B replies with a FIN & ACK (merely combines 2 steps into one) and host A replies with an ACK.[12] This is perhaps the most common method.

    https://en.wikipedia.org/wiki/Transmission_Control_Protocol
    BXLR
        18
    BXLR  
       2018-02-07 15:32:10 +08:00
    总想搞个大新闻
    0ZXYDDu796nVCFxq
        19
    0ZXYDDu796nVCFxq  
       2018-02-07 16:18:25 +08:00
    如果两次握手就能建立连接,那 DDoS 的高兴死了
    kaiser1992
        20
    kaiser1992  
       2018-02-07 16:58:07 +08:00
    双方互相确认的机制,保证连接建立。
    Thiece
        21
    Thiece  
       2018-02-07 16:59:34 +08:00
    @scriptB0y 那有这种需求,为什么不上 QUIC 呢?
    goofool
        22
    goofool  
       2018-02-07 17:38:55 +08:00
    不可以啊,协议规定的东西,不按照协议来就不是 TCP 了
    print
        23
    print  
       2018-02-07 19:32:26 +08:00
    @eeljiang 同学
    pusidun
        24
    pusidun  
       2018-02-08 09:07:09 +08:00
    原来楼主就是那个写怎么学 python 的大神

    我看你的博客,意思是想让第三次握手的 ACK 连着下一次的数据一起发送,对吧?
    但是为什么要三次握手?现在假设 A 是客户端,B 是服务器。
    第一次:A->B 这个过程,B 确定了 A 的发送没问题
    第二次:B->A 这个过程,A 确定了 B 的接收没问题,同时确定了 A 自己第一个过程里面发送的 ACK,B 确实收到了,即自己的发送没问题。
    第三次:A->B 这个过程,同样道理,B 确定了自己发送没问题,A 的接收也没问题。
    经过这 3 次,A,B 双方互相确认了对方的发送和接收都没问题,所以保证了这是一个可靠传输。才开始传输数据

    自己的看法,错了轻喷
    scriptB0y
        25
    scriptB0y  
    OP
       2018-02-08 09:33:46 +08:00
    @pusidun 额 不是大神…… 也是在学习

    我觉得“保证了这是一个可靠传输”这个不太准确。因为 TCP 的可靠性是靠 ACK 确认保证的。所以即使不建立链接呢,只要每一次发送都有 ACK,没有 ACK 就重传也可以保证是可靠传输。

    我博客可能没说明白…… 我最后的结论是第三次 ACK 带数据发送是没有问题的,甚至第一次发送的 SYN 也是可以带数据的。
    joyful
        26
    joyful  
       2018-02-09 12:31:21 +08:00
    三次握手初始化连接; ACK、交验和等保证可靠传输。各司其职。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2691 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 24ms UTC 14:50 PVG 22:50 LAX 07:50 JFK 10:50
    Do have faith in what you're doing.
    ubao 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