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指针在缓冲区的指向,加减对应层的协议长度

相关推荐
沫璃染墨2 小时前
《Linux工程实践篇(一):认识设计模式——从日志系统看策略模式》
linux·c++·安全·设计模式·策略模式
工作10年+,存储芯片行业3 小时前
Linux NVMe 中断排查与性能优化:CPU 亲和性
linux·运维·服务器·windows·性能优化·ssd·pcie
wuminyu3 小时前
ForkJoinPool内部WorkQueue的Lock-Free数组操作以及并发任务窃取原理剖析
java·linux·c语言·jvm·c++
她说彩礼65万3 小时前
C语言 堆区和栈区
java·linux·c语言
一号弯3 小时前
装完LINUX,请先新建日常用户
linux·运维·服务器
驭渊的小故事4 小时前
linux 基础命令 + git 仓库创建和配置命令
linux·git
AOI小白新手上路4 小时前
anomalib 缺陷检测复现笔记:从跑通库到 EfficientAD 落地
人工智能·笔记·机器学习
ShineWinsu4 小时前
对于Redis:主从复制的解析
linux·数据库·c++·redis·缓存·面试·主从复制
Lsetea4 小时前
OpenSSL verify报unable to get issuer certificate:error 2与partial_chain排查
linux·https·ssl证书·openssl·证书链
许彰午4 小时前
03-Linux环境准备依赖包内核参数与用户组
linux·运维·服务器·数据库