温故知新-输入网址-显示网页-到底到底到底到底-发生了什么?

键⼊⽹址到⽹⻚显示,期间发⽣了什么?

简易版-过程解析

⽹络拓扑模型:

解析 URL

⾸先浏览器做的第⼀步⼯作就是要对 URL 进⾏解析,从⽽⽣成发送给 Web 服务器的请求信息。

⽣成HTTP 请求信息

DNS-域名解析

通过浏览器解析 URL 并⽣成 HTTP 消息后,需要委托操作系统将消息发送给 Web 服务器。

所以,有⼀种服务器就专⻔保存了 Web 服务器域名与 IP 的对应关系,它就是 DNS 服务器。

DNS 中的域名都是⽤句点来分隔的,⽐如 www.server.com ,这⾥的句点代表了不同层次之间的界限。

在域名中,越靠右的位置表示其层级越⾼。

根域的 DNS 服务器信息保存在互联⽹中所有的 DNS 服务器中。

这样⼀来,任何 DNS 服务器就都可以找到并访问根域 DNS 服务器了。

因此,客户端只要能够找到任意⼀台 DNS 服务器,就可以通过它找到根域 DNS 服务器,然后再⼀路顺藤摸⽠到位于下层的某台⽬标 DNS 服务器。

协议栈-传输

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

应⽤程序(浏览器)通过调⽤ Socket 库,来委托协议栈⼯作。

协议栈的上半部分有两块,分别是负责收发数据的TCP 和 UDP 协议,它们两会接受应⽤层的委托执⾏收发数据的操作。

协议栈的下⾯⼀半是⽤ IP 协议控制⽹络包收发操作,在互联⽹上传数据时,数据会被切分成⼀块块的⽹络包,将⽹络包发送给对⽅的操作就是由 IP 负责的。

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

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

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

可靠传输-TCP

  • 源端⼝号和⽬标端⼝号是不可少的
  • 序号,这个是为了解决包乱序的问题
  • 确认号,⽬的是确认发出去对⽅是否有收到
  • ⼀些状态位。例如 SYN 是发起⼀个连接, ACK 是回复, RST 是重新连接, FIN 是结束连接等
  • 窗⼝⼤⼩。TCP 要做流量控制,通信双⽅各声明⼀个窗⼝(缓存⼤⼩),标识⾃⼰当前能够的处理能⼒

除了做流量控制以外,TCP还会做拥塞控制,对于真正的通路堵⻋不堵⻋,

它⽆能为⼒,唯⼀能做的就是控制⾃⼰,也即控制发送的速度。不能改变世界,就改变⾃⼰嘛。

三次握手的过程

三次握⼿建⽴连接

这个所谓的「连接」,只是双⽅计算机⾥维护⼀个状态机。

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

所以三次握⼿⽬的是保证双⽅都有发送和接收的能⼒。

TCP 的连接状态查看,在 Linux 可以通过 netstat -napt 命令查看。

TCP 分割数据

如果 HTTP 请求消息⽐较⻓,超过了 MSS 的⻓度,这时 TCP 就需要把 HTTP 的数据拆解成⼀块块的数据发送,⽽不是⼀次性发送所有数据。

数据会被以 MSS 的⻓度为单位进⾏拆分,拆分出来的每⼀块数据都会被放进单独的⽹络包中。

也就是在每个被拆分的数据加上 TCP 头信息,然后交给 IP 模块来发送数据。

TCP 报⽂⽣成

TCP 协议⾥⾯会有两个端⼝,⼀个是浏览器监听的端⼝(通常是随机⽣成的),⼀个是 Web 服务器监听的端口(HTTP 默认端⼝号是 80 , HTTPS 默认端⼝号是 443 )。

在双⽅建⽴了连接后,TCP 报⽂中的数据部分就是存放 HTTP 头部 + 数据,组装好 TCP 报⽂之后,就需交给下⾯的⽹络层处理。

远程定位-IP

根据路由表规则,来判断哪⼀个⽹卡作为源地址 IP。

在 Linux 操作系统,我们可以使⽤ route -n 命令查看当前系统的路由表。

IP报文生成

好啦好啦 ,大伙也看出来了,一层一层的加东西嘛,我们接着往下。

