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

相关推荐
SCandL1522 小时前
k8s service
linux·容器·kubernetes
噜~噜~噜~2 小时前
操作系统笔记-2.3.2.1 进程互斥的软件实现方法
笔记·操作系统
云贝教育-郑老师3 小时前
【麒麟服务器系统交付:一个DBA的六年信创实战笔记】
服务器·笔记·dba
会飞的土拨鼠呀3 小时前
Linux的存储使用率应该如何计算
linux·运维·服务器
玖玥拾4 小时前
LeetCode 392 判断子序列
笔记·算法·leetcode
摇滚侠4 小时前
《SpringBoot 3:入门与应用实战》第 7 章 AOP 思想与实现 阅读笔记 15
java·spring boot·笔记
weixin_511255215 小时前
NGINX常用配置
linux·服务器·nginx
摇滚侠5 小时前
《SpringBoot 3:入门与应用实战》第 7 章 AOP 思想与实现 阅读笔记 14
spring boot·笔记·后端
昌原的儿子LEO6 小时前
进程和线程(2)
linux·服务器·网络