网络之间数据如何传输的

286 阅读23分钟

计算机网络是什么

计算机网络(简称网络)是由若干结点和连接这些结点的链路组成。结点可以是计算机,集线器,交换机或路由器。

(这图些许有些草率了)各个主机之间通过交换机连接,而路由器负责连接多个不同的网络 image.png

网络分类

  • 局域网可以实现文件管理、应用软件共享、打印机共享等功能,是一个可连接住宅,学校,实验室,大学校园或办公大楼等有限区域内计算机的计算机网络。以太网和Wi-Fi(无线网络连接)是现今局域网中最常用的两项技术。
  • 广域网,又称广域网外网公网。是连接不同地区局域网城域网计算机通信的远程网。在一个区域范围里超过集线器所连接的距离时,必须要通过路由器来连接,这种网上类型称为广域网。广域网的发送介质主要是利用电话线或光纤,由ISP将企业间做连线,这些线是ISP业者预先埋在马路下的线路
  • 无线局域网利用射频( RF)的技术,使用电磁波,取代旧式的双绞铜线所构成的局域网络,需要无线网卡,无线路由器

中间设备

交换机

交换机工作于数据链路层。交换机内部的CPU会在每个端口成功连接时,通过将MAC地址和端口对应,形成一张MAC表。在今后的通讯中,发往该MAC地址的数据包将仅送往其对应的端口,而不是所有的端口。因此,交换机可用于划分数据链路层广播,即冲突域;但它不能划分网络层广播,即广播域。

简略的概括一下交换机的基本功能:

1. 像集线器一样,交换机提供了大量可供线缆连接的端口,这样可以采用星型拓扑布线。

2. 像中继器集线器网桥那样,当它转发帧时,交换机会重新产生一个不失真的方形电信号。

3. 像网桥那样,交换机在每个端口上都使用相同的转发或过滤逻辑。

4. 像网桥那样,交换机将局域网分为多个冲突域,每个冲突域都是有独立的宽带,因此大大提高了局域网的带宽。

5. 除了具有网桥集线器中继器的功能以外,交换机还提供了更先进的功能,如虚拟局域网(VLAN)和更高的性能。

老式的交换机只支持两层(到MAC数据链路层),所以需要路由器去解析IP,而现在很多交换机已经支持了三层(到IP层)

路由器

路由器通常位于OSI模型的网络层,是连接两个或多个网络的硬件设备,在网络间起网关的作用。它能够理解不同的协议,例如某个局域网使用的以太网协议,因特网使用的TCP/IP协议。可以分析各种不同类型网络传来的数据包的目的地址,把非TCP/IP网络的地址转换成TCP/IP地址,或者反之;再根据选定的路由算法把各数据包按最佳路线传送到指定位置。所以路由器可以把非TCP/ IP网络连接到因特网上。

原理

网络中的设备相互通信主要是用它们的IP地址,路由器只能根据具体的IP地址来转发数据。计算机之间的通信只能在具有相同网络地址的IP地址之间进行,如果想要与其他网段的计算机进行通信,则必须经过路由器转发出去。不同网络地址的IP地址是不能直接通信的,即便它们距离非常近,也不能进行通信。路由器的多个端口可以连接多个网段,每个端口的IP地址的网络地址都必须与所连接的网段的网络地址一致。不同的端口它的网络地址是不同的,所对应的网段也是不同的,这样才能使各个网段中的主机通过自己网段的IP地址把数据发送到路由器上。

网关(Gateway)

又称协议转换器,在网络层以上实现网络互联

网关实质上是一个网络通向其他网络的IP地址(网关的IP地址是具有路由功能的设备的IP地址)。

地址

在各个设备之间的传输是需要MAC地址的。

硬件地址

又称物理地址,MAC地址,是数据链路层和物理层使用的地址。实际上就是适配器地址或适配器标识符EUI-48,当这块适配器插入某台计算机后,适配器上的标识符就成为了这台机器的MAC地址了。

如果连接在局域网上的主机或路由器安装有多个适配器,那么这样的主机或路由器就有多个MAC地址。当路由器通过适配器连接到局域网时,适配器的硬件地址就用来标志路由器的某个接口,路由器如果需要同时连接到两个网络上,那么他就需要两个适配器和两个硬件地址。

IP地址

IP地址就是给每一台主机(或路由器)的每一个接口分配一个在全世界范围内唯一的32位的标识符。IP地址是网络层及以上各层使用的地址,是一种逻辑地址。

