浏览器键入地址后发生了什么

42 阅读9分钟

1 HTTP

1.1 URL解析

1680510068636.png

可以看到,地址URL实际是请求服务器里的文件资源

如果没有指定后面的文件路径名,就会访问跟目录下的默认文件,也就是/index.html或/default.html

1.2 生成HTTP请求

对url解析之后,浏览器确定了Web服务器和文件名,接下来就是根据这些信息来生成http请求消息了。

HTTP请求分为GET请求和POST请求:

  • GET请求

get请求包括两部分,请求行和消息头,请求行和消息头之间使用一个空行来分隔。如:

请求行:

GET /index.html HTTP/1.1

上面的请求行包含三个部分:请求方法、请求URL和HTTP协议版本。

消息头:

Host: www.example.com
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8

消息头包含了一些关于请求的附加信息,如Host、User-Agent、Accept等,每个头部字段都由一个名字和值组成,中间用冒号分隔

  • POST请求

post请求除了上面的请求行和消息头外,还包括请求需要发送的消息体,例如:

POST /submit.php HTTP/1.1
Host: www.example.com
Content-Type: application/x-www-form-urlencoded
Content-Length: 27
​
name=John&age=30&email=xxx

消息体为name=John&age=30&email=xxx

2 真实地址查询—DNS

通过浏览器解析URL并生成HTTP消息后,需要委托操作系统将消息发送给Web服务器。但是在发送之前,还需要查询服务器域名对应的IP地址。就像打点话给别人必须知道别人的电话号码,但是由于电话号码难记,所以通常我们会把电话号码 + 姓名保存在通讯录里。

2.1 域名层级关系

DNS中的域名都是用句点来分割的,比如www.server.com, 域名中越靠右的位置表示层级越高。层级关系如下:

1680522836878.png

跟域的DNS服务器信息保存在互联网中所有的DNS服务器中。这样可以保证任务DNS服务器都可以找到并访问跟域DNS服务器了。

2.2域名解析流程

  • 客服端首先会发送一个DNS请求,问www.server.com的ip地址,并发给本地DNS服务器(也就是客服端的TCP/IP中填写的DNS服务器地址)。
  • 本地域名服务器收到客服端的请求后,如果能从本地缓存表里找到www.server.com,则直接返回它的IP地址。如果没有,本地DNS服务器会去问它的跟域名服务器。
  • 跟域名服务器收到本地的DNS请求后,发现域名后缀是.com,他就会把管理.com顶级域名的服务器地址返回给本地DNS服务器。
  • 本地DNS服务器收到顶级域名服务器地址后,就会请求顶级域名服务器,让他告诉www.server.com的IP地址。
  • 顶级域名服务器收到本地DNS请求后,会把负责server.com的权威域名服务器返回给它。
  • 本地域名服务器于是请求权威DNS服务器,请求www.server.com的IP地址。
  • 权威DNS服务器查询后将对应的IP地址X.X.X.X告诉本地DNS。
  • 本地DNS再将IP地址返回给客户端,客户端和目标建立连接。

DNS域名解析整个过程和我们生活中找人问路类型,只指路不带路。

3 协议栈

通过DNS获取到IP地址后,就可以把HTTP的传输工作交给操作系统中的协议栈

协议栈的内部分为几个部分,分别承担不同的工作。上下关系是有一定规则,上层会向下层逐层委派工作,下面的部分收到委派的工作并执行。

0a202f3e67b944ca882c271bc36868e0 (2).png

应用程序(浏览器)通过调用Socket库,来委托协议栈工作。协议栈的上半部分有两块,分别是负责收发数据的TCP和UDP协议,它们会接受应用层的委托执行收发数据的操作。

协议的下面一般是用IP协议控制网络包收发操作,在互联网上传输数据时,数据会被切分成一块块的网络包,而将网络包发送给对方的操作就是由IP负责的。

此外IP中还包括ICMP协议和ARP协议。

  • ICMP协议:用于告知网络包传送过程中产生的错误及各种控制信息。
  • ARP协议:用于根据IP地址查询相应的以太网MAC地址。

IP 下面的网卡驱动程序负责控制网卡硬件,而最下面的网卡则负责完成实际的收发操作,也就是对网线中的信号执行发送和接收操作。

4 可靠传输—TCP

4.1 TCP报文头格式

c22239b84e374348924fa22163a79fa3.png

1、源、目标端口号:必不可少,用于标识客服端和服务端哪两个应用进行进行通讯。

2、序号:是为了解决包乱序问题。

3、确认号:目的是确认发出去对方是否有收到。如果没有收到就需要重新发送,直到送达,这个是为了解决丢包问题。

