发起一次URL请求流程
- 在浏览器输入URL
http://wangjialun.top/
- 浏览器通过DNS或者HTTPDNS去查找IP地址
- 知道目标地址后,浏览器会将请求打包,普通请求使用HTTP协议或者使用HTTPS加密传输
- DNS,HTTP,HTTPS所在的层为应用层,经过应用层封装后,浏览器会通过socket编程将应用层的包交给下一层传输层
- 传输层有两种协议,一种无连接的协议UDP,一种面向连接的协议TCP,TCP协议会保证这个包能够到达目的地,如果不能到达会重新发送
- TCP协议里面会有两个端口,一个是浏览器监听的端口,一个应用服务器监听的端口,操作系统一般通过端口来判断,得到的包交给哪个进程
- 传输层封装完毕后,浏览器会将包交给操作系统的网络层,网络层协议是IP协议,在IP协议中会有源IP地址,即浏览器所在机器IP地址和目标IP地址
- 操作系统知道目标IP后会通过CIDR进行判断,是否在局域网内,如果不在局域网内会获取DHCP或者手动配置的网关IP地址,通过ARP协议获取到MAC地址
- 操作系统接着将IP包交给下一层MAC层,网卡再将包发出去,因为包里面有MAC地址,所以可以到达网关
- 网关收到包以后,会根据路由表判断下一步怎么走,类似一个路由器通过OSPF和BGP路由协议获取到目标IP所在的MAC地址,网络包过关后通过这个MAC地址找到目标服务器
- 目标服务器校验MAC地址一致,取下MAC头,发送给操作系统的网络层,发现IP一致后取下IP头,IP头里面写上一层封装的TCP协议,然后交给传输层TCP,TCP对于收到的每个包都有一个回复的包说明收到了(注意这个不是请求的结果),回复沿路返回
- 网络包到达TCP层后,TCP头里面有目标端口号,通过这个端口号找到服务器监听这个端口的进程,将网络包发给这个进程应用
ip addr 解读
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:16:3e:0c:3b:19 brd ff:ff:ff:ff:ff:ff
inet 172.16.12.178/18 brd 172.16.63.255 scope global dynamic eth0
valid_lft 301621714sec preferred_lft 301621714sec
-
IP 地址后面有个scope eth0 这张网卡是 global 说明 eth0 这种网卡可以对外,可以接收来自各个地方的包,
lo 的后面是host,说明这张网卡仅可以本机相互通信
- lo 全称是loopback,又叫环回接口,通常被分配为127.0.0.1,这个地址用于本机通信,经过内核处理后直接返回,不在任何网络中出现
-
MAC地址
- IP地址的上一行是 link/ether 00:16:3e:0c:3b:19 brd ff:ff:ff:ff:ff:ff ,这个地址是MAC地址,是网卡的物理地址,用十六进制,6个byte表示,MAC地址是唯一标识,具有一定的通信范围,局限在一个子网里面
-
网络设备的状态标识
<BROADCAST,MULTICAST,UP,LOWER_UP>
(net_device flags)- UP 表示网卡处于启动状态
- BROADCAST 表示这个网卡有广播地址,可以发送广播包
- MULTICAST 表示网卡可以发送多播包
- LOWER_UP 表示 L1 是启动的,即网线插着
- MTU 1500 是指最大传输单元MTU为1500,这是以太网的默认值
- qdisc pfifo_fast 全称 queueing discipline(排队规则), 内核如果需要通过某个网络接口发送数据包,都需要为这个接口配置qdisc(排队规则)把数据包加入队列
- 最简单的 qdisc 是 pfifo, 不对进入的数据包做任何处理,数据包采用先入先出方式通过队列
- pfifo_fast 的队列包含 三个波段(band).在每个波段中使用先进先出规则,三个波段的优先级也不同,band 0 的优先级最高 band 2 的最低, 如果band 0 里面也数据包, 系统不会处理band 1 里面的数据包,band 1 和 band 2 之间也一样, 数据包按照服务类型(Type of Service, TOS) 被分配到多个波段(band)里面,TOS 是 IP头里面的一个字段, 代表当前的包是高优先级还是低优先级的