image.png A/B/C类地址都由两个固定的字段组成,其中第一个字段是网络号(net-id),它标志主机(或路由器)所连接到的网络,一个网络号在整个互联网范围内是唯一的。第二个字段是主机号(host-id),标志该主机(路由器)。一台主机号在它前面的网络号所指明的网络范围内必须是唯一的。由此可见,一个IP地址在整个互联网范围内是唯一的。这三类地址都是单播地址,是最常用的。

子网

IP地址 = 网络号 + 子网号 + 主机号

子网掩码是一个网络或一个子网的重要属性,路由器交换信息时,必须将自己所在网络的子网掩码告诉相邻路由器

A类地址的默认子网掩码是255.0.0.0

B类地址的默认子网掩码是255.255.0.0

C类地址的默认子网掩码是255.255.255.0

常见的IP书写方式如 192.168.100.1/24,24对应的其实是子网掩码

image.png

  • 在IP层抽象的互联网上只能看到IP数据报,虽然中间经过许多路由器的转发,但是首部的源地址和目的地址是不变的。
  • 虽然IP数据报首部由源站IP地址,但路由器只根据目的IP地址的网络号进行路由选择
  • 在局域网的链路层,只能看见MAC帧。IP数据报被封装在MAC帧中,在进行不同的网络上传送时,MAC帧首部的源地址和目的地址是会改变的:到达新的路由器后,会将原来的源地址和目的地址丢弃,在转发的时候网络接口软件用ARP将下一跳路由器的IP地址转换成MAC地址,封装到数据链路层的首部。

数据包传输过程

我们常说的计算机的网络模型,在各个协议层之间数据传输的时候经历的过程是什么

  • 发出方应用层发出信息M,叫做message
  • 应用层将message发给传输层,加上一层传输层的header,生成segment:数据段
  • 将数据段在传给网络层,加上一层网络层header,生成datagram:数据报
  • 将数据报传输到数据链路层,加上一层数据链路层的首部和尾部,生成frame:数据帧
  • 将这个数据包的每一个bit通过物理层传输到与他紧密相连的下一个设备上,也就是转换器(switch)
  • 通过switch送到相应的路由器上
  • 路由器的数据链路层先接收到数据帧,将数据链路层的header去掉,传输给网络层
  • 路由器的网络层对网络层的header进行分析知道在router上的哪个出口,将相应的数据报放到对应的出口上,在出口再进行数据链路层的包装,将新生成的数据帧传输到下一站
  • 接收方数据链路层会将数据链路层的header去掉,送到网络层
  • 网络层将网络层的header去掉,送到传输层
  • 传输层将传输层的header去掉,送到应用层
  • 应用层可以拿到原本的信息M

各个层的首部

应用层— HTTP

支持网络应用协议和程序的运行,类似于微信/云服务等

常用协议HTTP(超文本传输协议)、FTP(文件传输协议),SNMP ,SMTP(邮件),DNS,DHCP

DHCP动态主机配置协议,使用UDP协议工作, 给内部网络自动分配IP地址。DHCP服务器先广播一次,若无响应广播四次,无响应则DHCP失败

HTTP 协议主要由三大部分组成:

  • 起始行(start line):描述请求或响应的基本信息;
  • 头部字段(header):使用 key-value 形式更详细地说明报文;
  • 消息正文(entity):实际传输的数据,它不一定是纯文本,可以是图片、视频等二进制数据。

其中起始行和头部字段并成为 请求头 或者 响应头,统称为 Header;消息正文也叫做实体,称为 body。HTTP 协议规定每次发送的报文必须要有 Header,但是可以没有 body,也就是说头信息是必须的,实体信息可以没有。而且在 header 和 body 之间必须要有一个空行(CRLF)

image.png 类似于

GET /home.html HTTP/1.1
Host: developer.mozilla.org
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:50.0) Gecko/20100101 Firefox/50.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate, br
Referer: https://developer.mozilla.org/testpage.html
Connection: keep-alive
Upgrade-Insecure-Requests: 1
If-Modified-Since: Mon, 18 Jul 2016 02:36:04 GMT
If-None-Match: "c561c68d0ba92bbeb8b0fff2a9199f722e3a621a"
Cache-Control: max-age=0 

首部分为请求首部和响应首部,并且部分首部两种通用

通用字段作用
Cache-Control控制缓存的行为
Connection浏览器想要优先使用的连接类型,比如 keep-alive
Date创建报文时间
Pragma报文指令
Via代理服务器相关信息
Transfer-Encoding传输编码方式
Upgrade要求客户端升级协议
Warning在内容中可能存在错误

