计算机语言作为程序员控制一台计算机工作的协议,具备了协议的三要素。
HTTP/1.1 200 OK
Date: Tue, 27 Mar 2018 16:50:26 GMT
Content-Type: text/html;charset=UTF-8
Content-Language: zh-CN
网易考拉 3 周年主会场
浏览器获取url之后通过DNS服务器或者HTTPSDNS服务器去查找域名对应的IP地址(一个IP可以对应多个域名)。
获取IP地址之后,浏览器开始生产http请求。对于普通的浏览请求,往往使用http协议,对于类似于购物这样的请求,往往需要进行加密传输(https较之于http多了一个ssl加密,在连接之前,会建立ssl通道)。
DNS\HTTP\HTTPS所在的层为应用层。经过应用层封装后,浏览器将封装好的包通过socket编程来发送给传输层。
传输层有两个协议TCP和UDP协议。TCP的面向连接的协议,更加安全,但是实时性稍逊于UDP协议。
在TCP头里面存放两个端口,一个是浏览器监听的端口,一个是服务器监听的端口。操作系统常通过端口来判断数据发送给哪一个进程。
传输层封装完毕之后,数据包会被传输给操作系统的网络层。网路程协议是IP协议。在IP协议中会有发送端的IP地址以及目的端的IP地址。
网络层通过IP地址确定数据包要被发送的目的端。如果目的IP地址和发送端的IP地址不属于同一网段,则要经过网关。在操作系统启动的时候,会被DHCP协议配置IP地址以及默认网关的IP地址——192.168.1.1
操作系统通过ARP协议获取网关的MAC地址,获取MAC地址之后数据包被加了一个MAC头。之后数据包被发送到数据链路层。网卡将数据包发送出去。由于包里面有MAC地址,因此该数据包可以到达网关。
网关收到数据包之后,会判断该数据包下一步应该被发送给谁。网关往往是一个路由器。用于查询下一步该往哪走的表是路由表。之后数据包经过一个又一个路由器,每经过一个路由器,各个路由器之间通过路由协议来确定数据包下一步该往哪走。常用的路由协议是OSPF协议和BGP协议。当数据包获取下一步的IP地址和MAC地址之后,就会被发送出去,直到走到目的IP地址。
到达最后一个路由器之后,通过ARP协议获取目标IP的MAC地址,通过该MAC地址,就找到了目标服务器。
目标服务器收到数据包之后,会先验证数据包的MAC地址,如果该MAC地址就是本机器的MAC地址,则将该数据包的MAC头取下来,发送给操作系统的网络层。在网络层会验证目标IP地址是否为本机IP地址,如果IP验证通过,则取下IP头查看数据包传输使用的协议,如果是TCP协议,则将数据包发送给传输层,即TCP层。
在TCP层,每个收到的包都会回复一个ACK,表明数据包被收到了。这些数据包会先存放在一个消息队列中,之后操作系统会根据数据包上的目标端口号将数据包交给监听该端口的进程。
进程获取数据之后会进行相应的处理,并将数据包要求的任务发送给相关进程进行处理。发送方式往往通过RPC调用,即远程过程调用。RPC框架有很多种,有基于http协议放在http的报文里的,也有直接封装在TCP报文里的。
放数据包要求的任务处理完成之后,就会回复一个http请求,这个新生成的包又会通过之前的方式回到发送端的浏览器中。
因为是个复杂的程度都要分层。比如复杂的电商会分数据库层、缓存层、compose层、controller层和介入层,每层都专注本层的工作。
linux系统中查看IP地址是命令。
root@test:~# ip addr
1: lo: mtu 65536 qdisc noqueue state UNKNOWN group default
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
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether fa:16:3e:c7:79:75 brd ff:ff:ff:ff:ff:ff
inet 10.100.122.2/24 brd 10.100.122.255 scope global eth0
valid_lft forever preferred_lft forever
inet6 fe80::f816:3eff:fec7:7975/64 scope link
valid_lft forever preferred_lft forever
ip地址是网络世界的通讯地址,类似于我们的门牌号。IP地址被点分割成四部分,每部分8bit,因此IP地址一共32位(2的32次幂是四十多亿)。IP地址被分为五类:
D类地址是组播地址。使用这类地址,则组内的机器都能收到数据(同组可以是不同局域网的)。
由于上述划分方式很浪费,诞生了一共新的方法:
CIDR 将 32 位的 IP 地址一分为二,前面是网络号,后面是主机号。例如 10.100.122.2/24 中前24位是网络号,后8位是主机号。
伴随CIDR的是广播地址,10.100.122.255。如果发送数据的目标IP是这个地址,则所有 10.100.122 网段中的机器都会受到该数据,除非你把网线拔了(硬气)。另一个是子网掩码,255.255.255.0。
将子网掩码(255.255.255.0)和IP地址(10.100.122.2)进行按位与计算,得到网络号——10.100.122.0。
求IP地址为 16.158.165.91/22 的第一地址、子网掩码、广播地址。
上来就答 16.158.165.1,那就错了。
注意 22 不是 8 的整数倍,意味着转换的时候 16.158 的部分不会动,他们占据前16位。中间的165变为2进制是 10100101,在这8位中,前6位是网络号,16.158.<101001>,,后两位是主机号,<01>.91。
因此
比如旁边机器是192.168.x.x,我将自己的IP地址配置成16.158.235.5,会出现什么情况?
不会出现任何情况,只是包发不出去。
一个数据包的IP地址是16.158.235.5,目标地址是192.168..1.6,但是发不出去,因为MAC地址没有填写。发送数据包时,linux系统会先判断发送端IP和目的端IP是否属于同一网段,如果属于同一网段,则操作系统会发送ARP请求来获取目标机器的MAC地址,如果不属于同一网段,则linux会企图将数据包发送给网关。如果此时你没有配置网关,那么这个包就发不出去了。
一台新机器加入到一个网络时,会发起DHCP Discover,即通过IP地址 0.0.0.0向IP地址255.255.255.255发送一个含有本机MAC地址的广播数据包(UDP),该包的格式如下:
如果该网段被配置了DHCP Server,则该服务会将他管理的一个IP地址分配给该机器,即DHCP Offer。同时DHCP Server会保留该IP地址,不会分配给其他机器。
DHCP Offer的格式如下(里面包含新分配的IP地址、子网掩码、网关和有效期):
如果有多个DHCP Server,则该机器会收到多个IP地址。机器会选择其中一个,并向网络中发送DHCP Request广播数据包,包中包含本机的MAC地址、确定使用的IP地址、提供该IP地址的DHCP Server的地址等。
在收到DHCP Server的确认之前,客户端使用的原IP地址依然是 0.0.0.0,目标IP地址依然是 255.255.255.255.
DHCP Server在收到DHCP Request之后,会广播回复给客户机一个DHCP ACK消息包,表明已经接受客户机的选择,并将分配给客户机的IP地址和其他配置信息都放入这个ACK广播包中。
客户机会在DHCP分配的IP地址有效期还剩50%的时候,想DHCP Server发送DHCP Request消息包来延长IP地址的使用有效时间。在收到服务器回复的DHCP ACK 之后,修改本机相应的TCP/IP参数,更新自己的配置。如此,需续租完成。
DHCP Server可以给你自动安装操作系统
通过DHCP Server安装操作系统的过程与操作系统启动的过程有些类似:
安装操作系统的过程,插在了上面过程中的BIOS启动之后,因为没安装操作系统之前,没有扇区。因而此过程叫做预启动执行环境(Pre-boot Execution Environment),简称为PXE。
PXE协议分析客户端和服务端,先将客户端放在BIOS中。当计算机启动时,BIOS把PXE客户端调入内存中。
首先,PXE客户端需要有自己的IP地址,因此PXR的客户端启动之后,需要发送DHCP请求,让DHCP Server给他分配一个地址。DHCP Server给PXE分配IP地址时的数据样例:
ddns-update-style interim;
ignore client-updates;
allow booting;
allow bootp;
subnet 192.168.1.0 netmask 255.255.255.0
{
option routers 192.168.1.1;
option subnet-mask 255.255.255.0;
option time-offset -18000;
default-lease-time 21600;
max-lease-time 43200;
range dynamic-bootp 192.168.1.240 192.168.1.250;
filename "pxelinux.0";
next-server 192.168.1.180;
}
该数据包为PXE配置了IP地址、子网掩码、网关地区和有效期等。
如果想使用PXE,需要配置next-server,指向PXE服务器的地址,还要配置初始启动文件filename。