目录
传输层
端口号
端口号范围划分
认识知名端口号(Well-Know Port Number)
netstat
pidof
UDP协议
UDP协议端格式
UDP的特点
面向数据报
UDP的缓冲区
UDP使用注意事项
基于UDP的应用层协议
UDP详解🌷
传输层
在TCP/IP协议中可以把网络简单的划分为四个部分:
自顶向下分别是应用层、传输层、网络层和数据链路层;
传输层的功能:负责数据能够从发送端传输到接收端,但数据在实际的传输过程中是贯穿整个网络协议栈的;
在传输层中,我们主要学习两个协议:UDP协议和TCP协议;
上篇博客中讲到的HTTP协议是应用层的协议,它是基于传输层的TCP协议设计的;
端口号
端口号
(Port)
标识了一个主机上进行通信的不同的应用程序
;
一个进程通常是可以绑定多个端口号的,但一个端口号只能被一个进程所绑定,因此在网络通信时,大都是一个进程对应一个端口号;
在
TCP/IP
协议中
,
用
"
源
IP", "
源端口号
", "
目的
IP", "
目的端口号
", "
协议号
"
这样一个五元组来标识一个通信
(
可以通过
netstat -n
查看
);
端口号范围划分
- 0 - 1023:知名端口号, HTTP, FTP, SSH等这些广为使用的应用层协议, 他们的端口号都是固定的;
- 1024 - 65535:操作系统动态分配的端口号,客户端程序的端口号,就是由操作系统从这个范围分配的;
认识知名端口号(Well-Know Port Number)
有些服务器是非常常用的
,
为了使用方便
,
人们约定一些常用的服务器
,
都是用以下这些固定的端口号:
- ssh服务器, 使用22端口;
- ftp服务器, 使用21端口;
- telnet服务器, 使用23端口;
- http服务器, 使用80端口;
- https服务器, 使用443端口;
使用命令:
vim /etc/services
可以看到知名端口号;或执行如下命令:
cat /etc/services
我们自己写一个程序使用端口号时
,
要避开这些知名端口号;
netstat
netstat
是一个用来查看网络状态的重要工具;
语法
:
netstat [
选项
]
功能
:查看网络状态
常用选项
:
- n 拒绝显示别名,能显示数字的全部转化成数字
- l 仅列出有在 Listen (监听) 的服務状态
- p 显示建立相关链接的程序名
- t (tcp)仅显示tcp相关选项
- u (udp)仅显示udp相关选项
- a (all)显示所有选项,默认不显示LISTEN相关
我们平常查看TCP进程的命令 netstat -nltp
我们平常查看TCP进程的命令 netstat -nlup
pidof
在查看服务器的进程
id
时非常方便;
语法
:
pidof [
进程名
]
功能
:通过进程名
,
查看进程
id
UDP协议
UDP协议端格式
- 16位UDP长度, 表示整个数据报(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,
就需要在应用层手动的分包
,
多次发送
,
并在接收端手动拼装
;
基于UDP的应用层协议
- NFS: 网络文件系统
- TFTP: 简单文件传输协议
- DHCP: 动态主机配置协议
- BOOTP: 启动协议(用于无盘设备启动)
- DNS: 域名解析协议
当然, 也包括你自己写UDP程序时自定义的应用层协议;
如果上述文章对您有所帮助的话,还请点赞👍,收藏😉,关注🎈