Linux:传输层(1) -- UDP协议

1. 端口号

同一台主机的不同端口号(Port)标记了主机上不同的进程,如下图所示:


在 TCP/IP 协议中 , 用 " 源IP", "源端口号", "目的IP", "目的端口号", "协议号" 这样一个五元组来标识一个通信 ( 可以通过netstat -n查看 );

1.1 端口号划分

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

1.2 知名端口号

  • ssh服务器, 使用22端口
  • ftp服务器, 使用21端口
  • telnet服务器, 使用23端口
  • http服务器, 使用80端口
  • https服务器, 使用443
  • 执行下面的命令, 可以看到知名端口号:cat /etc/services

那么此时就会有 两个问题:

  • 一个端口号是否能被多个进程bind?-- 默认情况下,一个端口号在同一时间不能被多个进程绑定到同一个IP地址,当然会有写特殊的处理。
  • 一个进程能否bind、多个端口号?-- 是可以的,一个进程可以创建多个套接字,每个套接字绑定到不同的端口上。

2. netstat

netstat是一个用来查看网络状态的重要工具.
语法:netstat 选项
功能:查看网络状态
常用选项

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

pidof
在查看服务器的进程 id 时非常方便 .
语法 : pidof 进程名
功能 :通过进程名 , 查看进程 id

3. UDP协议

3.1 格式

  • UDP采用固定长度的报头 -- 前8字节
  • 16位UDP长度:表示整个数据报(报头+有效载荷)的长度
  • 16位UDP校验和:发送前OS会按照算法计算出数据报的有效载荷并填充到报头中,在接收方接收到数据报以后,会以同样的算法计算校验和与包头中的对比,检验和不一致则直接丢弃

对报头的理解:OS层面定制的一种协议,其实就是一种结构化的数据对象,如下所示(这里只是示例,并不代表真实的结构体也一定如此):

cpp 复制代码
//UDP头部,总长度8字节  
typedef struct _udp_hdr  
{  
    unsigned short src_port; //远端口号  
    unsigned short dst_port; //目的端口号  
    unsigned short uhl;      //udp头部长度  
    unsigned short chk_sum;  //16位udp检验和  
}udp_hdr;  

3.2 UDP的特点

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

3.3 接受/发送缓冲区

我们在用的网络的IO接口并不是发送和接受和接口,实际上是一种拷贝的接口,将数据拷贝到缓冲区,再用OS决定何时发送和接收。

调用read/recv时,实际上是从传输层协议的接收缓冲区中读取(拷贝)数据;调用write/send时,时间上是将数据经过封装拷贝到了传输层协议的发送缓冲区,此时应用层的任务就结束了,由OS将数据刷新到网络中。就像下面这个图一样:

传输层的UDP/TCP协议都是全双工的,发送/接收数据不使用相同的公共缓冲区,在发送数据的同时也可以接受别人发来的数据。

注:

  • UDP是没有真正意义的发送给缓冲区的( 调用sendto会直接交给内核, 由内核将数据传给网络层协议进行后续的传输动作**),它具有接收缓冲区。**
  • 我们注意到 , UDP 协议首部中有一个 16位的最大长度 . 也就是说一个 UDP能传输的数据最大长度是64K(包含UDP 部 )。然而64K 在当今的互联网环境下 , 是一个非常小的数字。 如果我们需要传输的数据超过64K, 就需要在应用层手动的分包 , 多次发送 , 并在接收端手动拼装。

3.4 基于UDP的应用层协议

NFS: 网络文件系统 、TFTP: 简单文件传输协议、DHCP: 动态主机配置协议、BOOTP: 启动协议 ( 用于无盘设备启动)、DNS: 域名解析协议

相关推荐
IT摆渡者3 分钟前
rocky Linux 根目录下扩展新硬盘空间
服务器
邪修king5 分钟前
Re:Linux系统篇(二十六):文件系统(二):Ext 文件系统底层详解:从 inode、块组到软硬链接,结合 Windows 讲透文件管理本质
android·java·linux
高亦真19 分钟前
今天是学习嵌入式的第38天
linux·学习·算法
志栋智能21 分钟前
超自动化巡检如何生成“有灵魂”的运维报告?
大数据·运维·人工智能·架构·自动化
凌风的跨境分享21 分钟前
Temu运营避坑指南:制造地点信息填写合规要点与批量优化方法
运维·服务器·人工智能
DYWorker00122 分钟前
Linux驱动子系统:中断子系统 —— Consumer和Provider(005)
linux·驱动开发
草莓熊Lotso26 分钟前
【Redis 进阶】主从复制深度解析:从配置落地到 PSYNC 同步原理
linux·开发语言·网络·数据库·redis·缓存·php
Splashtop高性能远程控制软件36 分钟前
微软 2026 年 9 月补丁星期二技术分析:974 个漏洞的分级修复优先级清单
运维·安全·自动化·远程工作·splashtop
Wang's Blog1 小时前
Java框架快速入门: Spring Security+OAuth2之单点登录(SSO)实战
服务器·spring·状态模式
ShineWinsu1 小时前
对于Git:远程操作的超详细保姆级解析
linux·git·gitee·github·远程仓库·分布式版本控制系统·远程操作