这是我参与「第五届青训营 」伴学笔记创作活动的第 14 天
UDP协议
一、UDP协议简介
UDP 是User Datagram Protocol的简称, 中文名是用户数据报协议,是OSI(Open System Interconnection,开放式系统互联) 参考模型中一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务
UDP是传输层的协议,功能即为在IP的数据报服务之上增加了最基本的服务:复用和分用以及差错检测
二、UDP的特点
UDP提供不可靠服务,具有TCP所没有的优势,UDP的传输类似于寄信:
- 无连接: 知道对端的IP和端口号就直接进行传输, 不需要建立连接
- 不可靠: 没有确认机制, 没有重传机制; 如果因为网络故障该段无法发到对方, UDP协议层也不会给应用层 返回任何错误信息
- 面向数据报: 不能够灵活的控制读写数据的次数和数量
- UDP没有拥塞控制,能容 忍一些数据的丢失,但是不能允许有较大的时延
UDP常用一次性传输比较少量数据的网络应用,如DNS,SNMP等,UDP也常用于多媒体应用(如IP电话,实时视频会议,流媒体等)
三、UDP协议格式
- 源端口号,需要对方回信时选用,不需要时全部置0
- 目的端口号,在终点交付报文的时候需要用到
- 16位UDP长度, 表示整个数据报(UDP首部+UDP数据)的最大长度
- 如果校验和出错, 就会直接丢弃
四、面向数据报
应用层交给UDP多长的报文, UDP原样发送, 既不会拆分, 也不会合并
如果发送端调用一次sendto, 发送100个字节, 那么接收端也必须调用对应的一次recvfrom, 接收100个
字节; 而不能循环调用10次recvfrom, 每次接收10个字节
五、UDP的缓冲区
- UDP没有真正意义上的 发送缓冲区. 调用sendto会直接交给内核, 由内核将数据传给网络层协议进行后 续的传输动作
- UDP具有接收缓冲区. 但是这个接收缓冲区不能保证收到的UDP报的顺序和发送UDP报的顺序一致; 如果 缓冲区满了, 再到达的UDP数据就会被丢弃
六、端口号
端口(port)是伴随着传输层诞生的概念。它可以将网络层的IP通信分送到各个通信通道
端口号(Port)标识了一个主机上进行通信的不同的应用程序
端口号范围划分
- 0 - 1023: 知名端口号, HTTP, FTP, SSH等这些广为使用的应用层协议, 他们的端口号都是固定的
- 1024 - 65535: 操作系统动态分配的端口号. 客户端程序的端口号, 就是由操作系统从这个范围分配的
认识知名端口号
- ssh服务器, 使用22端口
- ftp服务器, 使用21端口
- telnet服务器, 使用23端口
- http服务器, 使用80端口
- https服务器, 使用443
可以用下面的命令查看知名端口号
cat /etc/services
其实就是端口号的内容存储在serveices这个文件里,用cat命令取出来而已
两个问题
- 一个进程是否可以bind多个端口号?
- 一个端口号是否可以被多个进程bind ?
如果进程先绑定一个端口号,然后在fork一个子进程,这样的话就可以是实现多个进程绑定一个端口号,但是不同的进程绑定同一个端口号是不可以的
七、基于UDP的应用层协议
- NFS: 网络文件系统
- TFTP: 简单文件传输协议
- DHCP: 动态主机配置协议
- BOOTP: 启动协议(用于无盘设备启动)
- DNS: 域名解析协议
- 用户自定义的协议