孤单小弟 HTTP
一个URL的组成
首先浏览器需要对URL进行解析,从而生成发送给web服务器的请求信息。
URL是就是请求服务器的文件资源。 假如不带文件路径呢?通常服务器会在根目录下放置一个默认的Index.html,返回他即可。
浏览器解析出URL,确定了对方的web服务器和文件名。生成请求。 一个孤单的HTTP数据包背起了行囊。
真实地址查询DNS
通常输入的服务器域名是字符串,因为直接输入IP难以记忆。DNS服务器(端口为53)专门保存了web服务器域名和IP之间的对应关系。
就像外国人说一个地点,xx街道xx区xx市xx省一样。他们的习惯与我们相反。
根域处于互联网任意一个DNS服务器中。
讲清楚这些再看。
- 此时浏览器发出一个dns请求,询问本地DNS服务器,域名对应的IP是啥。假如本地有缓存过它对应的IP,直接返回。
- 假如没有,本地DNS服务器会向根域DNS服务器询问,“大哥,请问这个域名的IP地址是啥”
- 根域收到它请求,看见后缀为.com,指明一条道路,归.com管,我给你.com的顶级域服务器地址,你去问他。
- 它(本地DNS服务器)找到了顶级域服务器,“二哥请问这个域名对应的IP地址是啥”
- 二哥一看,这个域名,归权威DNS服务器管,你去问他
- 它又找到了权威DNS服务器,问道"三哥,这个域名对应的IP是啥",权威服务器一查,本地DNS服务器拿到对应的IP,返回给自己的浏览器。
经过不断的问路,终于找到了目的地。接下来该怎么发呢?
可靠传输TCP
数据链路层确定点到点,中间经过一个个源mac地址,目的mac地址的区间,不断跳转
首先,三次握手,建立链接。浏览器就可以发送自己的请求报文,假如数据大小大于MSS还会进行分段之后加报头,同时TCP还有保证可靠性,效率的一些机制。 有了TCP的保证,很心安,可是我该往哪走?
远程定位IP
IP协议将数据拿到,假如数据大小大于MTU,会进行分片后加IP报头,IP报头中拥有源IP,目的IP这两个IP始终是不会变化的。
- 源IP:客户端有多个网卡,就有多个IP,经过route-n查看路由表,根据目的ip按位与子网掩码,算出网段。观察与哪个网卡相匹配,填入网卡的IP。假如没有填默认的。
- 目的IP:就是之前DNS解析拿到的。
知道了源IP,目的IP,经过多次路由选择,就确定了本主机到另一台主机之间的路径。 路由选择: 目的IP,按位与子网掩码。算出网段。观察本主机路由表,假如有找到下一跳,假如没有转发给默认路由1。路由器1在路由表匹配到了转发给下一跳路由器,路由器匹配到了而且发现是自己局域网主机,将IP数据报经过交换机转发至目标主机。
有了IP,不再迷茫,可是那么远,我下一站在哪?
两点传输MAC
数据链路层根据MAC地址在一个接一个的区间中进行传输,每个区间的起始地址就是源MAC地址,目的地址就是目的MAC地址。
源MAC地址:直接从网卡的ROM里读取。经过路径选择,我们知道了各个路由器的IP,同时经过ARP协议,拿到他们的MAC地址。然后在两点之间传输数据。所以源MAC,目的MAC是不断变化的。
ARP协议:以广播的形式对所有设备询问,这个IP地址是谁的,请把你的MAC地址告诉我。同时划分一个ARP缓存存储IP地址到MAC地址的映射。 谢谢大家的帮助,现在我终于可以出门了。
最终
自底向上不断分离报头,可靠地收到这些数据后,处理请求,返回响应。经过同样的步骤,将响应报文送给客户端浏览器。浏览器收到响应后,渲染数据。四次挥手断开链接。
|