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

📅 2026/8/27 9:19:02
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服务器22FTP服务器21TELNET服务器23HTTP服务器80HTTPS服务器443查看端口号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域名解析协议三、报文应用层进行报文的解析是基于时钟中断从网络中读取报文是基于外部网卡中断所以报文处理不影响操作系统读取报文在操作系统内部可能会同时存在大量的报文操作系统需要对报文进行管理先描述再组织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指针在缓冲区的指向加减对应层的协议长度