请求首部

请求首部作用
Accept能正确接收的媒体类型
Accept-Charset能正确接收的字符集
Accept-Encoding能正确接收的编码格式列表
Accept-Language能正确接收的语言列表
Expect期待服务端的指定行为
From请求方邮箱地址
Host服务器的域名
If-Match两端资源标记比较
If-Modified-Since本地资源未修改返回 304(比较时间)
If-None-Match本地资源未修改返回 304(比较标记)
User-Agent客户端信息
Max-Forwards限制可被代理及网关转发的次数
Proxy-Authorization向代理服务器发送验证信息
Range请求某个内容的一部分
Referer表示浏览器所访问的前一个页面
TE传输编码方式

响应首部

响应首部作用
Accept-Ranges是否支持某些种类的范围
Age资源在代理缓存中存在的时间
ETag资源标识
Location客户端重定向到某个 URL
Proxy-Authenticate向代理服务器发送验证信息
Server服务器名字
WWW-Authenticate获取资源需要的验证信息

传输层-TCP

管理收发双方数据分包传输的协议,对收到的报文进行差错检测

网络层是为主机之间提供逻辑通信,而传输层为应用进程之间提供端到端的逻辑通信

TCP的传输单元是报文段,分为首部和数据两部分

应用层协议和传输层协议的对应关系: image.png 为了使不同操作系统的计算机的应用进程可以互相通信,传输层使用协议端口号,简称为端口,虽然通信的终点是应用进程,但只要把报文交到目的主机的目的端口,最后的交付目的进程由TCP或UDP完成。

常见端口

  • 21端口:FTP 文件传输服务
  • 22端口:SSH 远程连接服务
  • 23端口:TELNET 终端仿真服务
  • 25端口:SMTP 简单邮件传输服务
  • 53端口:DNS 域名解析服务
  • 80端口:HTTP 超文本传输服务
  • 443端口:HTTPS 加密的超文本传输服务
  • 3306端口:MYSQL数据库端口
  • 5432端口:PostgreSQL数据库端口
  • 6379端口:Redis数据库端口
  • 8080端口:TCP服务端默认端口
  • 8888端口:Nginx服务器的端口
  • 27017端口:mongoDB数据库默认端口

TCP报文首部的前20个字节是固定的,后面有4n字节是根据需要增加的选项。 image.png

  • 源端口和目的端口:各占两字节,源端口:本机IP的随机端口,目的端口:IP后的端口
  • 序号Sequence number(4字节),这个序号保证了 TCP 传输的报文都是有序的,对端可以通过序号顺序的拼接报文
  • 确认号Acknowledgement Number(4字节),这个序号表示数据接收端期望接收的下一个字节的编号是多少,同时也表示上一个序号的数据已经收到
  • 数据偏移
  • 保留(6位):为今后使用,目前应置为0
  • 标识符
    • URG=1(紧急):1表示本数据报的数据部分包含紧急信息,是一个高优先级数据报文。紧急数据一定位于当前数据包数据部分的最前面
    • ACK=1(确认):1表示确认号字段有效,0无效。TCP 规定在连接建立后传送的所有报文段都必须把 ACK 置为1。
    • PSH=1(传送):1表示接收端应该立即将数据 push 给应用层,而不是等到缓冲区满后再提交。
    • RST=1(重置):1表示当前 TCP 连接出现严重问题,可能需要重新建立 TCP 连接,也可以用于拒绝非法的报文段和拒绝连接请求。
    • SYN=1(建立联机):当SYN=1,ACK=0时,表示当前报文段是一个连接请求报文。当SYN=1,ACK=1时,表示当前报文段是一个同意建立连接的应答报文。
    • FIN=1(结束):该字段为一表示此报文段是一个释放连接的请求报文。
  • 窗口Window Size(2字节),窗口大小,表示还能接收多少字节的数据,用于流量控制
  • 检验和(2字节):检验首部和数据是否变化
  • 紧急指针(2字节):仅在URG = 1时有效,指出紧急数据的字节数,紧急指针标明了紧急数据的尾部。注意:即使窗口为0也可以发送紧急数据
  • 选项:可变,最大40字节
    • 最大报文段长度MSS:数据字段的最大长度
    • 时间戳:用于计算往返时间RTT

网络层-IP

对网络数据包进行存储转发,路由器通过路由算法算出数据包从哪个出口出去就是粗略的存储转发

