1. 认识知名端口号
ssh服务器, 使用22端口 ftp服务器, 使用21端口 telnet服务器,使用23端口 http服务器, 使用80端口 https服务器, 使用443端口
0-1023: 知名端口号,HTTP、FTP、SSH应用层协议,端口号是固定的 1024-65535 :操作系统动态分配的端口号,客户端程序的端口号,就由操作系统从这个分为分配的
2. netstat
netstat 是一个用来查看网络状态的重要工具
输入 netstat -nltp
n :拒绝显示别名,能显示数字的全都转化为数字
若输入 ltp,则发现不会显示数字,而显示对应的别名 l : 只查看 listen 状态
输入 netstat -ntp
t:只查TCP p:显示更多的进程信息
若将p去掉,输入 netstat -nt
就不显示对应的PID这一列的信息了
若输入 netstat -np 即将系统中的协议基本上都查出来了
输入 netstat -nup ,只查udp
输入 netstat -naup ,显示所有udp服务
a:显示所有的条目
3. pidof
在服务器查看服务器的进程id时,非常方便
输入 pidof 进程 ,获取对应进程和子进程的PID
4. UDP协议
UDP协议端格式
有效载荷一定是上层——应用层 给的,上层通过系统调用 把数据拷过来的 UDP报头的宽度是0-31,表示报头所对应的字节数 (4字节)
1. 报头和有效载荷如何分离? 报头是固定长度 8字节,剩下的就是有效载荷
通过16位UDP长度,整体 减去 8字节 即 有效载荷的长度
2. 有效载荷如何做到向上交付的? UDP报头中包含16位目的端口号,将一个报文发送到主机上,根据目的端口号向上交付给应用层,绑定该端口号的进程
报头(协议)的本质:结构化数据 基于 struct 有两种数据类型,一种为结构体,另一种为位段
struct udp_header 结构体 内部 包含 源端口号、目的端口号 、udp长度、校验和
借助位段的方式,取整形int的4字节中的16个比特位
将缓冲区数据从应用层拷贝给操作系统内部
提供一段缓冲区,定义一个指针p,去指向缓冲区 因为报头大小是固定长度8字节,让p向后移动8个单位 再将应用层的数据拷贝到对应的位置中
再将指针p,指向最开始位置,并将p强转成 struct udp_header类型 ,指向结构体中的源端口号、目的端口号 、udp长度、校验和
该报文经过网络,经过协议栈被对方收到了 再定义一个指针s,,让s 8,再次指向有效载荷
将s强转成 struct udp_header类型 ,指向结构体中的源端口号、目的端口号 、udp长度、校验和
UDP的特点
无连接:知道 对端的IP和端口号 就直接传输,不需要连接 不可靠:若网络故障段无法发送对方,UDP协议也不会给应用层返回任何错误信息
面向数据报:不能够灵活的控制读写数据的次数和数量
面向数据报的理解
因为UDP有自己固定的报头长度8字节,所以UDP能够知道自己的有效载荷多长 不靠上层,在底层就自动知道报文和有效载荷的长度 所以就能保证向上交付的 一定是独立的、完整的 有效载荷 不用自己处理,只要发的是完整的,收的就是完整的,对方发几次,收几次 由底层交上来,独立的报文,称为面向数据报
即应用层给UDP多长的报文,UDP原样发送,既不拆分,也不会合并
缓冲区理解
UDP对应数据一定是完整的,所以有数据直接交给下层 所以UDP不需要 发送缓冲区
收到一个保文,可上层来不及处理,就需要接收缓冲区 该缓冲区 并不是用来保证可靠性,而是尽可能保证不要丢包,如果缓冲区满了,再达到的数据就会被丢弃 如:在淘宝上买了五件商品,编号为1-5,先买的是1号商品,时间是不确定的,所以1-5号 谁先谁后到 是不确定的 这种情况称为 接收报文出现乱序的情况 乱序是不可靠的表现,所以UDP不考虑 即UDP接收缓冲区,但不保证 接受报文是有序的