• 传输层协议 —— UDP


    目录

    一、端口号的划分范围

    二、认识知名端口号

    三、两个问题

    四、nestat和pidof命令

    五、UDP协议

    1. UDP首部格式

    2. UDP的特点

    3. 面向数据报

    4. UDP的缓冲区

    5. UDP使用注意事项

    6. 基于UDP的应用层协议


    一、端口号的划分范围

    端口号的长度是16位,因此端口号的范围是0 ~ 65535:

    • 0 ~ 1023:知名端口号。比如HTTP,FTP,SSH等这些广为使用的应用层协议,它们的端口号都是固定的。
    • 1024 ~ 65535:操作系统动态分配的端口号。客户端程序的端口号就是由操作系统从这个范围分配的。

    二、认识知名端口号

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

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

    执行下面的命令, 可以看到知名端口号 

    vim /etc/services

    三、两个问题

    1. 一个端口号是否可以被多个进程绑定?

            一个端口号绝对不能被多个进程绑定,因为端口号的作用就是唯一标识一个进程,如果绑定一个已经被绑定的端口号,就会出现绑定失败的问题。 

    2. 一个进程是否可以绑定多个端口号?

            一个进程是可以绑定多个端口号的,这与“端口号必须唯一标识一个进程”是不冲突的,只不过现在这多个端口唯一标识的是同一个进程罢了。

            我们限制的是从端口号到进程的唯一性,而没有要求从进程到端口号也必须满足唯一性,因此一个进程是可以绑定多个端口号的。

    四、nestat和pidof命令

    1. pidof命令可以通过进程名,查看进程id。

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

    其常见的选项如下:

    • n:拒绝显示别名,能显示数字的全部转换成数字。
    • l:仅列出处于LISTEN(监听)状态的服务。
    • p:显示建立相关链接的程序名。
    • t(tcp):仅显示tcp相关的选项。
    • u(udp):仅显示udp相关的选项。
    • a(all):显示所有的选项,默认不显示LISTEN相关。

    五、UDP协议

    1. UDP首部格式

    • 16位源端口号:表示数据从哪里来。
    • 16位目的端口号:表示数据要到哪里去。
    • 16位UDP长度:表示整个数据报(UDP首部+UDP数据)的长度。
    • 16位UDP检验和:校验和是为了提供可靠的UDP首部和数据而设计的,防止收到在网络传输中受损的UDP包;如果UDP报文的检验和出错,就会直接将报文丢弃。

    UDP如何将报头与有效载荷进行分离?

            UDP的报头当中只包含四个字段,每个字段的长度都是16位,总共8字节。因此UDP采用的实际上是一种定长报头,UDP在读取报文时读取完前8个字节后剩下的就都是有效载荷了

    UDP如何决定将有效载荷交付给上层的哪一个协议? 

            当目的主机收到该UDP报文之后,会根据报文当中的16位目的端口号,交付给应用层的某个进程。

    UDP数据封装

    • 当应用层将数据交给传输层后,在传输层就会创建一个UDP报头类型的变量,然后填充报头当中的各个字段,此时就得到了一个UDP报头。
    • 此时操作系统再在内核当中开辟一块空间,将UDP报头和有效载荷拷贝到一起,此时就形成了UDP报文。

    UDP数据分用

    • 当传输层从下层获取到一个报文后,就会读取该报文的前8个字节,提取出对应的目的端口号。
    • 通过目的端口号找到对应的上层应用层进程,然后将剩下的有效载荷向上交付给该应用层进程。 

    2. UDP的特点

    UDP传输的过程类似于寄信:

    1. 无连接: 知道对端的IP和端口号就直接进行传输, 不需要建立连接;
    2. 不可靠: 没有确认机制, 没有重传机制; 如果因为网络故障该段无法发到对方, UDP协议层也不会给应用层返回任何错误信息;
    3. 面向数据报: 不能够灵活的控制读写数据的次数和数量

    3. 面向数据报

    应用层交给UDP多长的报文, UDP原样发送, 既不会拆分, 也不会合并;
    用UDP传输100个字节的数据:
    • 如果发送端调用一次sendto, 发送100个字节, 那么接收端也必须调用对应的一次recvfrom, 接收100个字节; 而不能循环调用10次recvfrom, 每次接收10个字节;

    4. UDP的缓冲区

    • UDP没有真正意义上的发送缓冲区. 调用sendto会直接交给内核, 由内核将数据传给网络层协议进行后续的传输动作;
    • UDP具有接收缓冲区. 但是这个接收缓冲区不能保证收到的UDP报的顺序和发送UDP报的顺序一致; 如果缓冲区满了, 再到达的UDP数据就会被丢弃;
    • UDP的socket既能读,也能写,因此UDP是全双工的。

    5. UDP使用注意事项

    我们注意到, UDP协议首部中有一个16位的最大长度. 也就是说一个UDP能传输的数据最大长度是64K(包含UDP首部).

    然而64K在当今的互联网环境下, 是一个非常小的数字.
    如果我们需要传输的数据超过64K, 就需要在应用层手动的分包, 多次发送, 并在接收端手动拼装;

    6. 基于UDP的应用层协议

    • NFS:网络文件系统。
    • TFTP:简单文件传输协议。
    • DHCP:动态主机配置协议。
    • BOOTP:启动协议(用于无盘设备启动)。
    • DNS:域名解析协议。
  • 相关阅读:
    (动态规划)5. 最长回文子串 java解决
    kubernetes 存储流程
    创业可以做什么项目,六个轻资产创业项目推荐
    Vue入门
    Latex生成两种效果的表格
    基于bootstrap,企业内部管理系统后台框架前端源码,响应式布局
    docker修改mysql数据库密码,redis密码
    安卓请求权限
    抓到Dubbo异步调用的小BUG,再送你一个贡献开源代码的机会
    如何生成一个足够安全又容易记住的密码?
  • 原文地址:https://blog.csdn.net/sjsjnsjnn/article/details/128113230