传输层协议之UDP
首先,我们大概对传输层协议是有一定的了解的,而对于传输层协议UDP和TCP,显然后者更难学懂,所以我们先通过UDP来暂时先浅尝一口传输层,下面我们先补充下端口的内容再深入UDP.
一.Port详细
端口号标识了一个主机进行通信的不同应用程序
一台主机的端口从0~65535:
0-1023:是知名端口号,例如HTTP是默认为80端口,HTTPS是默认为443端口,FTP是默认为21,SSH默认为22号端口
1024~65535:作系统动态分配的端口号. 客户端程序的端口号, 就是由操作系统从这个范围分配的
对于知名端口,如果是我们自己写的相关程序是要避开这些端口的,可以绑定OS动态分配的端口
在 TCP/IP 协议中, 用 "源 IP", "源端口号", "目的 IP", "目的端口号", "协议号" 这样一个五元组来标识一个通信,知道这个对于我们后续UDP学习非常重要
下面我们来解决一些特别有意思的问题:
一个进程是否可以 bind 多个端口号?
显然,一个进程是可以绑定多个端口的,我们知道一个进程可以打开多个文件描述符,而一个描述符对应一个端口,也就是说一个进程就可以绑定多个端口。一个端口号是否可以被多个进程 bind?
一般来说一个端口号只能被一个进程绑定,但是在特俗情况下一个端口是可以被多个进程绑定的,例如:父进程绑定一个端口号,而子进程是也可以绑定该端口号。
二.UDP协议
下面我们来看看UDP报文格式:
16 位 UDP 长度, 表示整个数据报(UDP 首部+UDP 数据)的最大长度
如果校验和出错, 就会直接丢弃,至于检验和是如何检验的,大家可以自行去了解下,这个不太重要
下面我们再来看看UDP的特点:
无连接: 知道对端的 IP 和端口号就直接进行传输, 不需要建立连接;
不可靠: 没有确认机制, 没有重传机制; 如果因为网络故障该段无法发到对方,UDP 协议层也不会给应用层返回任何错误信息;
面向数据报: 不能够灵活的控制读写数据的次数和数量
UDP传输方式:
应用层交给 UDP 多长的报文, UDP 原样发送, 既不会拆分, 也不会合并;
用 UDP 传输 100 个字节的数据:
如果发送端调用一次 sendto, 发送 100 个字节, 那么接收端也必须调用对应的一次 recvfrom, 接收 100 个字节; 而不能循环调用 10 次 recvfrom, 每次接收 10 个字节;
UDP 没有真正意义上的 发送缓冲区. 调用 sendto 会直接交给内核, 由内核将数据传给网络层协议进行后续的传输动作;
UDP 具有接收缓冲区. 但是这个接收缓冲区不能保证收到的 UDP 报的顺序和发送 UDP 报的顺序一致; 如果缓冲区满了, 再到达的 UDP 数据就会被丢弃;
UDP 的 socket 既能读, 也能写, 这个概念叫做 全双工
补充知识:
由于UDP的长度限制到64K(包含首部),所以如果文件大小超过64K,就需要我们手动分包和拼装了
UDP可以说是传输层中对比与TCP相对较为简单的一种协议了,内容其实并不多,大家一学就会了,后面我们讲到TCP时大家对UDP可能对此就会有更加深入的了解了。
最后,感谢大家的支持!!!