目录
端口号:
查询各类服务的端口号
加深理解端口号:
UDP协议
UDP协议特点:
关于缓冲区:
内核层面理解UDP报文
端口号:
- 知名端口号:0 ~ 1023:被HTTP、SSH等应用层协议广泛使用的端口号(端口号与对应服务强关联),如果在linux云服务器上想要强制绑定知名端口号需要root权限!
- 操作系统自动分配的端口号:1024 ~ 65535,用户可以随意绑定
查询各类服务的端口号
cat /etc/services
加深理解端口号:
一个进程能否绑定多个端口号?一个端口号呢能否被多个进程绑定?
在Linux中存在描述进程的结构体--struct task_struct{...} ,操作系统内核中维护了一张哈希表以端口号为key值,进程的虚拟地址为value进行映射,一个key值只能对应一个进程地址,不然哈希冲突会很严重,但是相反,多个key可以映射同一个value,即同一个进程地址。
UDP协议
协议端格式:
UDP协议特点:
-
无连接 : 知道对端的 IP 和端口号就直接进行传输 , 不需要建立连接 ;
-
不可靠: 没有确认机制 , 没有重传机制 ; 如果因为网络故障该段无法发到对方 ,UDP 协议层也不会给应用层返回任何错误信息 ;
-
面向数据报: 不能够灵活的控制读写数据的次数和数量 ;
- 全双工通信
关于缓冲区:
UDP协议没有真正意义的和发送缓冲区,获得的数据直接通过操作系统内核发送给接收方。
UDP具有接收缓冲区,当缓冲区满时,再次到达的UDP数据就会被丢弃
注意:UDP协议的传输的最大长度是:64kb,如果要传输要超过64k的数据就需要在应用层手动的分包.并且在接收端进行手动的拼装。
内核层面理解UDP报文
在进行UDP协议传输的时候,OS内部的报文可能同时存在多种状态:1.向上交付 2.向下交付 3.是否丢弃......
OS内部为了管理这些报文,存在一个负责管理这些报文的结构体:
struct sk_buff{...};再通过双链表管理起来,把对报文的管理转换成对链表的增删查改!