UDP客户服务器模型和UDP协议

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有这样那样相同或者不同的地方亟待我们去探索。

相关推荐
贞明电子13 小时前
工业三色报警灯怎么接入项目系统?开关量与RS485控制应用指南
运维·网络·微信公众平台·贞明电子
明天也要努力学习13 小时前
HTTP 协议的基本格式和 fiddler 的用法
网络协议·http·fiddler
HideF14 小时前
Linux
linux·服务器·网络
万联WANFLOW14 小时前
海外网络故障怎么排查?Cloudflare 三季度断网报告解读与 mtr 实战
运维·网络·故障分析
听风说ml14 小时前
socket编程 【C语言】
c语言·udp·tcp·socket编程
sbjdhjd14 小时前
网工进阶笔记:H3CSE 园区网全栈技术与协议汇总
网络·笔记·云计算·ssh·网络工程·vlan·aaa
Ruiery16 小时前
Linux 6.6内核内存管理深度解析(十三):slab/slub 分配器
linux·运维·服务器
taktok_ai16 小时前
用 cc-switch 连接 Taktok
网络
乌恩大侠16 小时前
从 AI-RAN 到 AI Agent:基于 NVIDIA Nemotron 构建 5G/6G 智能网络故障诊断系统
服务器·人工智能·5g·o-ru·ai-ran·电信大模型
小嘉丶学长18 小时前
Day14 · 字典与集合
java·开发语言·网络·python·学习·1024程序员节