当我们输入网址到网页显示,期间发生了什么呢
域名解析 --> 发起TCP的3次握手 --> 建立TCP连接后发起http请求 --> 服务器响应http请求,浏览器得到html代码 --> 浏览器解析html代码,并请求html代码中的资源(如js、css、图片等) --> 浏览器对页面进行渲染呈现给用户。
1.首先进行域名解析,域名解析具体过程讲一下: 应用层
2.浏览器发起HTTP请求;应用层(为数据加上对应的应用层协议头)
3.接下来到了传输层(将数据分段,标序号,添加端口号),选择传输协议,TCP或者UDP,TCP是可靠的传输控制协议,对HTTP请求进行封装,加入了端口号等信息;
4.然后到了网络层(添加IP协议头,源IP,目的IP),通过IP协议将IP地址封装为IP数据报;然后此时会用到ARP协议,主机发送信息时将包含目标IP地址的ARP请求广播到网络上的所有主机,并接收返回消息,以此确定目标的物理地址,找到目的MAC地址;
5.接下来到了数据链路层(为数据添加帧头帧尾以及MAC地址), 交换机 把网络层交下来的IP数据报添加首部和尾部,封装为MAC帧,现在根据目的mac开始建立TCP连接,三次握手,接收端在收到物理层上交的比特流后,根据首尾的标记,识别帧的开始和结束,将中间的数据部分上交给网络层,然后层层向上传递到应用层;
6.服务器响应请求并请求客户端要的资源,传回给客户端;
7.断开TCP连接,浏览器对页面进行渲染呈现给客户端。
对流程详细的进行过分析,还是有点东西在里面的,接下来一起详细感受一下当输入网址后,到网页显示,期间发生了什么
第一步就是对URL进行解析,从而生成发送给web服务器的请求信息。
当没有路径名时,就代表访问根目录下事先设置的默认文件,也就是/index.html或者/default.html
对URL解析后确定了web服务器和文件名,接下来就根据这些信息生成HTTP请求消息。
解析URL并生成HTTP消息后,需要委托操作系统将消息发送给Web服务器。
但我们需要获取服务器对应的IP地址,因为委托操作系统发送消息需要知道他的IP地址。
DNS服务器专门保存了WEB服务器域名与IP的对应关系。
流程
至此完成了DNS的解析过程。
图解
域名解析的过程只指路不带路,只告诉他去哪找。
协议栈的内容分为几个部分,分别承担不同的工作,上下关系有一定的规则,上面部分会向下面的部分委托工作,下面的部分收到委托的工作并执行。
应用程序通过调用Socket库,来委托协议栈工作。
协议栈的上半部分有两块,分别是负责收发数据的TCP协议和UDP协议,他们接受应用层的委托执行收发数据的操作。
协议栈的下面一半是用IP协议控制网络包收发操作,在互联网上传输数据时,数据会被切成一块块的网络包,而将网络包发送给对方的操作就是由IP负责的。此外IP中还包括ICMP协议(告知网络包传送过程中产生的错误以及各种控制信息)和ARP协议(根据IP地址查询相应的以太网MAC地址)
IP下面的网卡驱动程序负责控制网卡硬件
最下面的忘啦负责完成实际的收发操作,也就是对网线中的信号执行发送和接受操作。
TCP建立连接前需要进行三次握手
所以三次握手目的是保证双方都有发送和接受的能力
如果HTTP请求消息比较长了,超过了MSS 的长度,这是 TCP 就需要把 HTTP 的数据拆解成一块块的数据发送,而不是一次性发送所有数据。
数据会以 MSS 的长度为单位进行拆分,拆分出来的每一块数据都会被放进单独的网络包中。也就是在每个被拆分的数据加上 TCP 头信息,然后交给 IP 模块来发送数据。
TCP 协议里有两个端口,一个是浏览器监听的端口(通常是随机生成的) ,一个是WEB服务器监听的端口(HTTP默认是80,HTTPS默认是443)
在双方建立了连接后,TCP 报文中的数据部分就是存放 HTTP 头部 + 数据,组装好TCP报文之后,就需要交给下面的网络层处理。
TCP 模块在执行连接、收发、断开等各阶段操作时,都需要委托IP模块将数封装成网路包发送给通信对象。
在 IP 协议里面需要有源地址 IP 和 目标地址 IP:
因为 HTTP 是经过 TCP 传输的,所以在 IP 包头的协议号,要填写为 06 (十六进制),表示协议为 TCP。
生成了IP头部后,接下来网络包还需要在 IP 头部的前面加上 MAC 头部
MAC 头部是以太网使用的头部,它包含了接收方和发送方的 MAC 地址等信息。
在 MAC 包头里需要发送方MAC 地址和接收方目标 MAC 地址,用于两点之间的传输。
一般在TCP/IP 通信里,MAC 包头的协议类型只使用:
发送方的 MAC 地址获取就比较简单了,MAC 地址是在网卡生产时写入到 ROM 里的,只要将这个值读 取出来写入到 MAC 头部就可以了。
接收方的 MAC 地址就有点复杂了,只要告诉以太网对方的 MAC 的地址,以太网就会帮我们把包发送过去,那么很显然这里应该填写对方的 MAC 地址。
所以先得搞清楚应该把包发给谁,这个只要查一下路由表就知道了。在路由表中找到相匹配的条目,然 后把包发给 Gateway 列中的 IP 地址就可以了。
此时需要 ARP 协议帮我们找到路由器的 MAC 地址
ARP 协议会在以太网中以广播的形式,对以太网所有的设备喊出:“这个 IP 地址是谁的?请把你的 MAC 地址告诉我”。
然后就有人回答这个IP是他的,他的MAC地址时XXXX。
如果对方和自己处于同一个子网中,那么通过上面的操作就可以得到对方的MAC地址,,然后,我们将这个MAC地址写入MAC头部,MAC头部就完成了。
也不是每次都需要广播获取
在后续操作系统会吧本次查询结果放到一块叫做ARP缓存的内存空间留着以后用,不过缓存的时间就几分钟。
也就是说在发包时先查询ARP缓存,如果其中已经保存了对方的MAC地址,就不需要发送查询,直接使用ARP缓存中的地址。
而当 ARP 缓存中不存在对方MAC地址时,则发送ARP广播查询。
IP生成的网络包知识存放在内存中的一串二进制数字信息,没有办法直接发送给对方。因此,我们需要将数字信息转换为电信号,才能在网线上传输,也就是说,这才是真正的数据发送过程。
网卡执行这一系列操作,要控制网卡的还需要网卡驱动程序。
网卡从 IP 模块获取到包之后,会将其复制到网卡内的缓存区中,接着会再其开头加上报头和其实帧界符,在末尾加上用于检测错误的帧校验序列。
最后网卡会将包转换为电信号,通过网线发送出去。
交换机的设计是将网络包原样转发到目的地
包交接操作
首先电信号到达网线接口,交换机里的模块模块进行接收,接下来交换机里的模块将电信号转换为数字信号。
然后通过包末尾的 FCS 检验错误,如果没问题则放到缓冲区。这部分操作基本和计算机的网卡相同,但交换机的工作方式和网卡不同。
计算机的网卡本身具有 MAC 地址,并通过核对收到的包的接收方 MAC 地址判断是不是发给自己的的,如果不是发给自己的就丢弃;相对的,交换机的端口不核对接收方的MAC 地址,而是直接接收所有的包并存放到缓冲区中。因此,交换机和网卡不同,交换机的端口不具有MAC地址
将包放入缓冲区后,接下来需要查询一下这个包的接收方 MAC 地址是否已经在 MAC 地址表中有记录了。
交换机的 MAC 地址表主要包含两个信息:
举个例子,如果收到的包的接收方 MAC 地址为 00-02-B3-1C-9C-F9 ,则与图中表中的第 3 行匹配,根据端口列的信息,可知这个地址位于 3 号端口上,然后就可以通过交换电路将包发送到相应的端口了。
所以,交换机根据 MAC 地址表查找 MAC 地址,然后将信号发送到相应的端口。
地址表中找不到指定的 MAC 地址。这可能是因为具有该地址的设备还没有向交换机发送过包,或者这个设备一段时间没有工作导致地址被从地址表中删除了。
这种情况下,交换机无法判断应该把包转发到哪个端口,只能将包转发到除了源端口之外的所有端口上,无论该设备连接在哪个端口上都能收到这个包。
这样做不会产生什么问题,因为以太网的设计本来就是将包发送到整个网络的,然后只有相应的接收者才接收包,而其它设备会忽略这个包。
那会造成网络拥堵吗
发送了包之后目标设备会做出相应,只要返回了相应包,交换机就可以将它的地址写入 MAC 地址表,下次也就不需要把包发送到所有端口了。
局域网中每秒可以传输上千个包,多处一两个包并无大碍。
此外,如果接收方 MAC 地址是一个广播地址,那么交换机会将包发送到除源端口之外的所有端口。
以下两个属于广播地址
网络包经过交换机以后,到达路由器,并在此转发到下一个路由器或目标设备。
这一步转发的工作原理和交换机类似,也是通过查表判断包转发的目标。
不过再具体的操作过程上,路由器和交换机是有区别的。
路由器基本原理
路由器的端口具有 MAC 地址,因此他就能够成为以太网的发送方和接收方;同时还具有 IP 地址,从这个意义上来说,它和计算机的网卡是类似的。
当转发包时,首先路由器端口会接收发给自己的以太网包,然后路由表查询转发目标,再由响应的端口作为发送方将以太网包发送出去。
路由器的包接收操作
首先,电信号到达网线接口部分,路由器中的模块会将电信号转成数字信号,然后通过包末尾的 FCS 进行错误校验。
如果没问题则检查 MAC 头部中的接收方 MAC 地址,看卡是不是发送给自己IDE包,如果是就放到接收缓冲区中,否则就丢弃这个包。
总的来说,路由器的端口都具有 MAC 地址,只接收与自身地址匹配的包,遇到不匹配的就丢弃。
查询路由表确定输出端口
完成包接收操作之后,路由器就会去掉包开头的 MAC 头部。
MAC 头部的作用就是将包送达路由器,其中的接收方 MAC 地址就是路由器端口的 MAC 地址。因此,当包到达路由器之后,MAC 头部的任务就完成了,于是 MAC 头部就会被抛弃。
接下来,路由器会根据 MAC 头部后方的 IP 头部中的内容进行包的转发操作。
转发操作分为几个阶段,首先是查询路由表判断转发目标。
举个例子
假设地址为 10.10.1.101 的计算机要向地址为 192.168.1.100 的服务器发送一个包,这个包先到达图中的路由器。
判断转发目标的第一步,就是根据包的接收方 IP 地址查询路由表中的目标地址栏,以找到相匹配的记录。
路由匹配和前面讲的一样,每个条目的子网掩码和 192.168.1.100 IP 做 & 与运算后,得到的结果与对应条目的目标地址进行匹配,如果匹配就会作为候选转发目标,如果不匹配就继续与下个条目进行路由匹配。
如第二条目的子网掩码 255.255.255.0 与 192.168.1.100 IP 做 & 与运算后,得到结果是 192.168.1.0 ,这与第二条目的目标地址 192.168.1.0 匹配,该第二条目记录就会被作为转发目标。
实在找不到匹配路由时,就会选择默认路由,路由表中子网掩码为 0.0.0.0 的记录表示「默认路由」。
路由器的发送操作
接下来会进入包的发送操作
首先,我们需要根据路由表的网关列判断对方的地址
知道对方的 IP 地址之后,接下来需要通过 ARP 协议根据 IP 地址查询 MAC 地址,并将查询的结果作为接收方 MAC 地址。
路由器也有 ARP 缓存,因此首先会在 ARP 缓存中查询,如果找不到则发送 ARP 请求。
接下来是发送方 MAC 地址字段,这里填写输入端口的MAC 地址。还有一个以太类型字段,填写 0080(十六进制)表示 IP 协议。
网络包完成后,接下来会将其转换成电信号并通过端口发送出去。这一步的工作过程和计算机也是相同的。
发送出去的网络包会通过交换机到达下一个路由器。由于接收方 MAC 地址就是下一个路由器的地址,所以交换机会根据这一地址将包传输给下一个路由器。
接下来,下一个路由器会将包转发给再下一个路由器,经过层层转发之后,网络包就到达了最终的目的地。
不知你发现了没有,在网络包传输的过程中,源 IP 和目标 IP 始终是不会变的,一直变化的是 MAC 地址,因为需要 MAC 地址在以太网内进行两个设备之间的包传输
数据包抵达服务器后,服务器会先扒开数据包的 MAC 头部,查看是否和服务器自己的 MAC 地址符合,符合就将包收起来。
接着继续扒开数据包的 IP 头,发现 IP地址符合,根据 IP 头中协议项,知道自己上层是 TCP 协议。
于是,扒开 TCP 的头,里面有序列号,需要看一看这个序列包是不是我想要的,如果是就放入缓存中然后返回一个 ACK,如果不是就丢弃。TCP 头部里面还有端口号,HTTP 的服务器正在监听这个端口号。
于是,服务器自然就知道是 HTTP 进程想要这个包,于是就将包发给 HTTP 进程。
服务器的 HTTP 进程看到,运来这个请求是要访问一个页面,于是把这个网页封装在HTTP 响应报文里。
HTTP响应报文也需要穿上 TCP 、IP 、MAC 头部,不过这次源地址是服务器 IP 地址,目的地址时客户端 IP 地址。
穿好头部衣服后,从网卡出去,交由交换机发出到出城的路由器,路由器就把响应数据包发送到了下一个路由器,就这样跳啊跳。
客户端收到了服务器响应的数据包后,也开始扒皮,把收到的数据包的皮扒的只剩 HTTP 响应报文后,交给浏览器去渲染页面,一份特别的数据包快递就这样显示出来了。
最后客户端要厉害了,向服务器发起了 TCP 四次挥手,至此双方连接就断开了。