传输层协议UDP
目录
传输层
端口号
端口号范围划分
两个问题
1.一个进程能否绑定多个端口号?
2.一个端口号是否可以被多个进程 bind?
UDP 协议编辑
UDP 的特点
面向数据报
UDP 的缓冲区
UDP 使用注意事项
传输层
负责数据能够从发送端传输到接收端
端口号
在TCP/IP协议中,使用源ip,目的ip,源端口,目的端口,协议号这样的五元组表示一个通信
端口号范围划分
0~1023:知名端口号,HTTP, FTP, SSH 等这些广为使用的应用层协议, 他们的端口号都是固定的
1024~65535:操作系统动态分配的端口号,客户端程序的端口号就是操作系统在这个范围里分配的
两个问题
1.一个进程能否绑定多个端口号?
答案是可以的,我们在前面的文章里说过端口号实际上锁定的是套接字(socket),我们可以创建多个socket,当然就可以让这些socket套接字绑定多个端口号。
2.一个端口号是否可以被多个进程 bind?
答案是一般情况下是不可以的,但是我们可以手动设置,比如说我们在前面TCP编程里面写过setsockopt,这个函数就可以让我们的套接字修改为可重用端口号,当然,如果我们不指定的话就没办法绑定一个已经被别的套接字绑定过的端口号了,一旦我们指定了SO_REUSEPORT,那么这个套接字就可以绑定一个已经被绑定过的端口号了,我们在多个进程里都写这么一个套接字,那么我们就可以让多个进程绑定同一个端口号了。
当然了,端口号也是引用计数,套接字也是引用计数(因为表现上像个文件描述符,和文件描述符的引用计数方式一样)
UDP 协议

16 位 UDP 长度, 表示整个数据报(UDP 首部+UDP 数据)的最大长度
如果校验和出错, 就会直接丢弃
UDP 的特点
无连接: 知道对端的 IP 和端口号就直接进行传输, 不需要建立连接
不可靠: 没有确认机制, 没有重传机制; 如果因为网络故障该段无法发到对方,
UDP 协议层也不会给应用层返回任何错误信息;
面向数据报: 不能够灵活的控制读写数据的次数和数量
面向数据报
应用层交给 UDP 多长的报文, UDP 原样发送, 既不会拆分, 也不会合并;
例如:
用 UDP 传输 100 个字节的数据:如果发送端调用一次 sendto, 发送 100 个字节, 那么接收端也必须调用对应的一次 recvfrom, 接收 100 个字节; 而不能循环调用 10 次 recvfrom, 每次接收 10 个字
节;
UDP 的缓冲区
UDP 没有真正意义上的 发送缓冲区. 调用 sendto 会直接交给内核, 由内核将数
据传给网络层协议进行后续的传输动作;
UDP 具有接收缓冲区. 但是这个接收缓冲区不能保证收到的 UDP 报的顺序和
发送 UDP 报的顺序一致; 如果缓冲区满了, 再到达的 UDP 数据就会被丢弃
UDP 的 socket 既能读, 也能写, 这个概念叫做 全双工
UDP 使用注意事项
我们注意到, UDP 协议首部中有一个 16 位的最大长度. 也就是说一个 UDP 能传输的数
据最大长度是 64K(包含 UDP 首部)
然而 64K 在当今的互联网环境下, 是一个非常小的数字
如果我们需要传输的数据超过 64K, 就需要在应用层手动的分包, 多次发送, 并在接收端
手动拼装