网络层向上只提供简单灵活的,无连接的,尽最大努力交付的数据报服务,网络层不提供服务质量的承诺,可能会出错,丢失,重复,失序等问题,如果主机中的通信需要可靠的,则由传输层负责(包括差错处理,流量控制等)

主要的协议是IP,与IP协议配套使用的还有三个协议:

  • 地址解析协议(ARP)
  • 网际控制报文协议(ICMP)
  • 网际组管理协议(IGMP) image.png
  • 版本(4位):协议版本,通信双方的IP协议版本必须一致,有IPv4呵IPv6
  • 首部长度(4位):可表示的最大十进制值为15,一个单位表示32位字长(4字节);IP首部的固定长度是20字节,所以最小值为5
  • 区分服务(8位):一般不用
  • 总长度(16位):首部和数据之和的长度,单位为字节,数据报的最大长度为2的16次方 - 1 = 65535字节。但是IP层下的每一种数据链路层协议都规定了一个数据帧中的数据字段的最大长度,称为最大传送单元(MTU) ,当数据报被封装成数据帧的时候,数据报的长度不能超过链路层协议规定的MTU值,如果超过就要进行分片处理。
  • 长的数据报传输效率更高(因为首部占比小),短的路由器转发速度快
  • 标识(16位):每产生一个数据报,此值+1,用于分片后的数据报片可以重装成原来的数据报
  • 标志(3位):目前只有2位有意义
    • 标志字段最低位记MF。MF = 1标识后面还有分片。MF = 0 表示是若干数据报片中的最后一个
    • 标志字段中间的一位记为DF,意思是不能分片,只有当DF = 0 时才允许分片
  • 片偏移(13位):某片在原分组中的相对位置
  • 生存时间(8位):TTL表示数据报在网络中的寿命。每经过一个路由器TTL减1,若TTL减为0时,就丢弃这个数据报,最大数值为255
  • 协议(8位):目的主机的IP层知道将数据部分交给哪个协议处理 image.png
  • 首部检验和(16位):只检验数据报的首部,但不包括数据部分,每经过一个路由器会重新计算首部检验和,值为0说明未发生变化,否则就认为出现差错,丢弃数据报
  • 源地址(32位)
  • 目的地址(32位)

IP转发

IP首部记录的是源IP地址和目的IP地址,不会记录经过的路由器的IP地址。

所以当路由器接收到一个待转发的数据报,从路由表得出下一跳路由器的IP地址后,送交数据链路层的网络接口软件,网络接口软件用ARP将下一跳路由器的IP地址转换成MAC地址,放在链路层的MAC帧的首部,然后根据这个硬件地址找到下一跳路由器。

路由表:每一行对应一个网络,每一条路由记录(目的网络地址,子网掩码,0下一跳地址)

数据链路层-MAC帧

管理数据包点对点(终端,路由器,switch转换器等两个物理机器)之间的发出与接收,wifi就是在数据链路层

数据链路层的协议数据单元——

image.png

  • 目的地址和源地址(6字节):记录路由器的MAC地址,在传输过程中是可变的
  • 类型(2字节):标志上一层使用什么协议
  • 数据字段(46-1500字节之间)
  • 帧检验序列FCS(使用CRC检验)

APR协议

根据IP地址解析出MAC地址,可以划分在网络层,也可以划分在数据链路层。

还有一个旧的逆地址解析协议RARP,根据硬件地址找IP地址,现在由DHCP替代。

每一台主机都有一个ARP高速缓存,里面有本局域网上的各主机和路由器的IP地址到硬件地址的映射表,这个映射表会经常更新(新增或超时删除:网络中的主机是变动的,而更换网络适配器物理地址也是变动的)

物理层

管理每一个数据的每一个比特在物理媒体(电缆,光纤,无线电波等)上是如何传输的

输入域名到页面呈现都经历了什么

连接上网

新连接的笔记本连接上网需要一个IP地址,本地路由器地址,DNS服务器地址。解析获取这些数据使用的是DHCP协议(应用层),而支持DHCP的传输层协议是UDP

  • DHCP查询信息被封装在UDP数据段中,之后被封装在IP数据报中,再被封装在802.1 Ethernet数据帧中
  • Ethernet数据帧被广播(broadcast)到整个LAN(局域网),从而被正在运行DHCP server的网络设备收到
  • 在DHCP server设备中,Ethernet数据帧被解封成IP数据报,被解封到UDP网络数据段,被解封到DHCP信息,然后运行DHCP的这个router解读信息,发现是来了一个新设备,他需要一个ip地址。
  • DHCP服务器就生成DHCP ACK信息,其中包含用户的IP地址本地路由器IP地址DNS服务器的名字和IP地址
  • 在DHCP服务器进行层层封装后,数据帧通过LAN被推送到用户端,在此过程中途径的switch对IP地址对应的端口号进行记录,之后数据帧在用户端层层解封
  • DHCP用户收到DHCP ACK 信息包,拿到了自己的IP地址,知道了DNS的名字和地址,以及本地路由器IP地址,就可以通过DNS的地址来找到相应域名的IP地址,通过本地路由器的地址进行进一步的数据转发

