• 传输层协议——UDP


    1. 认识知名端口号

    ssh服务器, 使用22端口
    ftp服务器, 使用21端口
    telnet服务器,使用23端口
    http服务器, 使用80端口
    https服务器, 使用443端口


    0-1023: 知名端口号,HTTP、FTP、SSH应用层协议,端口号是固定的
    1024-65535 :操作系统动态分配的端口号,客户端程序的端口号,就由操作系统从这个分为分配的

    2. netstat

    netstat 是一个用来查看网络状态的重要工具

    输入 netstat -nltp

    n :拒绝显示别名,能显示数字的全都转化为数字


    若输入 ltp,则发现不会显示数字,而显示对应的别名
    l : 只查看 listen 状态


    输入 netstat -ntp

    t:只查TCP
    p:显示更多的进程信息


    若将p去掉,输入 netstat -nt

    就不显示对应的PID这一列的信息了


    若输入 netstat -np 即将系统中的协议基本上都查出来了


    输入 netstat -nup ,只查udp


    输入 netstat -naup ,显示所有udp服务

    a:显示所有的条目

    3. pidof

    在服务器查看服务器的进程id时,非常方便

    输入 pidof +进程 ,获取对应进程和子进程的PID

    4. UDP协议

    UDP协议端格式

    有效载荷一定是上层——应用层 给的,上层通过系统调用 把数据拷过来的
    UDP报头的宽度是0-31,表示报头所对应的字节数 (4字节)


    1. 报头和有效载荷如何分离?
    报头是固定长度 8字节,剩下的就是有效载荷

    通过16位UDP长度,整体 减去 8字节 即 有效载荷的长度


    2. 有效载荷如何做到向上交付的?
    UDP报头中包含16位目的端口号,将一个报文发送到主机上,根据目的端口号向上交付给应用层,绑定该端口号的进程


    报头(协议)的本质:结构化数据
    基于 struct 有两种数据类型,一种为结构体,另一种为位段

    struct udp_header 结构体 内部 包含 源端口号、目的端口号 、udp长度、校验和


    借助位段的方式,取整形int的4字节中的16个比特位


    将缓冲区数据从应用层拷贝给操作系统内部

    提供一段缓冲区,定义一个指针p,去指向缓冲区
    因为报头大小是固定长度8字节,让p向后移动8个单位
    再将应用层的数据拷贝到对应的位置中


    再将指针p,指向最开始位置,并将p强转成 struct udp_header类型 ,指向结构体中的源端口号、目的端口号 、udp长度、校验和


    该报文经过网络,经过协议栈被对方收到了
    再定义一个指针s,,让s+8,再次指向有效载荷


    将s强转成 struct udp_header类型 ,指向结构体中的源端口号、目的端口号 、udp长度、校验和

    UDP的特点

    无连接:知道 对端的IP和端口号 就直接传输,不需要连接
    不可靠:若网络故障段无法发送对方,UDP协议也不会给应用层返回任何错误信息

    面向数据报:不能够灵活的控制读写数据的次数和数量

    面向数据报的理解

    因为UDP有自己固定的报头长度8字节,所以UDP能够知道自己的有效载荷多长
    不靠上层,在底层就自动知道报文和有效载荷的长度
    所以就能保证向上交付的 一定是独立的、完整的 有效载荷
    不用自己处理,只要发的是完整的,收的就是完整的,对方发几次,收几次
    由底层交上来,独立的报文,称为面向数据报

    即应用层给UDP多长的报文,UDP原样发送,既不拆分,也不会合并

    缓冲区理解

    UDP对应数据一定是完整的,所以有数据直接交给下层
    所以UDP不需要 发送缓冲区

    收到一个保文,可上层来不及处理,就需要接收缓冲区
    该缓冲区 并不是用来保证可靠性,而是尽可能保证不要丢包,如果缓冲区满了,再达到的数据就会被丢弃
    如:在淘宝上买了五件商品,编号为1-5,先买的是1号商品,时间是不确定的,所以1-5号 谁先谁后到 是不确定的
    这种情况称为 接收报文出现乱序的情况
    乱序是不可靠的表现,所以UDP不考虑
    UDP接收缓冲区,但不保证 接受报文是有序的

  • 相关阅读:
    redis的生产环境启动方案
    【机器学习】交叉验证 Cross-validation
    【JAVA】飞机大战
    Codeforces Round #801 (Div. 2) and EPIC Institute of Technology Round(C,D题解)
    FreeMarker详细介绍
    Windows环境VSCode配置OpenCV-项目配置(二)
    数据库备份
    2023CCPC重庆经验小结
    期末论文LaTeX模板
    Java——线程&进程
  • 原文地址:https://blog.csdn.net/qq_62939852/article/details/132840073