4、状态位:SYN发起一个连接、ACK回复、RST重新连接、FIN是结束连接

5、窗口大小:TCP要做流量控制,通信双方各声明一个窗口,标识自己当前能够处理数据的能力。别发送太快或太慢。

除了做流量控制以外,TCP还会做拥塞控制,对于真正的通路堵车不堵,它无能为力,唯一能做的就是控制自己,也即控制发送的速度。不能改变世界,就改变自己。

4.2 三次握手

TCP传输数据之前,首先要建立TCP连接,TCP建立连接的过程通常称为三次握手

建立连接过程中客服端和服务端状态变化时序图如下:

微信图片_20230404173907.png

  • 一开始,客户端和服务端都处于 CLOSED 状态。先是服务端主动监听某个端口,处于 LISTEN 状态。
  • 然后客户端主动发起连接 SYN,之后处于 SYN-SENT 状态。
  • 服务端收到发起的连接,返回 SYN,并且 ACK 客户端的 SYN,之后处于 SYN-RCVD 状态。
  • 客户端收到服务端发送的 SYNACK 之后,发送 ACKACK,之后处于 ESTABLISHED 状态,因为它一发一收成功了。
  • 服务端收到 ACKACK 之后,处于 ESTABLISHED 状态,因为它也一发一收了。

4.3 TCP数据分割

  • MTU:最大传输单元。这是一个数据链路层的概念,一个网络包的最大长度,在以太网里,最大MTU值为1500字节,最小MTU为46字节。
  • MSS:除去 IP 和 TCP 头部之后,一个网络包所能容纳的 TCP 数据的最大长度。

1680607551354.png 当数据大于MSS最大长度是,数据会被以MSS的长度单位进行拆分,拆分出来的每一块数据都会被放进单独的网络包中。也就是在每个被拆分的数据加上 TCP头部信息,然后交给IP模块来发送数据。

整体过程如下:

1680607689318.png

4.4 TCP报文生成

TCP协议里面会有两个端口,一个是浏览器监听的端口(通常是随机生成的),一个是Web服务器监听的端口(HTTP默认端口是80,HTTPS默认端口号是443)。

在双方建立连接后,TCP报文中的数据部分就是存放HTTP头部 + 数据,组装好TCP报文之后,就需交给下面的网络层处理。至此,TCP报文如下:

1680608142325.png

5 IP

TCP模块在执行连接、收发、断开等各阶段操作时,都需要委托IP模块将数据封装成网络包发送给通信对象。

IP报文头部格式:

1681463861717.png

在IP协议里面需要有源地址IP和目标地址IP:

  • 原地址IP,即是客户端输出的IP地址;
  • 目标地址,即通过DNS域名解析得到Web服务器IP。

因为HTTP是经过TCP传输的,所以在IP包头的协议号,要填写为06(十六进制),表示协议为TCP。

5.1 网卡选择

当客服端存在多个网卡是,,就会有多个IP地址,那IP头部的源地址应该选择哪个IP呢?

1681464077823.png

  1. 首先先和第一条条目的子网掩码(Genmask)进行 与运算,得到结果为 192.168.10.0,但是第一个条目的 Destination192.168.3.0,两者不一致所以匹配失败。
  2. 再与第二条目的子网掩码进行 与运算,得到的结果为 192.168.10.0,与第二条目的 Destination 192.168.10.0 匹配成功,所以将使用 eth1 网卡的 IP 地址作为 IP 包头的源地址

至此,网络包的报文如下图:

1681464136717.png

6 两点传输—MAC

生成了IP头部之后,接下来网络包还需要在IP头部的前面加上MAC头部

MAC头部是以太网使用得头部,它包含了接收方和发送方的MAC地址等信息。

1681464237141.png

在 MAC 包头里需要发送方 MAC 地址接收方目标 MAC 地址,用于两点之间的传输

一般在 TCP/IP 通信里,MAC 包头的协议类型只使用:

  • 0800 :IP 协议
  • 0806 :ARP 协议

MAC发送方和接收方如何确认?

发送方:发送方的MAC地址是在网卡产生时写入到ROM里的,只要将这个值读取出来写入到MAC头部就可以了。

接收方:接收方MAC地址首先会从ARP缓存中去查找,如果没有找到,会通过ARP协议在以太网中广播,询问ip地址x.x.x.x的MAC地址。当台电脑告诉自己的MAC地址后,生成的网络包如下:

1681464511689.png

网络包生成后,还会经过网卡将数字信息转换为电信号,经过交换机将网络包原样转发到目的地。经过路由器转发到下一个路由器或目标设备。最后到达服务器后,会依次解析数据包的各层看是不是和自己的mac、ip等信息符合。

以上内容转载于小林coding,侵删