传输层协议--UDP
阿里云国内75折 回扣 微信号:monov8 |
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6 |
引入
传输层负责数据能够从发送端传输到接收端。
端口号Port
端口号标识了一个主机上进行通信的一个进程。
两个问题
1. 一个进程可以绑定多个端口号吗--可以
2.一个端口号可以绑定多个进程吗--不可以
我们需要维护的是一个端口号唯一确定一个进程这关系好比函数一个x只能唯一确定一个y才是函数关系但是y可以对应多个xy=x²是函数但是y²=x不是函数一个端口号只能绑定一个进程一个进程却可以绑定多个端口号
netstat指令
用来查看网络状况的重要工具
进程的标准输入VS命令行参数
pidof HttpServer | xargs kill -9
xargs 的作用 将标准输入的内容转化为命令行参数 HttpServer是程序名称
上面是一些引入的知识方便后面介绍使用。
UDP的协议格式
几乎任何协议都要解决2个问题
1 . 如何分离封装 2. 如何交付解包
1. 如何分离
UDP是固定长度的报头可以直接将报头和有效载荷分离
2. 如何交付
根据报头中的16位端口号进行向上交付进程绑定了端口号
1. 为什么我们在应用层编写代码时候每一次写端口号的时候都喜欢用 uint16_t ?
2.UDP是如何提取整个报文的
1. 因为协议用的是端口号是16位的
2. UDP具有将报文一个一个正确接受的能力的UDP是面向数据报的通过固定长度的报头可以获取到16位udp长度
理解报文本身
首先我们有一个很基本的认识操作系统的底层大部分都是C语言写的。报文在不同主机间通过网络交流传输肯定是有大量的报文的那OS该怎么管理他们呢C++以及java语言的学习者可能很容易想到类对象之类的东西但是 OS的底层主要是 C语言C是用的什么呢 --结构体
struct udp_hdr
{
uint32_t src_port:16; //源端口号
uint32_t dst_port:16; //目的端口号
uint32_t udp_len:16; //UDP长度
uint32_t udp_check:16; //udp 检验和
}
这个 大家有没有一点熟悉对位断 有想要进一步了解这方面知识的uu移步
https://blog.csdn.net/qq_59293418/article/details/122667301?sp
UDP的特点
无连接
不可靠
首先我想强调的一点是这里的不可靠并不是一个贬义词和生活场景是不一样的。UDP不可靠的同时也确保了其简单和高效像现在很多直播视频平台就喜欢用UDP协议其简单高效已于维护即使是偶尔出现掉帧数据包丢失等情况也是在大多数人可以接受的范围内的。
面向数据报
深入理解 IO类接口
之前写UDP或者TCP的相关代码时候经常会使用到 read/write/sendto/recvfrom/recv/send这些IO类接口。很容易以为这些函数是负责和网络交互的其实不然我们通过下面这个图简单分析以下
什么时候发送数据发送多少数据发送出错了怎么办
不用焦虑这些问题OS会处理的UDP不用负责这些。
所以我们有了这个结论 这些IO类接口本质的工作是将内容从用户层拷贝到内核层至于接下来的发送系类的事就安心交给OS就好了他们本身也只是 拷贝函数
UDP的全双工VS半双工
UDP的缓冲区
UDP本身没有真正意义上的发送缓冲区他只管发送不处理出错的问题
但UDP具有接收缓冲区所以UDP的socket既能读又能写这叫全双工
怎么直观理解全双工和半双工呢
在平常的正常人际交流中我们通常是比较客气绅士的两个人说话会等对方说完确认听清和理解后给出反应这就是半双工但是当我们有了冲突矛盾说话也没有那么客气了也不在乎别人说什么这个时候大家都在说话吵吵闹闹的状态全双工。
简单来说 全双工既在输出也在接收半双工只能进行单一的输出或者输入。