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


