浏览器输入网址回车后会发什么
http应用层
http
协议是应用层协议。如果抛开细节不谈,一个简单的网页请求可以用下面这个图表示整个过程。
解析url
浏览器的第一步工作就是解析url
。访问网页的基本原理就是将服务器存放的html
文件内容将以http
协议发送给客户端。
当没有路径名时,也就是http://server-domain/
,会访问服务器根目录下的/index.html
或者/defalut.html
。
对url
解析后,浏览器开始根据请求路径来封装http
协议消息体,如图所示:
http
消息格式要发给服务器,需要tcp
来承载,而tcp
又需要IP
来承载。所以浏览器的第二步需要知道服务器的IP
是多少
域名解析
需要注意的是url
上如果直接填写的ip
+port
的方式,不会有域名解析的步骤例如:
|
|
所谓的域名解析,实际上是域名和IP
的映射关系。这个IP
就是服务器的IP
。存放映射关系的地方叫DNS
(Domain Name System)。DNS
中的域名以英文.
分割,例如www.baidu.com
,表示了不同层级,越靠右边层级越高。所以域名结构是一个棵树状结构
客户端要想通过域名拿到IP
,需要分几种情况讨论。
- 查看浏览器的域名缓存
- 查看本地
hosts
(cat /etc/hosts
) - 请求本地域名服务器
- 本地域名服务器请求根域名服务器
- 本地域名服务器请求顶级域名服务器比如.com
- ………..
- 最终查到
IP
拿到IP
后开始封装各种底层协议
传输层tcp协议
tcp
头部报文格式,如图所示:
- source port:源端口,发起方端口
- destination port:目的端口,接收方端口
- sequence number:序列号,保证数据包不乱序
- acknowledgment number:确认序列号,确认对方是否收到,如果没有收到就重发,保证不丢包
- header len:首部长度
- reserved:保留
- 状态位
- FIN:结束连接请求
- SYN:发起一个连接请求
- RST:重新连接
- PSH:?
- ACK:回复
- URG:?
- window size:窗口大小,流量控制,通信双方声明一个窗口,表示自己当前处理能力。
- Check sum:校验和
- urgent pointer:紧急指针
- option:选项
- data:数据,data最大
MSS
字节
三次握手
- 客户端发出
SYN
包后进入SYS_SENT
状态 - 服务器收到
SYN
包后,发出SYN
&ACK
包后,进入SYN_RCVD
状态 - 客户端收到
SYN
&ACK
包,发出ACK
包后,进入``ESTABLISHED`状态 - 服务器收到
ACK
包后,进入``ESTABLISHED`状态
tcp
的连接状态,可以通过netstat -napt
命令查看
tcp拆分数据
如果http
请求的消息过长,超过了MSS
长度。tcp
协议会把数据拆成一个个的数据包分别发送
- 一个网络包的最大长度,以太网中一般为
1500
字节。 - 除去
IP
和tcp
头部之后,一个网络包所能容纳的 TCP 数据的最大长度。
构造tcp报文
tcp
头部中,源端口是客户端随机生成的,目的端口是服务器的端口,http
默认端口是80,https
默认端口是443
tcp
数据部分用来存放整个http
报文,如图所示:
网络层IP协议
传输层封装tcp
报文接下来的工作就交给网络层,在这一层会封装IP
数据包,IP
数据包的头部如图所示
字段简要解释1
- Version:IP的版本,ipv4,ipv6
- Internet Header Length (IHL):IP 数据包的头部长度
- Type Of Service (TOS):服务类型类型
- Total Length (TL):IP数据报的总长度,最大为
65535
字节 - Identification:标识
- Flags:标志位
- Fragment Offset:当消息发生分片时,该字段指定该分片中的数据在整个消息中的偏移量或位置
- Time To Live (TTL): 指定数据报允许在网络上“生存”多长时间,以路由器跳数为单位。每个路由器在传输之前将 TTL 字段的值递减(减一)。如果 TTL 字段下降到零,则认为数据报经过了太长的路由并被丢弃
- Protocol:协议,表示,是tcp还是udp等等
- Header Checksum:在标头上计算的校验和,以提供基本保护以防止传输中的损坏
- Source Address:源ip地址
- Destination Address:目的ip地址
- Options:选项,在某些 IP 数据报的标准报头之后,可以包含几种类型的选项中的一种或多种
- Padding:填充,如果包含一个或多个选项,并且用于它们的位数不是 32 的倍数,则添加足够的零位以将标头“填充”为 32 位(4 字节)的倍数
- Data:数据,要在数据报中传输的数据,可以是整个高层消息,也可以是消息的片段。
tcp
整个数据将填充于IP
协议的Data
中,如图所示
以太网II
Ethernet II
数据链路层
事实上只有iP
是无法到达目的主机的,这是因为最终应用层交付的数据是由物理层面来接手。ip
地址只是逻辑地址,真正地址是设备的mac
地址,所谓的mac
地址就是物理设备的"指纹"。整条链路下来如同套娃一样,一层层嵌套。以太网数据帧如图所示2:
当http
协议的数据被封装到链路层的数据包准备发送时,需要知道两个很重要的参数Destination MAC Address
和Source MAC Address
。机器的操作系统一启动就会将网卡的mac
地址写入内存,所以很容易知道自己的mac
地址,而对方的mac
地址则需要ARP
协议来确定。
ARP协议
全称:Address Resolution Protocol
,是一种ip
地址到mac
地址的映射,已知目标ip
查询所对应的mac
地址。
如果目标主机的ip
地址不在一个链路,那么会查找一下跳路由器的mac
地址。如何知道对方的mac
地址呢,很容易想到的方案就是广播,情况分为两种。
- 两台主机在同一网段,
arp
将以广播的方式进行请求,如图所示:
a想要发送数据包给b,比如http
请求tcp
建立连接的第一次握手syn
包,a会检查自己的arp
本地缓存(arp -a
),如果目的ip
地址命中缓存就直接取出对应的mac
地址,如果没有命中,那么a通过arp
协议向局域网中广播192.168.61.191
的mac
地址是什么,局域网中的每个主机收到这个arp
数据包后检查自己的ip
地址和询问的ip
地址是否匹配,如果匹配则返回自己的mac
地址,如果不是则丢弃。这时候a就知道目的主机的mac
地址了进而构造出L23的header
,通过switch
转发到目的主机。如果浏览器的网址是访问一个局域网中的服务器,那么到这里客户端的syn
包已经发送到服务器端了,服务端接收到这个L2
的数据包后,又层层解开封装,如同一层层剥开洋葱一样,直到tcp
的包暴露出来,这时服务器才知道客户端想建立连接,然后就是三次握手,握手后客户端开始发送http
协议的内容,服务端收到后将网页的内容返回回去,然后就是浏览器渲染html
文本,进而用户看见了网页。
-
两台主机不在同一网段,此时就需要
Proxy ARP
4。整个过程还需要路由器参与将数据包送到不同的网段。通过子网掩码可以判断两个ip
是不是同一个网段。如图所示,每个路由器之间mac
地址都会被剥离并且生成新的目的mac
地址使其到达下一跳。第一个主机的生成的ip
数据包只会被接收的主机剥离。因此ip
数据包的头部是“端到端“的处理,而数据链路的数据包头部是”跳到跳“处理
总结
当浏览器发出页面请求的时候,就会层层封装消息,从应用层到物理层,到了服务器又会层层解封,最终解出http协议并将目录下的网页文件内容发送给客户端这个过程又涉及层层封装消息,客户端收到后层层解出得到网页的html
文本,浏览器渲染,最终生成用户看见的页面。如动图所示5: