前言
上几文章我们讲解了应用层协议Http和Https,要知道应用层协议有很多,这些都是程序员自己定制的,而真正要传输的时候,是要在操作系统的传输层进行的,今天我们就来学习一下传输层协议Udp的
标识一个通信
要进行跨网络通信,就要标识一个网络通信的唯一性
通常需要:源IP、目的IP、协议号、源端口号、目的端口号这五个信息来标识一个网络通信。
端口划分
-
0-1023
属于知名端口号,Http、FTP、SSH等广为使用的应用层协议,端口号是固定的。- SSH,使用22端口
- FTP,使用21端口
- telnet,使用23端口
- Http,使用80端口
- Https,使用443端口
可以使用以下命令查看知名端口号:
cat /etc/services
- 1024-65535
操作系统动态分配对策端口号,客户端程序的端口号就是从这里面随机分配的。
我们设计端口的时候,要避开这些知名端口。
netstat
是一个查看网络状态的工具
选项:
- n,拒绝显示别名,能够数字化就全数字化
- l ,只列出在监听状态(listen)的服务状态
- p,显示建立相关链接的程序名
- t ,只显示tcp相关
- u,只显示udp相关
- a,显示所有选项,默认不显示listen相关
pidof
通过进程名查看进程id
Udp协议端格式
可以看到,Udp报头长度总共八个字节,其中,十六位Udp长度表示数据报的报头+报文总共的大小,十六位校验和出错会直接将数据报丢弃。
而且由于十六位Udp长度的限制,TCP能传输的大小是有限的。一个Udp能传输的数据最大长度是64k,超过就需要在应用层手动分包多次传送,并在接收端手动拼装。
Udp特点
- 无连接,不需要建立连接,知道ip和端口号就能传输
- 不可靠,没有确认传传机制,udp不反回任何错误信息
- 面向数据报,不能灵活控制读写数据的次数和数量
- 简单。
面向数据报
应用层交给Udp多长的报文,Udp就要直接发送,不能拆分和并,例如:
发送端调用sendto,发送100字节,那么接收端必须调用一次recvfrom100字节,不能循环调用recvfrom,每次10字节
Udp缓冲区
Udp没有真正的发送缓冲区,调用sendto会直接将要发送的数据交给内核,由内核将数据传输给网络并进行后续动作
Udp具有接收缓冲区,但是这个缓冲区不保证Udp数据报的顺序,如果缓冲区满了,照样会被丢弃
也因此,Udp socket 既可以写也可以读,是全双工的。
基于Udp的协议
- NFS,网络文件系统
- TFTP,简单文件传输协议
- DHCP,动态主机配置协议
- BOOTP,启动协议
- DNS,域名解析协议