V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
v2byy
V2EX  ›  程序员

关于 TCP 中的三次握手

  •  
  •   v2byy · 2019-07-16 17:45:57 +08:00 · 3154 次点击
    这是一个创建于 1975 天前的主题,其中的信息可能已经有所发展或是发生改变。

    TCP 是面向连接的可靠传输协议。假设链路很可靠,不会丢包,那么可不可以只有两次握手?

    27 条回复    2019-07-17 10:28:01 +08:00
    BBCCBB
        1
    BBCCBB  
       2019-07-16 17:51:01 +08:00   ❤️ 1
    TCP 为什么是三次握手,而不是两次或四次? - HioHio 的回答 - 知乎
    https://www.zhihu.com/question/24853633/answer/573627478


    特么百度一下就有的东西,你还发上来
    BBCCBB
        2
    BBCCBB  
       2019-07-16 17:51:54 +08:00
    双方需要协商初始序列号,肯定需要 ack,所以三次是必要的
    v2byy
        3
    v2byy  
    OP
       2019-07-16 18:00:21 +08:00
    @BBCCBB 哈哈,我发现我还看过知乎上的这个问题
    v2byy
        4
    v2byy  
    OP
       2019-07-16 18:03:31 +08:00
    @BBCCBB 但是在前两次握手中,双方都已经将 seq 发给对方了啊
    cjpjxjx
        5
    cjpjxjx  
       2019-07-16 18:07:45 +08:00 via iPhone   ❤️ 2
    三次握手:
    “喂,你听得到吗?”
    “我听得到呀,你听得到我吗?”
    “我能听到你,今天 balabala ……”

    两次握手:
    “喂,你听得到吗?”
    “我听得到呀”
    “喂喂,你听得到吗?”
    “草,我听得到呀!!!!”
    “你 TM 能不能听到我讲话啊!!喂!”
    “……”

    四次握手:
    “喂,你听得到吗?”
    “我听得到呀,你听得到我吗?”
    “我能听到你,你能听到我吗?”
    “……不想跟傻逼说话”

    作者:匿名用户
    链接: https://www.zhihu.com/question/24853633/answer/114872771
    来源:知乎
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
    CEBBCAT
        6
    CEBBCAT  
       2019-07-16 18:11:46 +08:00
    实践了多少年的东西,不是不让你提问,实在是人总是觉得自己想到了别人没想到的事儿。

    积极探索很好啊,但不经思考和验证就发到网络上浪费大家时间就不好了
    v2byy
        7
    v2byy  
    OP
       2019-07-16 18:12:39 +08:00
    @cjpjxjx 例子里的两次握手,是指有包丢了的情况。如果假设链路可靠,不会丢包呢?
    BBCCBB
        8
    BBCCBB  
       2019-07-16 18:14:08 +08:00
    发给对方不代表对方收到了。 所以需要 ack 确认! 5 楼那个答案不可信。。。
    mansurx
        9
    mansurx  
       2019-07-16 18:20:26 +08:00   ❤️ 1
    是时候拿出这张祖传老图了。


    关于握手次数,楼主可以看下 QUIC 协议~
    azh7138m
        10
    azh7138m  
       2019-07-16 18:22:32 +08:00   ❤️ 2
    S ———- syn ————> C
    S < —— syn&ack ———— C
    S ————- ack —————> C


    > 假设链路很可靠

    ack 啥,直接发就是了,重新发明 UDP ?
    goofool
        11
    goofool  
       2019-07-16 18:22:34 +08:00
    假设不成立
    kljsandjb
        12
    kljsandjb  
       2019-07-16 18:27:03 +08:00 via iPhone
    为了保证双方的收发能力都没问题
    taogen
        13
    taogen  
       2019-07-16 18:35:45 +08:00 via Android
    三次握手和可靠数据传输没有任何关系。三次握手是建立连接,可靠数据传输是由传输层和链路层相关算法实现。
    pagxir
        14
    pagxir  
       2019-07-16 18:37:54 +08:00 via Android
    TCP 设计的一个目的就是运行在不可靠链路之上的。。。
    xfriday
        15
    xfriday  
       2019-07-16 18:47:21 +08:00   ❤️ 2
    没有第三次握手,可以伪造源 ip 的
    v2byy
        16
    v2byy  
    OP
       2019-07-16 18:53:27 +08:00
    @azh7138m 链路可靠,也需要拥塞控制啊,要考虑双方的收发能力吧
    v2byy
        17
    v2byy  
    OP
       2019-07-16 18:56:37 +08:00
    @taogen 正如上面回答的,握手协商双方的 seq,如果没有 seq 号,链路层收到差错包,将之丢弃,就是通过 seq 来重传的,我觉得还是有关系的。
    lhx2008
        18
    lhx2008  
       2019-07-16 18:59:40 +08:00 via Android
    @v2byy 链路绝对可靠就不需要拥塞控制,链路也是可靠的,所以不存在绝对可靠的链路
    zivyou
        19
    zivyou  
       2019-07-16 19:07:31 +08:00
    @lhx2008 链路绝对可靠也是需要拥塞控制的吧。发送方滑动窗口大小必须要考虑接收方的接收能力,不然包会被接收方丢弃。
    OhYee
        20
    OhYee  
       2019-07-16 19:25:25 +08:00 via Android
    假设链路很可靠用 udp 啊
    tcp 三次握手和链路可靠不可靠又没啥关系
    zhng920823
        21
    zhng920823  
       2019-07-16 19:27:21 +08:00
    @azh7138m #10 S 和 C 方向是不是反了
    CEBBCAT
        22
    CEBBCAT  
       2019-07-16 20:19:04 +08:00
    @v2byy #17 链路层管你个锤子的 SEQ
    CEBBCAT
        23
    CEBBCAT  
       2019-07-16 20:23:10 +08:00   ❤️ 1
    > https://github.com/jawil/blog/issues/14

    “已失效的连接请求报文段”的产生在这样一种情况下:client 发出的第一个连接请求报文段并没有丢失,而是在某个网络结点长时间的滞留了,以致延误到连接释放以后的某个时间才到达 server。本来这是一个早已失效的报文段。但 server 收到此失效的连接请求报文段后,就误认为是 client 再次发出的一个新的连接请求。于是就向 client 发出确认报文段,同意建立连接。假设不采用“三次握手”,那么只要 server 发出确认,新的连接就建立了。由于现在 client 并没有发出建立连接的请求,因此不会理睬 server 的确认,也不会向 server 发送数据。但 server 却以为新的运输连接已经建立,并一直等待 client 发来数据。这样,server 的很多资源就白白浪费掉了。采用“三次握手”的办法可以防止上述现象发生。例如刚才那种情况,client 不会向 server 的确认发出确认。server 由于收不到确认,就知道 client 并没有要求建立连接。”

    现在你知道为什么要有第三次握手了吗?
    petelin
        24
    petelin  
       2019-07-16 20:48:35 +08:00
    #15 #23 楼 正解
    azh7138m
        25
    azh7138m  
       2019-07-16 20:56:48 +08:00
    @zhng920823 哦,那把 C 换成 M 吧(
    其实只是想说明下 A/B,下意识写成了 CS,然后 ZZ 了一下,就。。。
    nnnToTnnn
        26
    nnnToTnnn  
       2019-07-17 08:55:28 +08:00
    @cjpjxjx 第四次是挥手
    shuizhengqi
        27
    shuizhengqi  
       2019-07-17 10:28:01 +08:00
    假设链接可靠,为什么还需要握手,直接发不就完了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   4147 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 04:02 · PVG 12:02 · LAX 20:02 · JFK 23:02
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.