Linux必知之网络基础篇
基本层次结构
网络层
当每个主机连接到一个子网的时候,其在子网中就会有一个IP地址,这个IP地址应该是唯一的但是在专用网络和NAT的情况中, 会有多个IP地址
查看地址:ipconfig
inet addr: IP地址
Mask: 子网掩码,定义了IP地址的所属
将它们分别写成四个八位二进制数,每位进行对应,将IP中与掩码的1对应的位加粗,剩余未加粗的是可以变动的,从而可以发现子网之中IP的共用IP前缀
如:
255.255.255.0
11111111 11111111 11111111 00000000
子网内的IP的前三位都是相同的,很容易推出子网中其他的IP
路由表
$ route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 10.135.0.1 0.0.0.0 UG 0 0 0 eth0
10.135.0.0 0.0.0.0 255.255.192.0 U 0 0 0 eth0
169.254.0.0 0.0.0.0 255.255.0.0 U 1002 0 0 eth0
0.0.0.0 是默认路由,能匹配互联网中的所有IP
Destination 表示前缀
Gateway 默认网关列,如果目标地址没有匹配其他网络,那就是将信息从默认网关中发出
Flags的U表示该路由是可活动的可以直接访问,有G的表示需要通过Gateway才可以访问
数据包追踪
常用: ping
traceroute
ping用于检测是否有丢包和是否能快速响应
traceroute能显示数据包到目标主机所经过的路由
host 和 DNS
使用 host
+域名的命令可以使用系统自带的DNS库找到域名的IP
过程如下:
- 查询函数位于系统共享库
- 根据规则查找,一般是先检查
/etc/hosts
文件中的重写(解释了localhost) - 若没有,守护进程(常见是dnsmasq和nscd)会对DNS查询请求进行拦截,如果命中缓存,则返回
- 如还没有,则会找到配置好的DNS服务器IP,发送查询请求
- DNS服务器收到后返回域名对应的IP给应用
物理层
基本概念
- MAC硬件地址(介质访问控制)
- 以太网以帧的形式发送信息,帧里除了实际数据还有发送者和接受者的MAC地址
- 以太网会有不同的类型,那么在网络层的路由器会将其先解包,然后再重新封装发给目标
- 内核的网络接口沟通了物理层和网络层,这个接口将IP地址和硬件标识对应起来
查看或配置网络接口
$ ifconfig
输出的左面是接口名称,右边是配置以及统计信息
eth0: 计算机第一块以太网网卡
lo: 虚拟的网络接口,全名loopback
,指向自己,数据发送到lo时内核只会将其重新包装,并通过lo回复
网络配置管理器
守护进程 NetworkManager 维护网络和连接的信息和配置,在图形界面中的桌面网络连接设置其实就是与这个进程来交互的
DHCP 动态主机配置协议
用过校园网的朋友们应该都十分清楚,每次都需要登录客户端进行验证,然后就能够动态地获取到IP,DNS,子网掩码等相关的网络配置, 通常路由器承担了DHCP服务器的角色,其管理和分配其下的连接主机的网络配置,这样就避免了IP冲突或网络变更所带来的影响,主机只向DHCP服务器临时租用IP, 到期之后DHCP服务器可以要求更新配置
传输层
传输层的协议使得网络层的包与应用层的需求无缝连接,其中包含有TCP和UDP协议
查看机器上的连接
$ netstat -nt
建立本地和远端机器的TCP连接,本机进程会使用一个端口向远端的公共端口(通常是80)发送一些特殊的数据包,这个过程是我们所熟知的TCP握手连接,这里不进行详细展开, 在远端的机器也会启动一个进程来监听这个公共端口,监听方就被成为服务器
而UDP则简单得多,它默认本机与服务器是通路,不会进行校验,直接发送
查看公认端口的数字: /etc/services
好处:使得进程处理发送和接收更加容易,就像处理文件的输出流和输入流那样,同时这一层也做到了包与数据流之间的转换和包的数据校验纠正工作
IP伪装
使用NAT将IP分享给整个私有网络,使得路由器可以作为中介去访问远程主机而远程却只知道它与路由器建立了连接
大致过程如下:
- 私有网络里的主机要与外界通信,请求会经过路由器
- 路由器拦截请求,然后自身启动请求去连接目标
- 连接成功后伪造连接已建立的信息返回给网络里的主机然后作为本机和远程的中介
防火墙
可以在下面的几个场景下设置检查点:
- 接收数据包时
- 发送数据包时
- 将数据包转发到其他主机或网关时
防火墙的策略配置:详情见 iptables
应用层
服务器并不区分发给操作系统的报头和内容,区分只发生于用户空间的服务器程序
多数的网络服务器都是多进程的,至少有一个进程会监听网络端口,接收到一个新的连接时就**fork()一个新的子进程来处理连接, 个别的高性能服务器会提前fork()**出辅助进程的来高效处理连接,连接终止,子进程也就终止
这里列举一些常用的诊断命令:
- netstat
- lsof
- tcpdump
RPC(远程程序调用):通过本地程序调用远程程序(使用程序标识符来区分),让远程返回结果或信息,有些监控系统会用到
参考资料
《精通Linux》第二版