V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
woahishui
V2EX  ›  程序员

TCP 和 UDP 的区别

  •  
  •   woahishui · 2019-07-24 16:52:23 +08:00 via Android · 5431 次点击
    这是一个创建于 1710 天前的主题,其中的信息可能已经有所发展或是发生改变。
    昨天被问了这个问题,想想挺无奈的说有区别吧,反正概念上都说有,但是写代码的时候确实没感觉啊。
    第 1 条附言  ·  2019-07-24 18:07:52 +08:00
    谢谢各位,以为写点 TCP 的就算懂了,呵呵,我在多看看
    42 条回复    2019-07-25 09:48:39 +08:00
    d5
        1
    d5  
       2019-07-24 16:55:08 +08:00   ❤️ 1
    udp 是尽力而为的传输,tcp 要先握手,就算不记得专业词汇,也总能说上点什么吧。
    wysnylc
        2
    wysnylc  
       2019-07-24 16:58:09 +08:00
    百度的已经够详细了
    SilencerL
        3
    SilencerL  
       2019-07-24 16:58:58 +08:00   ❤️ 27
    TCP:
    你想听一个关于 TCP 的笑话吗
    你想听一个关于 TCP 的笑话吗
    你想听一个关于 TCP 的笑话吗

    UDP:
    你想一个于 UP 笑吗

    // ?可能举的例子不太严谨
    frozenway
        4
    frozenway  
       2019-07-24 16:59:05 +08:00
    一个是打电话,一个是发短信
    Chenamy2017
        5
    Chenamy2017  
       2019-07-24 17:00:38 +08:00
    你都写代码了,应该清楚他们的区别。
    FelixLiu
        6
    FelixLiu  
       2019-07-24 17:01:24 +08:00
    @SilencerL 我觉得 UDP 改成这样更好:
    你想个一于 UP 笑吗
    //加了包乱序,手动沟通
    cheeto
        7
    cheeto  
       2019-07-24 17:02:33 +08:00
    @SilencerL 哈哈哈哈哈哈哈哈哈
    CallMeReznov
        8
    CallMeReznov  
       2019-07-24 17:04:03 +08:00
    TCP 是制导导弹,UDP 是射后不管
    FelixLiu
        9
    FelixLiu  
       2019-07-24 17:05:58 +08:00   ❤️ 2
    代码写的不多吧,写多了就能发现很多不同
    1.UDP 适合多点传输,因为不需要连接,适合服务器转发给多个主机
    2.实时视频流传输 UDP,你懂的
    3.UDP 怎么处理包乱序,毕竟 TCP 不需要
    4.UDP 包要多大才合适?你知道 UDP 分片丢一个,整个 UDP 包就作废,so。。。。
    5.TCP 大多时候是比 UDP 高效的,so。。。
    laojiaqing
        10
    laojiaqing  
       2019-07-24 17:06:24 +08:00
    建议你多看看书
    wweir
        11
    wweir  
       2019-07-24 17:06:26 +08:00 via Android   ❤️ 1
    udp 这例子不太好吧,udp 是丢包,又不是没有校验。
    单包内部的正确性,还是值得信任的。

    还有,TCP 不是无故重传,是没收到 ack 或者包出问题才重传
    Buges
        12
    Buges  
       2019-07-24 17:10:00 +08:00 via Android   ❤️ 1
    虽然协议分层让你可以不关心下层具体内容,但你总不能真就一无所知就上岗吧…
    xnode
        13
    xnode  
       2019-07-24 17:13:25 +08:00
    tcp 是彬彬有礼的表白
    udp 是直接脱裤子就上
    jasonyang9
        14
    jasonyang9  
       2019-07-24 17:34:47 +08:00
    @wweir 假设每个字一是个包
    q397064399
        15
    q397064399  
       2019-07-24 17:38:16 +08:00
    一个是可靠性传输

    一个是不可靠性传输, 有根本性的区别吧,平时写代码不考虑 udp 的丢包情况?
    caola
        16
    caola  
       2019-07-24 17:43:48 +08:00
    草案中的 HTTP3 就是基于 UDP,草案一但通过,应该用不久就会代替 TCP 成为主流
    mattx
        17
    mattx  
       2019-07-24 17:47:51 +08:00
    没写过 udp 代码吧? 写 udp 连接代码要在逻辑层考虑可靠(会丢包和乱序等)

    udp 比 tcp 好的地方是, tcp 拥塞控制(重传, 丢包策略等)非常复杂, 在一些情况下表现不好, 而且比较公平
    封装的 udp 可以用更不公平的策略等, 可以去看看 kcp github 官网介绍.
    twoyuan
        18
    twoyuan  
       2019-07-24 17:48:35 +08:00   ❤️ 9
    hansenwang
        19
    hansenwang  
       2019-07-24 17:58:12 +08:00 via iPhone
    @twoyuan 666
    Yyyye
        20
    Yyyye  
       2019-07-24 18:03:14 +08:00 via Android
    tcpip 那本书里面有的
    zibber
        21
    zibber  
       2019-07-24 18:09:57 +08:00
    怪兽的设备就是 tcp 检查设备心跳 upd 发送业务数据
    CEBBCAT
        22
    CEBBCAT  
       2019-07-24 18:20:05 +08:00
    这个帖到底是想说什么啊,实现细节 Google 一大吧,吐槽这个节点也不太对吧
    gliyechen
        23
    gliyechen  
       2019-07-24 18:31:47 +08:00
    tcp 会保证数据包被收到,需要对方反馈。
    udp 无所谓对方收不收到,反正我发出去了。
    taogen
        24
    taogen  
       2019-07-24 18:33:52 +08:00 via Android
    1. TCP 是面向连接(三次握手),UDP 是无连接的。
    2. TCP 提供可靠数据传输服务,UDP 提供不可靠传输。
    3. TCP 有拥塞控制(传输速度根据丢包情况调整),UDP 最大速度传输。
    taogen
        25
    taogen  
       2019-07-24 18:46:25 +08:00 via Android
    4. TCP 报文头 20 字节,UDP 报文头 8 字节
    oneisall8955
        26
    oneisall8955  
       2019-07-24 18:52:18 +08:00 via Android
    人才楼上都是人才笑死我了
    yuanbo6
        27
    yuanbo6  
       2019-07-24 18:53:03 +08:00
    TCP:
    你女朋友发给你短信:你手机开机了吗?
    你没回消息
    你女朋友继续发短信:你手机开机了吗?
    你回了:我手机开机了
    你女朋友打电话:今晚我们去吃什么啊?工作好忙我好烦…… balaba ……再见

    UDP:
    你女朋友发给你短信:你手机开机了吗?
    你没回消息
    你女朋友继续发短信:你手机开机了吗?
    你没回消息
    你女朋友发给你短信:你手机开机了吗?
    你没回消息
    ……
    你女朋友发给你短信:我们分手吧
    你开机了:卧槽?
    Mutoo
        28
    Mutoo  
       2019-07-24 18:55:42 +08:00   ❤️ 1
    自己实现一个 TCP over UDP 你就知道区别了。
    stephenyin
        29
    stephenyin  
       2019-07-24 19:08:25 +08:00
    @SilencerL #3 这样更直观:
    TCP:
    你 想听 一个 关于 T CP 的笑话 吗
    你想 听一个关 于 TCP 的笑 话 吗
    你想 听一个关于 TC P 的 笑话吗

    UDP:
    你想一个于 UP 笑吗
    polebug
        30
    polebug  
       2019-07-24 19:12:47 +08:00
    以互喷为例
    TCP 是两个人先打声招呼:A: hi 可以开始喷了吗? B: 可以了
    然后开始回合制对喷:A: 你傻逼 B: 不,是你傻逼
    如果 A 没收到 B 的回复,会把刚刚那句再骂一遍
    注意 TCP 只能两个人对喷,别人不能加入

    UDP 是想喷就喷
    A: blablablabla 也不管 B 听没听见 A 自己喷舒服就行
    而且 A 可以喷 B 也可以同时喷 C : 你,还有你你你,你们都傻逼

    :)
    jamesliu96
        31
    jamesliu96  
       2019-07-24 20:15:31 +08:00 via Android
    1. 连接 2. 可靠性 3. 拥塞控制
    wweir
        32
    wweir  
       2019-07-24 20:15:51 +08:00 via Android
    @Mutoo 这有啥,直接把 udp 当 IP 用呗,反正两个特性基本一致。
    丢包的事,直接丢给内层的 TCP 重传好了
    wweir
        33
    wweir  
       2019-07-24 20:21:39 +08:00 via Android
    TCP 本质上是全双工的流。
    而 udp 则是完全是数据包,拆包、序列化、丢包都要考虑。
    作为纯粹的包,可以使用很多 IP 层的特性,如广播、多拨。而 TCP 带来便利的同时,也屏蔽了很多可能性。

    从业务人员的角度看,大概可以理解为:一个是重型框架,一个是轻量封装库
    dgjungle
        34
    dgjungle  
       2019-07-24 20:38:11 +08:00
    udp 是我给你传过来了哦 tcp 是在么?你是某某么?我要给你东西咯?拿好你的东西。大概是这么个意思吧
    opengps
        35
    opengps  
       2019-07-24 20:41:22 +08:00
    tcp 是拨通电话对话
    udp 是隔空喊话
    cwek
        36
    cwek  
       2019-07-24 20:45:59 +08:00
    @caola 其实际上是在 UDP 层实现一个用户空间的类 TCP 机制。
    alw
        37
    alw  
       2019-07-24 21:48:01 +08:00
    你想知道的知识在《 TCP/IP 协议详解 卷一》,英文版更佳。
    sinxccc
        38
    sinxccc  
       2019-07-24 22:44:32 +08:00
    概念几句话就能讲明白的东西,各种 xjb 类比…
    koebehshian
        39
    koebehshian  
       2019-07-24 23:38:52 +08:00
    TCP 内建收到确认功能,UDP 就是就是裸的 IP 加了个端口号
    emeab
        40
    emeab  
       2019-07-25 00:19:55 +08:00
    TCP: JD 快递
    UDP: 3 通
    fghjghf
        41
    fghjghf  
       2019-07-25 08:43:00 +08:00
    我没有 JB 类比。
    tcp 三次握手 4 次挥手这个不用说了吧,关键是 tcp 每次发包,都会有 ack 验证,检测数据包是否完整。所以性能比 udp 是低了点。
    写 socket 的时候都一样的,ip+端口号
    写 webapp 的时候你肯定体会不到,框架都封装好一切了。面试瞎几把问而已
    Alex5467
        42
    Alex5467  
       2019-07-25 09:48:39 +08:00
    @SilencerL 可以说是活学活用了喂
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   3102 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 10:57 · PVG 18:57 · LAX 03:57 · JFK 06:57
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.