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

相关推荐
AlanBruce4 小时前
摩尔信使MThings功能综述与应用使用指南
linux·自动化·plc·mthings·摩尔信使
老当益壮梁奶奶6 小时前
51单片机DS18B20温度传感器详解:单总线时序与C51驱动实现
笔记·stm32·单片机·嵌入式硬件·51单片机
小叶肥辉7 小时前
LangChain链和LangGraph图的学习笔记【三】——分别用langchain_openai库和langchain_community库调用大模型
笔记·python·langchain
从零开始的嵌入式之旅8 小时前
day44
arm开发·经验分享·笔记·嵌入式硬件
陈陈CHENCHEN9 小时前
【Linux】服务器根目录磁盘扩容操作记录
linux·运维·服务器
GeW10 小时前
RHCE快速拿证全攻略:考点拆解+实验强化+时间规划,一次通关
linux
码农小韩11 小时前
Linux应用开发(八)——TCP/IP网络编程基础
linux·嵌入式软件开发·linux操作系统·嵌入式操作系统·linux网络编程·linux应用
迷途之人不知返11 小时前
【进程】-5-进程优先级
linux
商业白皮书11 小时前
杭州企业做 GEO 怎么选服务商?B2B 制造、外贸出海与品牌连锁选型指南
笔记
fengyehongWorld11 小时前
Linux squid搭建基础代理服务器
linux·运维·服务器