• 传输层——UDP


    再谈端口号

    端口号标识主机上特定的程序,如http的默认端口是80,我们就可以通过ip+port来找到对应的主机

    端口号的划分

    • 0-1023:知名端口号,HTTP,FTP,SSH等这些广为应用的协议,他们的端口号都是固定的
    • 1024-65535:操作系统动态分配的端口号,客户端程序的端口号就是在这个范围内

    知名端口号

    有些服务器是非常常用的,为了使用方便,人们约定一些常用的服务器,都是用以下的固定端口号

    • http :80
    • ssh:22
    • ftp: 21
    • https:443
    • telnet :23

    执行这个命令可以查看知名端口号

    cat /etc/services
    
    • 1

    传输层命令

    pidof

    获得进程的pid
    pidof [进程名]
    在这里插入图片描述

    netstat

    用来查看网络状态
    n:查看信息的时候,把全部东西都显示成数字,不带n就是按照文件名和主机名的形式来进行展示
    在这里插入图片描述

    l:查看监听状态,不带的话,就是查看普通状态的套接字
    在这里插入图片描述
    t:代表的就是查看TCP的协议 ,同理u代表的就是UDP
    在这里插入图片描述
    在这里插入图片描述
    p:就是process进程,显示建立相关链接的程序名
    在这里插入图片描述

    UDP

    用户资料包协议

    UDP概述

    UDP 作为传输层的协议,他规定了数据什么时候发送,发送多少的问题,交付给上层,是由目的端口号来完成的,有效载荷和数据进行分离的工作是由固定报文首部长度来实现的

    在这里插入图片描述

    UDP过程分析

    当对端UDP 层获取到这个报文的时候,先识别8字节,然后就可以拿到这个报文的长度是多少,测试报文有没有出错,然后通过16为目的端口号,得知要标识交付给上一层的哪一个协议

    一些特点:

    • 报文通过目的端口号进行报文的分用,通过定长找到对应的报文长度,字段进行获取有效载荷
    • UDP没有任何一个填充字段或者选项,说明他的内容很简单
    • UDP 支持一对一,一对多,多对一,和多对多的交互通信,UDP 可以提供全多工的服务,只不过不可靠

    主要特点

    1. 无连接知道对端的IP和端口号就直接进行了传输,不需要建立连续
    2. 不可靠没有确认机制没有重传机制,如果网络故障没有发送给对方,UDP协议层也不会发送给应用层错误信息
    3. 面向数据包,应用层交给UDP多长的报文,UDP就会发送多少的报文,不会拆分也不会合并(不会出现粘包问题),要么不收,要么全收

    UDP 的缓冲区

    • UDP没有真正意义上的缓冲区,调用sendto之后,直接将数据交给内核,由内核将数据传给网络层协议进行后续的传输动作

    像read,recv,write,send这些,与其说是收发函数,不如说是拷贝函数
    像这些,拷贝之后到缓冲区里面,具体该数据,什么时候发送,发多少,完全由OS(传输层)控制,[提供传输数据的策略]

    • UDP具有接收缓冲区:
      接收缓冲区不能保证收到的UDP 数据报顺序和发送顺序一致,如果缓冲区满了,再达到的UDP数据报就会被丢弃

    UDP全双工
    (两个人在吵架的时候,你吵你的,它吵它的)
    与之相比半双工(两个人聊天,你说完我说,这种交叉式的方式)

    1. sendto,recvfrom可以同时被调用

    UDP报文格式

    在这里插入图片描述

    • 报头:是8个字节,是一个定长
      数据在自下而上的传输过程,首先一开始通常是我们的客户端主动连接服务器的

    • 既然如此,那么客户端肯定是知道服务器的端口号的,我们访问的服务器端口号肯定是众所周知

    • 长度:整个报文的长度,数据报的长度,最小为8字节(只要报头),最大为64K,如果传输的数据超过64K,需要在应用层手动的分包,多次发送,并在接收端手动拼接,最大是(2^16)

    • 校验值:检测UDP数据报是否有错误,有错就丢弃,在这里计算报文,还需要加上12字节的一个伪头部进行计算,这里的校验更多是为了验证发给我的这个协议,IP的校验偏重是否有错

    • Linux Kernel是用C语言写的,请问如何看待UDP报头

    struct udp_udr
    {
    	uint32_t src_port:16;//使用的就是位段
    	uint32_t dst_port:16;
    	uint32_t total:16;
    	uint32_t check:16;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    封装和解包

    1. 如何做到封装和解包
      • 封装: 就是添加上定长报头(8字节)
      • 解包 :就是把报头(8字节)和有效载荷进行分离,读取定长的报头,剩下的就是它的有效载荷
    2. 如何做到向上交付
      • a. 报头和有效载荷分离
      • b. 根据报头里面有16位目的端口号,获取之后就可以把有效载荷向上传递给对应的应用层协议

      所以我们在写代码的时候,需要绑定端口号,这样底层会转发给对应的进程

      • 端口号为什么是16位?:因为协议规定的

    使用UDP 的应用层协议

    在这里插入图片描述

  • 相关阅读:
    K线形态识别_跳空下跌三颗星
    力扣第695题 岛屿的最大面积 C++ DFS BFS 附Java代码
    定义无向加权图,并使用Pytorch_geometric实现图卷积
    springBoot
    微信加解密流程,证书作用讲解,官方SDK使用教程
    亚远景科技-如何应对汽车软件开发中质量与速度的冲突带来的挑战?
    SpringCloud进阶-搭建基本环境
    for break实现代码验证练习题韩顺平
    英伟达RTX4090又火了?这次是真的着火了
    关于#微信#的问题:win11想强制删除微信在系统托盘的图标,求帮助(操作系统-windows)
  • 原文地址:https://blog.csdn.net/m0_61567378/article/details/126413055