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

相关推荐
太行山有西瓜汁2 小时前
达梦DTS工具:批量导出与导入DDL脚本完整指南
运维·服务器·数据库
蓝晶之心2 小时前
Linux rsync ssh方式数据备份
linux·运维·服务器
fengyehongWorld2 小时前
Linux sudo命令
linux·运维·服务器
WG_172 小时前
Linux:缓冲区_glibc封装
linux·运维·服务器
Macbethad3 小时前
Linux网关应用技术报告
网络
旺仔Sec3 小时前
2026年河北省职业院校技能大赛“网络系统管理”(高职组)网络构建样题
运维·服务器·网络
爱尔兰极光3 小时前
计算机网络--网络层
运维·服务器·计算机网络
Neolnfra3 小时前
Xshell SSH 连接故障排查
运维·服务器·网络·ssh·xshell·运程连接
testpassportcn3 小时前
Cisco 300-540 SPCNI 認證考試介紹(CCNP Service Provider 專業考試)
网络·数据库