2.键入网址到网页显示的过程
当我们输入网址到最后显示请求页面的简要流程图如下:
1.1 HTTP
当我们向浏览器输入网址后,浏览器首先就是解析URL,从而生成发送给Web服务器的请求信息。
- URL组成元素:URL开头表示访问数据时使用的协议,//后面的字符串表示服务器的名称,后面的蓝色部分表示服务器所在目录及文件名,第一个/后面是目录名,最后一个/后面是文件目录下的文件名。
- 若URL中的蓝色部分省略(即文件目录及下面的文件),那此时请求的是哪个文件呢?当没有路径名时,代表访问根目录下的默认文件(即index.html或default.html)。
当浏览器解析完客户端输入的URL后,就根据解析到的web服务器和路径名生成HTTP请求消息。
- 请求报文:HTTP请求是由请求行、消息头、消息体三部分构成。请求行由请求方法+sp(空格)+URL+sp+HTTP协议版本组成;其中请求方法包含GET、POST、PUT、DELETE、OPTION等方法。其中GET方法请求报文,消息体数据为空,POT请求报文包含消息体数据。消息头由若干个首部字段名+sp+字段值构成。消息体由客户传输的数据组成。
- 响应报文:HTTP响应报文由状态行、消息头、消息体构成。状态行由传输协议版本号、状态码、状态消息构成。消息头由若干个首部字段名+sp+字段值构成,消息体由服务端传来的消息构成。
1.2 真实地址查询-DNS
当浏览器将URL解析为HTTP请求后,需要委托操作系统将消息发送给服务端。发送之前,需要查询域名找到对应IP。因为委托操作系统发送消息前,必须提供两个通讯对象的IP地址。
在计算机网络中,DNS服务器专门保存web服务域名与IP对应关系。DNS中的域名使用英文句号分割,如www.server.com.,这里的英文句号表示不同层次之间界限。在域名中,越靠右的位置表示其层级越高。外国人说具体城市是按照从小到大的顺序排列(如XXX街道XXX区XXX市XXX省);在域名最后还有一个英文句号.,它表示根域名,根域名在DNS服务器的最顶层,下一层.com是顶级域,最后的server.com是权威域。
域名层级关系类似于一个树状结构:
- 根DNS服务器(.)
- 顶级域名DNS服务器(.com)
- 权威DNS服务器(server.com)
根域的DNS服务器信息保存在互联网中所有的DNS服务器中。任何服务器都可以找到并访问根域DNS服务器。因此客户端只要能找到任意一台DNS服务器,就可以通过它找到根域DNS服务器,然后再逐步找到不同下层的目标DNS服务器。
1.2.1 域名解析工作流程
- 客户端首先发出一个DNS请求,询问www.server.com.的IP是多少,并发给本地DNS服务器(即客户端TCP/IP设置中填写的DNS服务器地址);
- 当本地域名服务器收到客户端请求后,如果缓存表格中能够找到www.server.com.,那么直接返回其IP地址;如果找不到,本地DNS服务器回去访问跟域名服务器,由于根域名服务器是最高层次的,他不能直接用于域名解析,但能指明路线;
- 根DNS收到本地DNS的请求后,发现其后置是.com,因此告诉本地DNS该域名归.com.区域管理,并将.com顶级域名DNS服务器地址发给本地DNS;
- 本地域名服务器收到顶级域名服务器地址后,就像顶级域名服务器发起请求询问www.server.com.对应IP是多少;
- 顶级域名服务器收到本地域名服务器的请求后,将权威DNS服务器地址发给本地域名服务器;
- 于是本地域名服务器又去访问权威域名服务器,server.com是权威DNS服务区能够解析的
- 权威域名服务器将server.com对应的IP地址告诉本地域名服务器;
- 最后,本地域名服务器将IP地址返回给客户端,客户端和目标IP建立连接。
DNS域名解析指指路不带路,到最后的权威域名服务器解析域名找到对应IP地址,并返回给本地域名服务器。
1.2.2 是否每次域名解析都需要经过上述步骤?
不是的,浏览器对于输入的网址,首先查该域名的缓存,如果有直接返回;如果没有就去问操作系统,操作会去查自己的缓存,如果有直接返回,如果没有去看host文件,如果host文件也没有再去访问本地DNS服务器,走上述域名解析流程。
1.3 协议栈
通过DNS获取到域名对应的IP地址后,将HTTP传输工作交给操作系统的协议栈来处理。协议栈分为两个部分,上面的部分委托工作,下面的部分收到委托工作并执行。
应用程序(浏览器)通过调用Socket库,委托协议栈工作,协议栈上半部分负责收发数据的TCP和UDP协议,这两个协议接收应用层委托并执行收发数据操作。协议栈的下半部分通过IP协议控制网络包收发操作,在互联网传输时,数据会被划分成一块块的网络包,IP负责将网络包发送给对方。
IP中包含ICMP和ARP协议:
- ICMP协议告知网络宝传输过程中产生的错误以及各种控制信息;
- ARP根据IP地址查询相应以太网的MAC地址;
IP下面的网卡驱动程序负责控制网卡硬件,最下面的网卡负责完成实际的收发操作,即对网线中的信息执行发送和接收操作。
1.4 可靠传输-TCP
HTTP协议是基于TCP协议传输的
1.4.1 TCP包头格式
- 源端口号和目标端口号:TCP中包含请求和响应的端口号,完成两个应用端口之间的数据传递;
- 序号:解决包乱序的问题;
- 确认号:确认数据发出去后对方是否接收。若没接收则重发,直到确认,解决丢包问题;
- 状态号:SYN指发起一个连接,ACK是指连接确认,RST值重新发送连接,FIN是结束连接。TCP面向连接的,双方要维护连接状态,这些带状态位的包发送,会引起双方状态变更。
- 窗口大小:TCP具备流量控制的功能,通信双方各声明一个窗口(缓存)来约束自己处理数据的能力。并且还具备拥塞控制,控制发送速度。
1.4.2 TCP三次握手
在HTTP传输数据之前,需要TCP三次握手建立连接,客户端和服务端建立连接如下:
- 首先,客户端和服务端都处于CLOSED状态,服务端主动监听某个端口,处理LISTEN状态;
- 然后客户端向服务端发起SYN,请求建立连接,并处于SYN-SENT状态;
- 服务端收到客户端的请求连接后,返回SYN,并且ACK客户端的SYN,之后处于SYN-REVD状态;
- 客户端收到服务端发送的SYN和ACK后,发送服务端的SYN的确认ACK,之后处于ESTABLISHED状态;
- 服务端收到客户端的ACK后,也处于ESTABLISHED状态;
三次握手后,客户端和服务端都拥有发送和接收的能力。
1.4.3 查看TCP连接状态
在Linux中使用netstat-napt命令查看TCP连接状态:
1.4.4 TCP分割数据
如果HTTP请求消息过长,超过了MSS长度,这时TCP会将HTTP数据拆解成一块块的数据发送,而不是一次性发送所有数据。
- MTU(最大传输单元):网络能够传输的最大数据包大小,一个网络包的最大长度,以太网中一般为1500字节,太大容易丢失,太小影响传输效率。MTU是网卡参数,是数据链路层对网络层的IP包的大小限制。
- MSS(最大报文长度):除去IP和TCP头部后,一个网络包所能容纳的TCP数据最大长度。TCP限制应用层的发送字节数。
数据以MSS的长度为单元进行拆分成一块块的数据,并都会被单独放进单独的网络包中,即每个被拆分的数据加上TCP头信息,然后交给IP模块发送数据。
1.4.5 生成TCP报文
TCP协议中有两个端口,一个是浏览器监听的端口(通常随机生成),一个是web服务端监听的端口(HTTP默认端口号是80,HTTPS默认端口号是443)。双方建立连接后,TCP报文数据部分存放HTTP头部和数据,组装好TCP报文后,交给网络层处理。网络包报文如图所示:
1.5 远程定位-IP
TCP在进行连接、、收发、断开等操作时,都需要委托IP将数据封装成数据包发送给通信对象。
IP包头格式如下:
在IP地址中需要源IP地址和目标IP地址:
- 源地址IP,客户端输出的IPP地址
- 目标地址IP:通过DNS域名服务器解析得到的Web服务IP
HTTP经过TCP传输,所以在IP包头中的协议号,填写为06(十六进制),表示协议为TCP。
1.5.1 如何确定源地址IP
当存在多个网卡时,如何填写源地址IP,即如何在多块网卡中确定用哪块网卡来发送数据包。这时需要根据路由表规则,判断哪个网卡作为源地址IP。
在Linux系统中,通过route-n命令查看当前系统的路由表
根据如上路由表,假设we服务器目标地址是192.168.10.200
- 首先,目标地址与第一条目的子网掩码进行按位与运算,得到IP网址192.168.10.0,再与第一条目中的destination(192.168.3.0)匹配,匹配结果结果失败;
- 再将目标地址与第二条目的子网掩码进行按位与运算,得到结果为192.1668.10.0.与第二条目的destination匹配成功,所以将eth1网卡的IP地址作为IP地址作为IP包头的源地址。
若前两条目都没有匹配成功,那么就会与第三条目匹配。第三条目比较特殊,目标地址和子网掩码都是0.0.0.0.表示默认网关,如果其他条目都无法匹配,就会自动匹配这一行,后续将包发给路由器,网关即路由器IP。
1.6 两点传输-MAC
1.6.1 MAC包头格式
MAC头部是以太网使用的头部,包含接收方和发送方的MAC地址等信息。
在MAC包头里需要发送方MAC地址和接收方MAC地址,用于两点之间传输。
一般在TCP/IP通信模型中,MAC包头协议类型只有两种:
- 0800:IP协议
- 0806:ARP协议
1.6.2 MAC发送方和接收方如何确认?
- 发送方MAC地址:MAC地址是在网卡生产时写入ROM的,只要将其值读取到MAC头部即可;
- 接收方MAC地址:填写对方的MAC地址,告诉以太网对方MAC地址,以太网就会帮我们把包发送过去。
直到将包发给谁,查路由表即可,在路由表中找到相匹配的条目,然后将包发给网关中的IP地址即可。
1.6.3 如何获取对方的MAC地址
不知道对方MAC地址,就使用ARP协议通过广播的形式帮我们找到路由器的MAC地址
如果对方和自己同处于一个子网,通过上述操作可以得到对方的MAC地址,然后将MAC地址写入MAC头部就可以进行网络传输。
1.6.4 每次广播获取,如何解决?
当我们获得过对方MAC地址后,操作系统会将本次查询的MAC地址放在一块ARP缓存的内存空间中,只不过缓存时间只有几分钟。
发包时:
- 先查询ARP缓存,如果其中保存对方的MAC地址,就不需要发送ARP广播查询,直接使用ARP缓存中的地址;
- 当ARP缓存不存在对方MAC地址,则发送ARP广播查询;
1.6.5 arp-a命令查看ARP缓存内容
在Linux中,使用arp-a命令查看ARP缓存内容
1.6.6 MAC报文生成
1.7 网卡
网络包是存在于内存的一串二进制数字信息,无法直接发送给通讯方。因此,需要数字信息转换为电信号才能在网线中传输,即真正的数据发送过程。负责上述操作的是网卡,控制网卡需要靠网卡驱驱动程序。
网卡获取网络包后,会将其复制到网卡内的缓存区中,接着,在其头部加上标识包起始位置的报头和起始帧分界符,在末尾加上用于检测错误的帧校验序列(FCS)。
1.8 交换机
交换机的作用是将网络包转发到目的地。交换机工作在MAC层,也称为二层网络设备。
1.8.1 交换机的包接收操作
- 首先,电信号到达网线接口,交换机里的模块进行接收,接下来交换机的模块将电信号转换为数字信号;
- 然后通过包末尾的FCS校验错误,如果无错则放到缓存区。操作类似于网卡,区别于工作方式
- 计算机的网卡具有MAC地址,首先核对收到包的接收方MAC地址,如果不是丢弃,交换机端口不核对接收方的MAC地址,而是直接接收所有包并存放在缓冲区,与网卡不同的是:交换机端口不具有MAC地址;
- 将包放入缓存区后,查询该报的接收方MAC地址是否已经在MAC地址表中的记录中。
交换机的MAC地址主要包含两个信息:
- 设备的MAC地址;
- 另一个即设备联机在交换机的那个端口上;
交换机中有一张MAC地址与网线端口的映射表。当接收到包时,会将响应的端口号和发送MAC地址写入表中,这样可以根据地址判断出该设备连接在哪个端口上。
如包的接收方MAC地址为00-02-B3-1C-9C-F9,则与上述图的表中第三行匹配,根据端口列信息,可知地址位于3号端口,通过交换电路将包发送到相应端口。因此,交换机根据MAC地址表查找MAC地址,然后将信号发送到相应端口。
1.8.2 MAC地址找不到指定的MAC地址怎么办?
如果在MAC地址表中找不到指定的MAC地址,可能是因为具有该地址的装备没有向交换机发送过包,或者该设备一段时间没有工作导致它的MAC地址从地址表中删除。即MAC地址表并不是一直存储MAC地址。这种情况下,交换机无法判断包转发给哪个端口,只能将包转发给除源端口以外的所有端口上,无论该设备连接在哪个端口都能接收到这个包。因为以太网的设计是将包发送到整个网络,只有相应的接受者才能接收包,而其他设备忽略这个包。
1.8.3 发送多余包会不会造成网络拥塞?
发送包之后目标设备会做出响应,只要返回了响应包,交换机就会将它的MAC地址写入到MAC地址表中,下次就不需要将包发送给所有端口。接收方的MAC地址是一个广播地址,交换机会将包发送到除源端口外的所有端口。
以下两个地址属于广播地址:
- MAC地址中的FF:FF:FF:FF:FF:FF
- IP地址中的255.255.255.255
1.9 路由器
1.9.1 路由器与交换机的区别
网络包经过交换机之后,到达路由器,将再次被转发到下一个路由器或目标设备。这一步类似于交换机,通过查表判断包转发的目标。具体操作过程中,交换机与路由器的区别:
- 路由器基于IP设计,俗称三层网络设备,路由器的各个端口都具有MAC地址和IP地址;
- 交换机是基于以太网设计的,俗称两层网络设备,交换机不具有MAC地址。
1.9.2 路由器基本原理
路由器具有MAC地址,因此它能够成为以太网的发送方和接收方;同时具有IP地址,当转发包时,首先路由器会接受发送给自己的以太网包,然后根据路由表查询转发目标,再由响应的端口作为发送方将以太网包发送出去。
1.9.3 路由器的包接收操作
首先,电信号到达网线接口,路由器中的模块将电信号转换为数字信号,然后通过包末尾的FCS进行错误校验。如果没问题则检查MAC头部的接收方MAC地址,校验是否是发送给自己的,如果是就放入接收缓冲区,否则丢弃该包。
1.9.4 查询路由表确定输出端口
MAC头部作用是将包送达路由器,接收方MAC地址即路由器端口MAC地址。当路由器接收到包后会去掉包头的MAC头部,它的任务就完成了,于是MAC头部就被丢弃。接下来,路由器根据MAC头部后方的IP头部内容进行包转发操作,首先是查询路由表判断转发目标:
实例:假设地址为10.10.1.101的计算机向地址为192.168.1.100的服务器发送一个网络包,该包先到达图中的路由器。判断转发目标第一步即根据包的接收方IP地址查询路由表中的目标地址栏,找到相匹配的记录。
路由匹配是将每个子目的子网掩码192.168.1.100与目标IP按位与运算,得到结果与对应条目的目标地址进行匹配,如果匹配成功会作为候选转发目标,如果不匹配继续与下个条目进行路由匹配。如果找不到匹配路由,会选择默认路由,路由表中子网掩码为0.0.0.0的记录表示默认路由。
1.9.5 路由器的发送操作
根据路由表的网关列判断对方地址:
-
-
如果网关为空,则IP头部中的接收方IP就是要转发到的目标地址,即终于找到IP包头里的目标地址,说明已抵达终点。
知道对方IP地址后,通过ARP协议根据IP地址查询MAC地址,并将查询结果作为接收方MAC地址。路由器也有ARP缓存,因此首先在ARP缓存中查询,如果找不到则发送ARP查询请求。接下来是发送方MAC地址字段,这里填写输出端口的MAC地址。还有一个以太类型字段,填写0800(十六进制)表示IP协议。网络包完成后,接下来会将其转换成电信号通过端口发送出去。这一步的工作过程和计算机也是相同的。发送出去的网络包通过交换机到达下一个路由器。由于接收方MAC地址就是下一个路由器地址,所以交换机会根据这一地址将包传输到下一个路由器。接下来下一个路由器将包转发到再下一个路由器,经过层层转发后,网路包到达最终目的地。
在网络包传输过程中,源IP和目标IP始终不会改变,一直变化的是MAC地址,因为需要MAC地址在以太网中进行两个设备之间的包传输。
1.10 服务端和客户端数据通讯流程图
2.参考博客
本人博客内容是基于小林coding的计算机网络写的,中间省略了部分内容,大家可以去小林coding博客看更详细的图解网络,链接为:小林coding (xiaolincoding.com)。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
2021-06-19 递归