linux笔记归纳17:传输层协议UDP

传输层协议UDP

目录

传输层协议UDP

一、端口号

1.1.端口号概述

1.2.端口号范围

二、UDP协议

2.1.UDP协议端格式

2.2.UDP的特点

2.3.面向数据报

2.4.UDP缓冲区

2.5.UDP注意事项

2.6.基于UDP的应用层协议

三、报文


传输层:负责数据能够从发送端传输接收端

一、端口号

1.1.端口号概述

端口号(Port):标识一个主机上进行通信的不同的应用程序

在TCP/IP协议中,用源IP,源端口号,目的IP,目的端口号,协议号来标识一个通信

1.2.端口号范围

0~1023:知名端口号,HTTP、FTP、SSH等广为使用的应用层协议,端口号都是固定的

1024~65535:操作系统动态分配的端口号,比如客户端程序的端口号

  • SSH服务器:22
  • FTP服务器:21
  • TELNET服务器:23
  • HTTP服务器:80
  • HTTPS服务器:443

查看端口号:

bash 复制代码
cat /etc/services

注:一个进程可以绑定多个端口号,一个端口号只能表示一个进程

二、UDP协议

应用层的报文会序列化成字节流交给传输层,在传输层中增加UDP协议的报头

2.1.UDP协议端格式

**数据(有效载荷):**应用层报文

**报文分离:**8字节定长报头,便于与数据分离

**上层分用:**根据目的端口号,将数据交给上层

内核协议的端口号是16位,所以在应用层也为16位

如果校验和出错,就会直接丢弃

2.2.UDP的特点

UDP传输类似于寄信

  • 无连接:知道对端的IP和端口号就直接进行传输,不需要建立连接(Connection)
  • 不可靠:无确认机制,无重传机制,如果发生网络故障无法发送,不会给应用层返回错误信息
  • 面向数据报:不能灵活控制读写数据的次数和数量

2.3.面向数据报

应用层交给UDP的报文无论多长

UDP按原样发送,不会拆分合并(TCP:可能读到半个或者一个半的报文)

  • 发送端调用一次sendto,就会产生一个UDP报文
  • 接收端调用一次recvfrom,就完整读出一个报文

报文边界:8字节定长报头 + 应用数据总字节

所以UDP的报文都是独立个体,报文边界清晰

而TCP没有边界,多次send的数据黏在一起,应用层手动区分

**注:**协议的本质就是结构体

与应用层协议不同的是,内核的协议不需要序列化与反序列化

双方在操作系统中都是用C语言实现,可以直接传递结构体对象

2.4.UDP缓冲区

UDP没有真正的发送缓冲区,调用sendto会直接交给内核

(在TCP中,对方收到报文之前,发送缓冲区数据不能清空,为了能够重传,确保可靠性)

UDP具有接收缓冲区,保证上层在工作时也能接收到数据

接收缓冲区不能保证收到的UDP报文顺序与发送顺序一致

如果接收缓冲区满了,再到达的UDP报文就会被直接丢弃

2.5.UDP注意事项

UDP能传输的数据最大长度:64K(含UDP报头)

如果需要传输的数据超过64K,需要在应用层手动分包,多次发送,并且在接收端手动拼装

2.6.基于UDP的应用层协议

NFS:网络文件系统

TFTP:简单文件传输协议

DHCP:动态主机配置协议

BOOTP:启动协议

DNS:域名解析协议

三、报文

应用层进行报文的解析是基于时钟中断

从网络中读取报文是基于外部网卡中断

所以报文处理不影响操作系统读取报文

在操作系统内部,可能会同时存在大量的报文

操作系统需要对报文进行管理,先描述再组织

cpp 复制代码
struct sk_buff
{
    /* These two members must be first. */
    struct sk_buff *next;
    struct sk_buff *prev;
    struct sock *sk;
    struct skb_timeval tstamp;
    struct net_device *dev;
    struct net_device *input_dev;

    union
    {
        struct tcphdr *th;
        struct udphdr *uh;
        struct icmphdr *icmph;
        struct igmphdr *igmph;
        struct iphdr *ipiph;
        struct ipv6hdr *ipv6h;
        unsigned char *raw;
    } h;

    union
    {
        struct iphdr *iph;
        struct ipv6hdr *ipv6h;
        struct arphdr *arph;
        unsigned char *raw;
    } nh;

    union
    {
        unsigned char *raw;
    } mac;

    struct dst_entry *dst;
    struct sec_path *sp;

    /* These elements must be at the end, see alloc_skb() for details.  */
    unsigned int truesize;
    atomic_t users;
    unsigned char *head,
                  *data,
                  *tail,
                  *end;
};

所谓的封装和解包,本身是移动data指针在缓冲区的指向,加减对应层的协议长度

相关推荐
whyutianict_vv17 分钟前
云计算 HCIE 认证体系解析:HCIA/HCIP/HCIE 三级科目与知识边界
linux·运维·云计算
0+1117 小时前
Linux --从 poll 到 epoll多路转接
linux·服务器·1024程序员节
青瓦梦滋7 小时前
WebSocket协议
linux·服务器·网络·c++·websocket·网络协议·http
2601_9498477510 小时前
bcrypt.js 跨端三方库仓颉适配全流程
linux·运维·ubuntu
m0_6399069410 小时前
Linux 操作系统入门:目录结构、服务排查常用命令、Shell 脚本基础
linux·运维·后端
Li_RuiQi12 小时前
DAgger方法演进_独立学习笔记
笔记·学习·计算机视觉
水饺编程12 小时前
第2章:Linux 基础,exit 命令
linux·c语言·汇编
木子欢儿12 小时前
Debian 13 + vsftpd 搭建FTP服务
linux·服务器·前端·网络·debian
qq_谁赞成_谁反对13 小时前
甲方IT的成长之路--SG TCP网络优化工具--20261026
运维·服务器·udp·tcp
GeW14 小时前
新质生产力落地实践:企业级Linux迁移与数据库国产化
linux