假设我们电脑的相关配置为:
ip地址:192.168.31.37
子网掩码:255.255.255.0
网关地址:192.168.31.1
DNS地址:8.8.8.8
1. DNS 解析
我们打开一个浏览器,请求ww.baidu.com
地址,这个时候找DNS 服务器。 DNS 服务器解析域名之后,返回一个 IP 地址,比如 172.194.26.108
。接看会判断两个 IP 地址是不是一个子网的,用子网掩码 255.255.255.0
,对两个IP地址做与运算,拿到192.168.31.0
和172.194.26.0
,明显不是一个子网的。
那就得发送一个数据包给网关,其实你就认为是我们的路由器吧,就是 192.168.31.1
,而且我们是可以得到网关 IP地址的 mac 地址的,现在我们从应用层出发,通过浏览器访问一个网站,是走应用层的 http 协议的。
2. 发送http请求
http 协议分为几个部分:
请求方法+URL地址+http版本,如:GET http://172.194.26.108/test HTTP/1.1,
请求头:
Host:upload.guangzhou.io
Proxy-Connection: keep-alive
User-Agent: Mozilla/5.0
空行
请求体:比如常见的可以放一个json串
由此就构成了http请求报文;
3. 请求传递的过程
浏览器请求一个地址,先按照应用层的http协议,封装一个应用层数据包,数据包里就放了http请求报文
这个时候会将这个http请求报文打包成一个数据包,仅仅只是数据包的数据部分,此时是数据包是没有头的。上面根据http协议搞一个http请求报文,然后搞一个数据包出来,就是网络模型中到的应用层干的事儿了。
接着就是跑传输层来了,这个层是tcp协议,这个tcp协议会让你设置端口,发送方的端口随机选一个,接收方的端口一般是默认的80端口。这个时候,会把应用层数据包给封装到tcp数据包中去,而且会加一个tcp头,这个tcp数据包是对应一个tcp头的,这个tcp头里就放了端口号信息。
接着就来到了网络层,走的是ip协议,会把tcp头和tcp数据包封装到以太网数据包里去,然后再加上一个ip头,ip头里有本机和目标机器的ip地址,这里的本机ip地址为192.168.31.37,目标机器ip地址为172.194.26.108;
接着就来到了数据链路层,走的是以太网协议,会把ip头和ip数据包封装到以太网数据包里去,加上一个以太网数据包的头,里面包含本机网卡的mac地址,网关的mac地址。
之后一个以太网数据包会被切割为4个数据包,每个数据包里包含以太网头,ip头和切割后的ip数据包。ip头里包含了每个数据包的序号,这4个以太网数据包通过交换机发到你的网关上,然后你的路由器可以联通别的子网,将数据包转发到别的子网的路由器里去,最后到达百度的某台服务器机器;
百度服务器接收到4个以太网数据包以后,根据ip头的序号,把4个以太网数据包里的ip数据包给拼起来,还原成一个完整的ip数据包。接着从ip数据包里拿出tcp数据包,再从tcp数据包里拿出http数据包,读取出http数据包里的各种协议内容,转给服务器上部署的系统去执行,把结果进行响应。
参考
https://blog.csdn.net/weixin_44811851/article/details/121877358