【网络】传输层协议UDP

之前我们已经把应用层http协议说完了,我们知道一些优秀的应用层协议会绑定知名端口号,就是说它们的端口号默认是固定的,比如http是80,https是443,ssh是22等,我们也可以通过查看下面的文件来查看知名端口号

复制代码
cat /etc/services

并且我们还要知道端口号到进程是唯一的,就是说,一个进程可以绑定多个端口号,但是一个端口号只能被一个进程绑定

下面我们正式进入UDP
UDP 全称用户数据报协议(User Datagram Protocol)

下面是UDP的报文格式

我们说传输层协议是操作系统的一部分,所谓的协议在C语言中不过是结构体,我们可以在Linux内核源代码中看到相关结构体定义

也就是说报头占8个字节,这里的16位UDP长度指的是报头+正文的总长度(字节),16位表示的最大的数是2^16-1,也就是说UDP一次发送的报文长度是64kb-1,如果一次发送的数据超过这么多,sendto就会调用失败
一个很关键的问题就是UDP如何解包和分用,解包其实就是通过16位UDP长度,这个长度减去报头的八个字节其实就是报文的长度

并且根据目的端口号就可以向上交付给应用层的某个进程,如何通过端口号找到相对应的进程呢?我们可以认为OS为我们维护一张hash表,表中存着端口号到进程PCB的映射关系
UDP没有发送缓冲区,并且它也不需要,调用sendto时数据会直接交给内核,内核将数据交给下面的网络层进行后续的传输动作

但是UDP是有接收缓冲区的,但是这个接收缓冲区不能保证收到的UDP报的顺序和发送UDP报的顺序一致;并且如果缓冲区满了,再到达的UDP数据就会被丢弃

这也就是为什么UDP是不可靠的,当然我们不能把它看成一种缺点,而是一种特点,因为不可靠也就决定了它是比较简单的;如果要添加可靠性,那协议就会复杂,这样的协议叫做TCP
UDP的特点:

**无连接:**知道对端的IP和端口号就直接进行传输,不需要建立连接

**不可靠:**没有确认机制,没有重传机制;如果因为网络故障没有把信息发到对方,UDP协议层不会给应用层返回任何错误信息

**面向数据报:**发送方如何发,接收方就要如何收(调用多少次write,就要调用多少次read),不能够灵活的控制读写数据的次数和数量

相关推荐
艾莉丝努力练剑25 分钟前
【AI大模型接入SDK】ChatGPT API
网络·c++·人工智能·websocket·网络协议·学习·chatgpt
4A广告文案8 小时前
名创优品在成都开了家“乐园”,顺便造了个新IP
网络·网络协议·tcp/ip
Fnetlink19 小时前
Fnet 云网安 260904
网络·人工智能·安全·web安全·网络安全
天远数科9 小时前
风险治理实战:基于天远车信盟出险构建自动化理赔核保流水线
java·网络·人工智能·自动化
志栋智能10 小时前
安全超自动化如何支持大规模安全运营?
网络·安全·自动化
星恒讯工业路由器10 小时前
农村宽带覆盖难?无线专网方案正在改写“最后一公里”规则
网络·物联网·网桥·无线网桥·农村宽带覆盖·无线专网·户外网络
uoKent10 小时前
计网中的HTTP/HTTPS
网络协议·http·https
tang7778910 小时前
反爬虫场景下代理IP池的动态扩容与失效IP自动清理方案实现
linux·服务器·网络·爬虫代理·住宅代理ip
yuewell_ai11 小时前
机器人调度通讯怎么设计才不会被网络抖动瘫痪
网络·机器人·php
TechWayfarer11 小时前
Cloudflare 9·15新政倒计时:用IP风险画像识别AI爬虫,防止误伤Googlebot
网络·人工智能·爬虫·python·tcp/ip·网络安全