网络编程实战
盛延敏
前大众点评云平台首席架构师
44207 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 40 讲
网络编程实战
15
15
1.0x
00:00/00:00
登录|注册

06 | 嗨,别忘了UDP这个小兄弟

客户端收到服务端处理后的报文
服务器端连续收到两个客户端的报文
客户端收到服务端回应
服务器端收到报文
阻塞在recvfrom上
发送和接收报文
初始化目标服务器的地址和端口
创建套接字
接收和发送报文
绑定数据报套接字到本地端口
创建套接字
请求中的UDP报文最大大小
recvfrom一直处于阻塞状态中的处理方式
开启服务端,再一次开启两个客户端
先开启服务端,再开启客户端
只运行客户端
客户端例子
服务器端例子
需要三次握手建立连接
面向连接的数据流协议
通过recvfrom和sendto函数直接收发数据报报文
无连接的数据报程序
思考题
场景三
场景二
场景一
UDP编程
TCP
UDP
参考文章

该思维导图由 AI 生成,仅供参考

你好,我是盛延敏,这里是网络编程实战第 6 讲,欢迎回来。
前面几讲我们讲述了 TCP 方面的编程知识,这一讲我们来讲讲 UDP 方面的编程知识。
如果说 TCP 是网络协议的“大哥”,那么 UDP 可以说是“小兄弟”。这个小兄弟和大哥比,有什么差异呢?
首先,UDP 是一种“数据报”协议,而 TCP 是一种面向连接的“数据流”协议。
TCP 可以用日常生活中打电话的场景打比方,前面也多次用到了这样的例子。在这个例子中,拨打号码、接通电话、开始交流,分别对应了 TCP 的三次握手和报文传送。一旦双方的连接建立,那么双方对话时,一定知道彼此是谁。这个时候我们就说,这种对话是有上下文的。
同样的,我们也可以给 UDP 找一个类似的例子,这个例子就是邮寄明信片。在这个例子中,发信方在明信片中填上了接收方的地址和邮编,投递到邮局的邮筒之后,就可以不管了。发信方也可以给这个接收方再邮寄第二张、第三张,甚至是第四张明信片,但是这几张明信片之间是没有任何关系的,他们的到达顺序也是不保证的,有可能最后寄出的第四张明信片最先到达接收者的手中,因为没有序号,接收者也不知道这是第四张寄出的明信片;而且,即使接收方没有收到明信片,也没有办法重新邮寄一遍该明信片。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

UDP与TCP是两种不同的通信协议,分别适用于不同的场景。TCP是面向连接的协议,具有重传、确认、有序传输、拥塞控制等能力,而UDP则是无连接的通信协议,不保证报文的有效传递和有序性。尽管UDP的不可靠性,但由于其简单性和适用于多种场景,如DNS服务、多人通信等,仍然具有广泛的应用价值。本文通过介绍UDP编程的主要过程和UDP服务器端、客户端的示例,让读者更好地理解UDP与TCP之间的差别。文章还提出了两个思考题,引发读者对UDP协议的深入思考。通过本文的总结,读者可以快速了解UDP协议的特点和适用场景,以及UDP与TCP之间的区别。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《网络编程实战》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(59)

  • 最新
  • 精选
  • 何赫赫
    老师,UDP没有发送缓冲区这个概念吗

    作者回复: 实际上不存在UDP发送缓冲区,因为发往UDP发送缓冲区的包只要超过一定阈值(值很小)就可以发往对端。所以我们一般认为UDP是没有发送缓冲区的。

    2020-03-09
    2
    23
  • tongmin_tsai
    老师,UDP被IP层分包发送后,对端如何保证UDP包整个组合的?比如用UDP发送3000字节,假设拆分2个MTU发送,后一个先到服务端,前一个后到服务端,那应用层接收的时候,UDP怎么组装的?

    作者回复: 很简单,1-1500为一个seq=1的包,1501-3000为seq=2的包,根据sequence组装就可以了。

    2019-09-30
    3
    20
  • 你好
    多人聊天室使用UDP,消息发出后怎么保证消息可以被收到呀,UDP不是不可靠传输嘛,中间丢了消息咋办呀

    作者回复: 第一,丢了就丢了,反正UDP就是不可靠的; 第二,给每条消息加个sequence,收到后再确认,一段时间内没收到,就重发。

    2019-10-30
    4
    10
  • 旅途
    第一个思考题 另起一个线程进行recvfrom

    作者回复: 我的本意是使用超时或者非阻塞来解

    2019-12-29
    9
  • YUAN
    udp之所以sendto要目的地址是因为他是非连接的,否则不知道将数据发给谁,recvfrom要发送方地址也是因为udp是非连接的,有了from内核就可以判定将数据上传给谁(应用进程)。是这样吗?

    作者回复: 基本是这样的。

    2020-10-03
    5
  • kissingers
    老师,TCP 流,UDP包,流的说法怎么理解?

    作者回复: 流就像水流,一直持续不断的流淌,只不过流淌的是0101这样的比特流。

    2019-09-06
    4
    4
  • 范龙dragon
    客户端代码的29行sendline数组之前没有初始化数组元素为0,直接用strlen应该会有问题吧,strlen不是以0作为结束标志吗?

    作者回复: 好问题,fgets函数会"默默"的给我们加上\0

    2019-08-18
    2
    4
  • zhchnchn
    如果不开启服务端,TCP 客户端的 connect 函数会直接返回“Connection refused”报错信息。而在 UDP 程序里,则会一直阻塞在这里。 ------------------------- 这个地方不太理解。请问老师,对TCP来说,收到“Connection refused”报错信息,表明收到了服务端的RST包,如果服务端不开启,谁负责发送RST包呢?

    作者回复: 不是RST包,RST的意思是connection reset;这里connection refused是对方的TCP协议栈发送的,工作在操作系统内核中。

    2019-08-14
    2
    4
  • 江永枫
    关于阻塞io,可以考虑使用多线程模型去提升性能,或者结合io多路复用来处理能力。 https://m.php.cn/article/410029.html

    作者回复: 很快就会讲到了 :)

    2019-08-14
    3
  • null
    老师好,有 3 个问题请教一下: 1. TCP 有序传输的意思是:需要等到当前发送的包 ACK 之后,才发下一个包么?还是说可以一直发消息,收到 ACK 之后再确认对应的包发送成功? 2. 关于 TCP 和 UDP 连接,我可以这么理解么? TCP 连接之后直到关闭,这期间发的消息,比如 client 发给(send 函数) server, 然后 server 回复(不知道用啥函数写回,也是 send 函数么?) client; client 又继续发给 server,继续重复刚才的步骤...., 走的都是同一个连接。 而 UDP,client 发给(sendto 函数) server 是一个连接。而 server 回复(sendto 函数) client,又是另一个连接。 3. 下面的循环发送,我甚至是可以动态更改对端 client_addr 地址和端口信息的吧? for (;;) { sendto(socket_fd, send_line, strlen(send_line), 0, (struct sockaddr *) &client_addr, client_len); }

    作者回复: 1. TCP有序传输的意思是对于传送的字节流,接收端总是保证按照发送的顺序来接收; 2.TCP是面向连接的,UDP没有连接的概念; 3.当然可以,但是意义不大。

    2021-03-16
    2
收起评论
显示
设置
留言
59
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部