摘要:如图1所示,从输入网址,按下回车键之后的数据传输流程发生了什么。
注意:各位大佬,如果有哪里写的不清楚,请在邮件[email protected]友善的交流。
图1 网址键入到网页显示流程
浏览器第一步就是要对URL进行解析,从而生成发送给web服务器的请求信息。
图1 解析URL
对url进行解析之后,浏览器确定了web服务器和文件名,接下来就是根据这些信息来生成HTTP请求消息了。
对URL解析之后,浏览器确定给了Web服务器和文件名,接下来就是根据这些信息来生成HTTP请求消息了。
图2 Http请求报文和响应报文结构
浏览器在发送之前http消息之前,还需要查询服务器域名对应的IP地址,然后委托操作系统发送消息给对方。
域名解析的工作流程如下所示:
1.客户端首先会发出一个DNS请求,问www.baidu.com的ip是啥,并发给本地DNS服务器(也就是客户端TCP/IP设置中填写的DNS服务器地址)。
2.本地域名服务器收到客户端的请求后,如果缓存里的表格能找到www.baidu.com,则它直接返回IP地址。如果没有,本地DSN会去问它的根域名服务器,根域名服务器是最高层次的,它不直接用于域名解析,但能指明一条道路。
3.根DNS收到来自本地DNS的请求后,发现后置是.com,说,“www.baidu.com”这个域名归.com区域管理,给你顶级域名服务器地址,你问它。“
4.本地dns收到顶级域名服务器的地址后,发起请求问“请告诉我www.baidu.com这个域名的IP地址”
5.顶级域名服务器说:“我给你负责www.server.com区域的权威dns服务器的地址,你去问它”
6.本地dns于是询问权威dns服务器,baidu.com的权威dns服务器,它是域名解析结果的原出处,
7.权威dns服务器查询后将对应的IP地址x.x.x.x告诉本地dns
8.本地dns在将ip地址返回客户端,客户端和目标建立连接。
我们这样就完成了dns的解析过程。
总结一下:一共我们涉及到了4种dns服务器。
当操作系统收到浏览器的委托后,将HTTP的传输工作交给操作系统中的协议栈。
浏览器通过调用Socket库,来委托协议栈工作,如图1所示,协议栈有两块,分别是负责收发数据的TCP和UDP协议,他们两个会接收应用层的委托执行收发数据的操作。
协议栈的下面一半是用IP协议控制网络包收发操作,在互联网上传数据时,数据会被切分成一块块的网络包,而将网络包发送给对方的操作就是由IP负责的。
IP协议中包含了ICMP协议和ARP协议:
IP下面的网卡驱动负责控制网卡硬件,而最下面的网卡负责完成实际的收发操作,也就是对网线中的信号执行发送和接收操作。
HTTP是基于TCP协议传输的,所以我们要了解些tcp协议。
5.1TCP的报文格式
如图3所示:
图3 TCP报文格式
5.2 TCP的三次握手
TCP在传输数据之前,要先进行三次握手,如图4所示:
图4:TCP三次握手
所以三次握手目的是保证双方都有发送和接受的能力。
TCP报文生成
TCP协议里面有两个端口,一个是浏览器监听的端口(通常是随机生成的),另一个是WEB
服务器监听的端口(HTTP默认端口是80,HTTPS默认端口号时443)。
在双方建立了连接后,TCP报文中的数据部分就是存放HTTP头部+数据,组装好TCP报文之后,就需要交给下面的网络层处理。
TCP模块在执行连接、收发、断开等各阶段操作时,都需要委托IP模块将数据封装成网络包发送给通信对象。
IP数据包的数据格式如下所示:
图5 IP数据包格式
在IP协议里面需要有源地址IP和目的地址IP:
因为HTTP是经过TCP传输的,所以IP包头的协议号,要填写为06(十六进制),表示TCP。
假如客户端有多个网卡,就有多个IP地址,那就需要根据路由表规则,来判断哪一个网卡左元源地址IP。
最后,就会生成IP报文。
生成IP头部之后,接下来网络包还需要在IP头部的前面加上MAC头部。
图6 Mac帧格式
mac头部是以太网使用的头部,它包含了接收方和发送方的mac地址等信息。
一般在TCP/IP通信中,MAC包头的协议类型只使用:
如果获取发送方和接收方的mac地址?
发送方的mac地址获取比较简单,mac地址是在网卡生产时写入到rom里的,只要将这个值读取出来写入到mac头部就好了。
接收方的mac地址有点复杂,这时就需要ARP协议帮我们找到路由器的mac地址。ARP协议会在以太网中以广播的形式,对以太网所有的设备喊出:“这个IP地址是谁的?请告诉我你的mac地址”,得知后,就会将结果缓存起来,叫做ARP缓存。
至此,就生成了mac报文。
网络包只是存放在内存中的一串二进制数字信息,没有办法直接发送给对方。因此,我们需要将数字信息转换为电信号,才能在网线上传输,也就是说,这才是真正的数据发送过程。负责这一操作的得失网卡,控制网卡需要网卡驱动程序。
网卡驱动获取网络包之后,会将其复制到网卡内的缓存区中,接着会在其开头加上报头和起始帧分界符,在末尾加上用于检测错误的帧校验序列。
最后网卡会将包转为电信号,通过网线发送出去。
交换机的设计是将网络包原样转发到目的地。交换机工作在MAC层,也称为二层网络设备。
交换机的包接收操作
首先,电信号到达网线接口,交换机里的模块进行接收,接下来交换机里的模块将电信号转换为数字信号。
然后通过包末尾的 FCS
校验错误,如果没问题则放到缓冲区。这部分操作基本和计算机的网卡相同,但交换机的工作方式和网卡不同。
计算机的网卡本身具有 MAC 地址,并通过核对收到的包的接收方 MAC 地址判断是不是发给自己的,如果不是发给自己的则丢弃;相对地,交换机的端口不核对接收方 MAC 地址,而是直接接收所有的包并存放到缓冲区中。因此,和网卡不同,交换机的端口不具有 MAC 地址。
将包存入缓冲区后,接下来需要查询一下这个包的接收方 MAC 地址是否已经在 MAC 地址表中有记录了。
交换机的 MAC 地址表主要包含两个信息:
当 MAC 地址表找不到指定的 MAC 地址会怎么样?
这种情况下,交换机无法判断应该把包转发到哪个端口,只能将包转发到除了源端口之外的所有端口上,无论该设备连接在哪个端口上都能收到这个包。
这样做不会产生什么问题,因为以太网的设计本来就是将包发送到整个网络的,然后只有相应的接收者才接收包,而其他设备则会忽略这个包。
此外,如果接收方 MAC 地址是一个广播地址,那么交换机会将包发送到除源端口之外的所有端口。
以下两个属于广播地址:
FF:FF:FF:FF:FF:FF
255.255.255.255
路由器与交换机的区别
网络包经过交换机之后,现在到达了路由器,并在此被转发到下一个路由器或目标设备。
这一步转发的工作原理和交换机类似,也是通过查表判断包转发的目标。
不过在具体的操作过程中,路由器和交换机是有区别的。
路由器的基本原理
路由器的端口具有mac地址,因此它就能够成为以太网的发送方和接收方;同时还具有IP地址,从这个意义上来说,它和计算机的网卡是一样的。
当转发包时,首先路由器端口会接收发给自己的以太网包,然后路由表查询转发目标,再由相应的端口作为发送方将以太网包发送出去。
注意,在网络包传输的过程中,源IP地址和目标IP地址始终是不会变的,一直变化的是MAC地址,因为需要mac地址在以太网内进行两个设备之间的包传输。
数据包抵达服务器后,服务器会先扒开数据包的 MAC 头部,查看是否和服务器自己的 MAC 地址符合,符合就将包收起来。
接着继续扒开数据包的 IP 头,发现 IP 地址符合,根据 IP 头中协议项,知道自己上层是 TCP 协议。
于是,扒开 TCP 的头,里面有序列号,需要看一看这个序列包是不是我想要的,如果是就放入缓存中然后返回一个 ACK,如果不是就丢弃。TCP头部里面还有端口号, HTTP 的服务器正在监听这个端口号。
于是,服务器自然就知道是 HTTP 进程想要这个包,于是就将包发给 HTTP 进程。
服务器的 HTTP 进程看到,原来这个请求是要访问一个页面,于是就把这个网页封装在 HTTP 响应报文里。
HTTP 响应报文也需要穿上 TCP、IP、MAC 头部,不过这次是源地址是服务器 IP 地址,目的地址是客户端 IP 地址。