UDP客户服务器模型和UDP协议
文章目录
- UDP客户服务器模型和UDP协议
-
- 一、前言
- 二、socket之客户服务器模型
-
- [2.1 socket本质](#2.1 socket本质)
- [2.2 学习socket的目的](#2.2 学习socket的目的)
- [2.3 C/S模式](#2.3 C/S模式)
- [2.4 UDP服务器编程模型](#2.4 UDP服务器编程模型)
- [2.5 UDP客户端编程模型](#2.5 UDP客户端编程模型)
- 三、UDP协议抓包分析
- 四、小结
一、前言
先前理解了socket的定义,今天我们继续深入探讨。。。
二、socket之客户服务器模型
2.1 socket本质
socket实际上就是一个编程接口 ,是对某种结构的抽象。(网络通信,需要有发送信道和接收信道)
2.2 学习socket的目的
正常来说,这两个信道需要两个主体来描述,但是人们发现一个主体也能描述,这就是socket
socket就是研究:如何使用哪些系统调用接口来向这2个信道进行数据的发送和接收呢?
2.3 C/S模式
client客户端(多,从);server服务端(单,主)
所有的从设备主动 向主设备进行请求,主设备接收到这个请求后,进行解析并响应(服务器回给客户端)。在这个过程中,服务器先执行,在服务器机器上等待客户端的请求。
2.4 UDP服务器编程模型
物理接口层:不用编,有网卡来提供
网络层:不用编,已经设置好IP了
传输层:可靠/不可靠
UDP最简单:不考虑可靠传输,省略了很多麻烦(数据冗余:定义大量数据结构来支持可靠性)
-
socket()获取操作系统抽象数据结构的对象。
只需要关注这一个对象就行了

Q指的就是queue结构
-
主动的先执行,等待客户端的请求,客户端的请求包到达服务器。
那么如何这个数据包能够正确地找到服务器的进程呢?
所有的操作系统都有pid(进程号),服务器就会有一个进程号,如果客户端知道服务器的进程号不就能连了吗?但是客户端和服务端不在一个机器啊,是不会知道服务端的进程号的。因此进程号需要映射转换为端口号。
主动执行:在服务器上开后门,这里的后门就是开了一个端口号,对应一个程序

上图,UDP开了两个端口号5353和844
bind()也是一个系统调用,用来把端口打开,但是需要指定开的门
不指定也可以,系统会随机指定一个。服务器随便开一个,客户端不好找,建议手动指定端口号,这样可以更方便的找到对应的服务。
-
服务器第3个系统调用:服务器等待有新的客户端发来请求
recvfrom-针对udp服务,recvfrom会从Recv-Q取值,然后往上传
recv-针对tcp服务,会把数据往底层传输,底层会进行发送确认,recv收到的数据包都是发送确认过的
2.5 UDP客户端编程模型
-
UDP能发就发,大不了没人接收,最终数据包就湮灭在链路上了。因此UDP发数据包跟有没有服务器都不重要,它是不知道自己能不能收到的。
-
socket()获取操作系统抽象数据结构的对象
-
bind()不建议做,改填写自己的端口,发送UDP数据包,src ip:port dest ip:port bind(88991)
客户端代码会在不同的机器上运行,无法保证每个客户端都没有使用8891的端口号,因此不调用bind,src ip:port没有信息
为了能够将这个数据发送到网卡上,内核就会自动的选择一个当前系统没有被使用的端口号作为src
-
sendto()向某一个IP和port上发送数据包
三、UDP协议抓包分析
-
UDP从协议角度上,只有目的端口、源端口的数据,不提供任何跟有序无丢失有关的传输帮助

-
UDP面向数据报协议,TCP面向连接的协议
TCP:彼此之间已经建立好关系了,彼此绑定了,一个服务只有一个链接
UDP:不需要和客户端建立连接,就像是丢报纸,直接丢给客户端(收不收到无所谓了)

-
UDP丢包:服务器根本就不存在(对应的端口号没有),UDP到了网络层,网络传送给传输层,传输层没有缓存来存这个数据,自然这个数据就丢失了
还有一种丢包:链路和路由选择时,会引起丢失
可靠传输:有超时重传机制,发送端要暂存这个数据包,但是这个在UDP中是不具有的,UDP是不可靠传输
UDP的数据包在网络传输中,信号衰减没了
如果服务器开着,没有端口号,会发不存在端口号的报错

-
假丢包:服务器存在,端口号也正常的,但是由于服务器的执行太慢了(比如:getchar();),迟迟不能执行到recvfrom的接口处,此时数据包到达该机器后,分配给UDP层,UDP层发现数据包的端口和我的一样,把这个数据包暂时存放在缓存区里,缓存区里是接收数据包(只要是端口号是这个服务器,就接收,仓库里按照数据包进行管理)
数据包没有发现粘包
在UDP中,缓存区就像是放了很多很多大小一致的箱子 (毕竟箱子是有限的,当数据包过多时,在发送数据包时就会发生丢包了),用来存放每个包,当取的时候直接取箱子就好了,不会发生粘包。
UDP没有发送确认机制的缓存,但是会有存储数据包的缓存,UDP会收到来自五湖四海的数据包,因此就只能一个结构体一个结构体的保管。只是这个缓存区里的数据,传输层确认这个数据是否有序,是否丢失,不确定。
但是TCP就不一样了,容易发生粘包(TCP缓存区里只能存放一个源地址的信息)
-
UDP的缓存怎么知道哪个是一个包呢?

定长。如果数据包过大,就会丢掉,或者剩下一部分
四、小结
相信你已经对UDP有一个深入的了解了,接下来,我们将带来一个新的协议TCP,或许它和UDP有这样那样相同或者不同的地方亟待我们去探索。