两点传输-MAC

MAC地址又叫做物理地址、硬件地址,用来定义网络设备的位置。

MAC 头部是以太⽹使⽤的头部,它包含了接收⽅和发送⽅的 MAC 地址等信息。

在 MAC 包头⾥需要发送⽅ MAC 地址和接收⽅⽬标 MAC 地址,⽤于两点之间的传输。

⼀般在 TCP/IP 通信⾥,MAC 包头的协议类型只使⽤:

  • 0800 : IP 协议
  • 0806 : ARP 协议, 地址解析协议,即ARP(Address Resolution Protocol)

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

发送⽅的 MAC 地址获取就⽐较简单了,MAC 地址是在⽹卡⽣产时写⼊到 ROM ⾥的,只要将这个值读取出来写⼊到 MAC 头部就可以了。

接收⽅的 MAC 地址就有点复杂了,只要告诉以太⽹对⽅的 MAC 的地址,以太⽹就会帮我们把包发送过去,很显然这⾥应该填写对⽅的 MAC 地址。

所以先得搞清楚应该把包发给谁,这个只要查⼀下路由表就知道了。在路由表中找到相匹配的条⽬,然后把包发给
Gateway 列中的 IP 地址就可以了。

如何获取对⽅的 MAC 地址呢?

ARP 协议帮我们找到路由器的 MAC 地址。

后续操作系统会把本次查询结果放到⼀块叫做 ARP 缓存的内存空间留着以后⽤,不过缓存的时间就⼏分钟。

也就是说,在发包时:

  • 先查询 ARP 缓存,如果其中已经保存了对⽅的 MAC 地址,就不需要发送 ARP 查询,直接使⽤ ARP 缓存中的地址。
  • ⽽当 ARP 缓存中不存在对⽅ MAC 地址时,则发送 ARP ⼴播查询。

在 Linux 系统中,我们可以使⽤ arp -a 命令来查看 ARP 缓存的内容。

好啦,报文生成了,又加了一层。

出⼝-⽹卡

终于准备出去了

⽹络包只是存放在内存中的⼀串⼆进制数字信息,没有办法直接发送给对⽅。

因此,我们需要将数字信息转换为电信号,才能在⽹线上传输,也就是说,这才是真正的数据发送过程。

负责执⾏这⼀操作的是⽹卡,要控制⽹卡还需要靠⽹卡驱动程序。

⽹卡驱动从 IP 模块获取到包之后,会将其复制到⽹卡内的缓存区中,接着会在其开头加上报头和起始帧分界符,在末尾加上⽤于检测错误的帧校验序列。

  • 起始帧分界符是⼀个⽤来表示包起始位置的标记
  • 末尾的 FCS (帧校验序列)⽤来检查包传输过程是否有损坏

送别者-交换机

交换机的设计是将⽹络包原样转发到⽬的地。交换机⼯作在 MAC 层,也称为⼆层⽹络设备。

交换机根据 MAC 地址表查找 MAC 地址,然后将信号发送到相应的端⼝。

出境⼤⻔-路由器

  • 路由器是基于 IP 设计的,俗称三层⽹络设备,路由器的各个端⼝都具有 MAC 地址和 IP 地址;
  • 交换机是基于以太⽹设计的,俗称⼆层⽹络设备,交换机的端⼝不具有 MAC 地址。

路由器的端⼝具有 MAC 地址,因此它就能够成为以太⽹的发送⽅和接收⽅;

同时还具有 IP 地址,从这个意义上来说,它和计算机的⽹卡是⼀样的。

当转发包时,⾸先路由器端⼝会接收发给⾃⼰的以太⽹包,然后路由表查询转发⽬标,再由相应的端⼝作为发送⽅将以太⽹包发送出去。

终于到了,这个时候就像快递到了,我们一层一层得把他拆开。

参考:图解网络

我这里只是一个自己的学习笔记,大家有兴趣一定去看原文!!! 谢谢大家的阅读!!

大家有兴趣一定去看原文,这只是我自己的一个笔记总结!!
大家有兴趣一定去看原文,这只是我自己的一个笔记总结!!
大家有兴趣一定去看原文,这只是我自己的一个笔记总结!!