去DNS获取域名对应的IP

要将域名转换成IP是因为计算机只认识数字(IP),而不认识域名。当然如果你输入的直接是IP地址或者是有了DNS缓存,则不需这一步

DNS缓存指DNS返回了正确的IP之后,系统就会将这个结果(域名与IP的映射)临时储存起来。并且它会为缓存设定一个失效时间
(例如N小时),在这N小时之内,当你再次访问这个网站时,系统就会直接从你电脑本地的DNS缓存(浏览器,操作系统,路由等)中
把结果交还给你,而不必再去询问DNS服务器,变相“加速”了网址的解析。当然,在超过N小时之后,系统会自动再次去询问DNS服务
器获得新的结果。
所以,当你修改了 DNS 服务器,并且不希望电脑继续使用之前的DNS缓存时,就需要手动去清除本地的缓存了

DNS查询信息被创建封装到UDP网络段,IP数据报和Ethernet数据帧。为了使数据帧可以被发送到路由器上,需要用ARP查出本地路由器MAC地址。(虽然上步知道了路由器的IP地址,但还是需要路由器的MAC地址,才能把信息传输给路由器,当然如果DNS服务器是同一网段的,也可以不通过路由器)

  • ARP在LAN中广播,本地路由器收到后返回ARP reply,其中包含路由器相应端口的MAC地址
  • 含有DNS query的IP数据报通过LAN switch从用户端发送到本地路由器
  • 此IP数据报从本地网络发送到本地ISP网络上,从而被路由转发到相应的DNS server,这里可能涉及多个根域名服务器,所以可以使用CDN优化。
  • IP数据报在DNS server上被解封,返回域名对应的IP地址

IP地址会被封装在网络层的IP首部

  • 源地址:自己的IP
  • 目的地址:域名对应的IP

HTTP传输

为了使不同操作系统的计算机的应用进程可以互相通信,运输层使用协议端口号,简称为端口,虽然通信的终点是应用进程,但只要把报文交到目的主机的目的端口,最后的交付目的进程由TCP或UDP完成。

这种协议栈层间的抽象的协议端口是软件端口(应用层的各种协议进程与运输实体进行层间交互的一种地址),和路由器或交换机上的硬件端口(硬件设备交互的接口)是不同的概念。而端口会被封装在TCP的首部

然后从这开始就是老生长谈的了,建立TCP连接

  • 用户端首先创建一个跟web server之间的TCP socket
  • TCP SYN segment(三步握手的第一条信息)被传送到web server上
  • web server返回一个TCP SYNACK 信息(三步握手第二步)
  • 客户端发出成功响应,TCP连接创建成功
  • 客户端将HTTP request推入TCP socket中,将IP数据报传送到google的web server,数据在进入服务端之前,可能还会先经过负责负载均衡的服务器,它的作用就是将请求合理的分发到多台服务器上
  • web server返回HTTP reply(包含所需主页内容)给客户端

浏览器渲染

  • 浏览器拿到数据会判断状态码是什么,如果是 200 那就继续解析,如果 400500 的话就会报错,如果 300 的话会进行重定向,这里会有个重定向计数器,避免过多次的重定向,超过次数也会报错。浏览器开始解析文件,如果是 gzip 格式的话会先解压一下,然后通过文件的编码格式知道该如何去解码文件。

  • 浏览器准备渲染进程,默认情况下,Chrome 会为每个页面分配一个渲染进程,也就是说,每打开一个新页面就会配套创建一个新的渲染进程。

  • 文件解码成功后会正式开始渲染流程,先会根据 HTML 构建 DOM 树,有CSS的话会去构建 CSSOM 树。 CSSOM 树和 DOM 树构建完成后会开始生成 Render 树,Layout计算页面元素的布局、样式等等诸多方面的东西。Painting开始绘图,然后将页面展示出来,当前这一块也涉及回流重绘方面的优化。