前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >浏览器

浏览器

作者头像
一滴水的眼泪
发布2020-09-24 10:57:25
9.4K0
发布2020-09-24 10:57:25
举报
文章被收录于专栏:一滴水的眼泪一滴水的眼泪

从输入一个地址开始,它可以是这样的 www.baidu.com, 也可以是这样的 https://admin:admin@www.gschaos.club:80/dir/file1.html, 咋一看好像都能看懂,而且还知道这么输入会得到什么,更言之还能断点调试一下; 可是输入一个网址到底发生了什么?

浏览器

从输入一个地址开始,它可以是这样的 www.baidu.com, 也可以是这样的 https://admin:admin@www.gschaos.club:80/dir/file1.html, 咋一看好像都能看懂,而且还知道这么输入会得到什么,更言之还能断点调试一下;

URL

我们先来看下URL,URL有很多种,不止我们常用到的http://,还有很多比如“file:” (读取本地文件) , “ftp:”(文件传输协议) , “mailto:”(邮件服务,需要配置正确的电子邮箱)等.

url的各种格式
url的各种格式

它们拥有同样的格式,即都需要定义一个访问方法(协议http,ftp等).

那么知道这些后浏览器做了什么呢?

浏览器解析URL

浏览器首先对URL进行解析,从而生成发送给服务器的请求信息.依据不同的协议访问不同的服务器,这里阐述访问Web服务器的情况.

解析方式如下:

URL解析
URL解析

有时候进入主页的时候文件名经常不写比如http://www.lab.com/dir/,那么解析的时候就会去寻找目录下面的default.html或者index.html具体访问什么要看服务器如何配置.当不写最后一个**/**时,是会先寻找文件夹,再寻找文件名的规则来进行的.

明白了URL,我们来对URL中HTTP进行简单的说明。

HTTP协议

HTTP协议定义了客户端和服务器之间交互的消息内容和步骤,请求中包含了对什么做什么两个部分;

对什么: 这部分就是URI(统一资源标识符),一般来说,URI的内容是一个存放网页数据的文件名或者是一个CGI程序的文件名.例如/dir/file1.html;不过,URI不仅限于此,也可以直接用”http:”开头的URL来作为URI.换句话就是,这里可以写各种访问目标,而这些访问目标统称为URI. 做什么: 也称为方法.表示需要Web服务器做什么,典型的例子包括读取URI表示的数据/将客户端输入的数据发送给URI表示的程序等.

doWhat
doWhat

看到这张图是不是就对之前所解释的做什么有所了解了呢!

收到消息之后,Web服务器会对其中的内容进行解析,通过URI和方法来判断“对什么”,”做什么”,并根据这些要求完成工作将结果放入响应消息中.

至此我们了解了HTTP的全貌,之后会一步步往下深入网络到底是怎么连接的..

当我们想寄一封信件的时候,我们需要能够帮助我们送信的机构,如果要自己送去那还送信做什么,直接过去把寄信人打一顿就完事了;所以就有了邮局(快递的你先放下…),每个人都可以将信委托给邮局,让邮局帮我们将信件寄出去。我们发送一个网络请求也是,每个应用都可以发送网络请求,同样需要一个能够将消息发送到网络的机构,这个机构由操作系统来完成组建。所以,浏览器解析URL生成HTTP请求后需要委托操作系统将这些消息发送到网络。

当然,邮局也会要求我们填写一个寄信单,这个单子包括了寄信人的地址寄信人的联系方式收信人的地址收信人的联系方式4个重要的信息(还有其他附加信息),填写正确才能将信件成功寄出。操作系统发送消息也是如此,它需要的是收信人的地址【对方的IP地址】,收信人的联系方式【对方的端口号】。发送方的自然也需要,只是两者绑定在一起,开机的那一刻就已经存在内存中了。

在这之前,来了解一下IP地址是啥子。

IP地址

住在有门牌号的房子的大伙都知道(如果没有,请默哀两分钟!),寄发信件的时候需要填写自己和对方的具体地址,而这个地址就是小区的某个房间的门牌号,完整的地址包括了国家,省份市直辖区,县/区,乡镇小区等等。国家与国家之间形成了不同的区域,说中国在哪,一定会有答案,再往下,省市区小区直到门牌号,它就像一个唯一的号牌将这个地址标记出来。

IP地址同样是这样的道理。

intnet
intnet

互联网和公司内部的局域网都是基于TCP/IP的思路来设计的,如上图,就是由一些小的子网(小区甚至楼层之间),通过路由器连接起来。这里的子网可以理解成为用集线器连接起来的几台计算机,将它看作一个单位,称为子网。将子网连接起来,就形成了一个网络。

你要说怎么理解,那看下面这张图吧(自己画的可能不准确!)。

naphthalene
naphthalene

在网络中所有的设备都会被分配一个地址。就好像是XX号XX室。其中对应的号码是分配给整个子网的,而对应的号码是分配给子网中的计算机的,这就是网络中的地址。对应的号码称为网络号,对应的号码称为主机号,这个地址的整体称为IP地址。发送者发送的消息首先经过子网中的集线器,转发到距离最近的路由器上。接下来,路由器会根据消息的目的地判断下一个路由去的位置,然后将消息发送到下一个路由器,即消息再次经过子网内的集线器被转发到下一个路由器。前面的过程不断重复,最终消息就被传到了目的地。这个过程就好像你准备好信件由邮局寄出,邮局寄出后会送往下一站,再由下一站判断你的目的地,再往下送一样;

那么这个地址到底是怎么组成的呢?

IP
IP

如上图,实际的IP地址是一串32比特的数字,按照1个字节为一组分成4组,分别用十进制表示然后再用圆点隔开。在IP地址的规则中,网络号和主机号连接起来总共是32比特,但这两部分的具体结构是不固定的。在组建网络时,用户可以自行决定他们之间的分配关系,因此,这里还需要另外的附加信息来表示IP地址的内部结构。

这个附加信息就是子网掩码。子网掩码的格式如下图,是一串与IP地址长度相同的32比特数字,左边一半全是1,代表网络号,右边一半全是0,代表主机号。

ipyanma
ipyanma

DNS

那么要怎么得到域名对应的IP地址呢??

按照开发的思路,要得到域名对应的IP地址,那肯定需要一个key-value的内存表来记录域名key对应的IP地址value,这样取出来即可,可是….这个表在哪里?

这就要涉及到DNS域名服务器,浏览器委托操作系统先去DNS域名服务器查询域名对应的IP地址,服务器返回需要IP,然后我们就可以用这个IP发送消息了。

mengbi2
mengbi2

等等!我怎么访问DNS域名服务器的?我..我怎么知道它的IP的??

mangqu
mangqu

参考DNS 原理入门以及如果你听英文可以听得懂的话 AWS的‘什麼是 DNS’?

首先,本机一定要知道DNS服务器的IP地址,否则上不了网。通过DNS服务器,才能知道某个域名的IP地址到底是什么。

DNS服务器的IP地址,有可能是动态的,每次上网时由网关分配,这叫做DHCP机制;也有可能是事先指定的固定地址。Linux系统里面,DNS服务器的IP地址保存在/etc/resolv.conf文件。

有一些公网的DNS服务器,也可以使用,其中最有名的就是Google的8.8.8.8和Level 3的4.2.2.2

在linux系统总可以使用dig match 域名 来查看使用的DNS服务器IP地址。

域名的层级结构如下 :

主机名.次级域名.顶级域名.根域名

# 即

host.sld.tld.root

DNS服务器根据域名的层级,进行分级查询。 就是从根域名开始,依次查询每一级域名的NS记录,直到查到最终的IP地址,过程大致如下。

  1. 从”根域名服务器”查到”顶级域名服务器”的NS记录和A记录(IP地址)
  2. 从”顶级域名服务器”查到”次级域名服务器”的NS记录和A记录(IP地址)
  3. 从”次级域名服务器”查出”主机名”的IP地址

“根域名服务器”的NS记录和IP地址一般是不会变化的,所以内置在DNS服务器里面。

我们只要知道连接网络需要ip地址,而域名如何解析成ip地址需要DNS域名服务器,而这个DNS域名服务器在设置网络连接的时候已经配置好,即已存在这个IP地址即可。

知道了对方的IP地址,要怎么才算连接呢?以编程者的思想连接如下图所示。

allConnect
allConnect

我们这里不需要知道编程怎么实现,因为不管是哪种编程它们都是在委托操作系统在发送信息,所以基本流程如下图。

simpleConnect
simpleConnect

这里解释下这张图!

上文中我们知道连接互联网的重任不是应用自己连接,而是委托给操作系统来执行连接,浏览器或者应用程序调用Socket发起一个连接就是一次创建Socket(FD)套接字的过程。

首先,分配一个内存空间用以存储套接字信息,然后,将表示这个套接字的描述符告知应用程序。

那何为套接字描述符呢?在这之前想考一个问题,在计算机中同一时间进行通信操作的应用程序不止一个,这时,我们就需要一种方法来识别出某个特定的套接字,这种方法就是描述符。我们可以理解描述符是给某个套接字分配的唯一编号。当我们使用某个套接字来执行收发数据的操作时,就可以出示所拥有的描述符,协议栈就能够判断出我们希望用哪一个套接字来连接或者发送数据了。在win中使用netstat命令查看系统套接字内容,如下图(这张图是盗来的):

netstat
netstat

图中每一行相当于一个套接字,当创建套接字时,就会增加一行控制信息,赋予“即将开始通信”的状态,并进行通信的准备工作,如分配用于临时存放手法数据的缓冲区空间。

接着Socket调用connect连接服务器,这个时候协议栈并不知道要和谁通信,在服务器端甚至应用程序要和谁连接都不晓得,这样下去都不知道咋整。所以,发起连接的一方需要告知被连接方一些必要的信息,比如“halo,我需要和你通奸…..哦不! 需要和你通信,这是我的房间号(ip+端口),记得回信息哦,我在等着你呢!”。这样双方才知道互连的通信是谁,才能顺利的进行收发数据。

其实就是男女双方需要交换一些个性信息才好继续沟通下去。

那么,它们如何沟通呢?

需要的前提大部分已经凑齐,开始通信之前我们需要了解一下TPC/IP模型。

网络模型不是一开始就有的,在网络刚发展时,网络协议是由各互联网公司自己定义的,各家的协议也是不能互通的。这样大大的阻碍了互联网的发展,为了解决这个问题,国际标准化组织 1984 提出的模型标准,简称 OSI(Open Systems Interconnection Model)。具体如下图:

img
img

OSI七层模型每一层都有自己的作用,从上到下的作用依次为:

  • 应用层(Application) :提供网络与用户应用软件之间的接口服务
  • 表示层(Presentation) :提供格式化的表示和转换数据服务,如加密和压缩
  • 会话层(Session) 提供包括访问验证和会话管理在内的建立和维护应用之间通信的机制
  • 传输层(Transimission):提供建立、维护和取消传输连接功能,负责可靠地传输数据(PC)
  • 网络层(Network): 处理网络间路由,确保数据及时传送(路由器)
  • 数据链路层(DataLink): 负责无错传输数据,确认帧、发错重传等(交换机)
  • 物理层(Physics) :提供机械、电气、功能和过程特性(网卡、网线、双绞线、同轴电缆、中继器)

七层中应用层、表示层和会话层由软件控制,传输层、网络层和数据链路层由操作系统控制,物理层有物理设备控制。

2 TCP/IP参考模型及协议

1) 模型

TCP/IP 模型是由 OSI 模型演化而来,TCP/IP 模型将 OSI 模型由七层简化为五层(一开始为四层),应用层、表示层、会话层统一为应用层。

img
img

2) 协议

TCP/IP协议被称为传输控制协议/互联网协议,又称网络通讯协议(Transmission Control Protocol)。是由网络层的IP协议和传输层的TCP协议组成,是一个很大的协议集合。

  • 物理层和数据链路层没有定义任何特定协议,支持所有的标准和专用的协议。
  • 网络层定义了网络互联也就是IP协议,主要包括IP、ARP、RARP、ICMP、IGMP。
  • 传输层定义了TCP和UDP(User Datagram Protocol),我们会后面重点介绍一下TCP协议。
  • 应用层定义了HTTP(超文本传输协议)、FTP(文件传输协议)、DNS(域名系统)等协议。

3 物理层

计算机在传递数据的时候传递的都是0和1的数字,而物理层关心的是用什么信号来表示0和1,是否可以双向通信,最初的连接如何建立以及完成连接如何终止,总之,物理层是为数据传输提供可靠的环境。

4 数据链路层

数据链路层们于物理层和网络层之间,用来向网络层提供数据,就是把源计算机网络层传过来的信息传递给目标主机。 数据链路层主要的作用包括:

  • 如何将数据组合成数据帧(Frame),帧是数据链路层的传输单位
  • 数据链路的建立、维护和拆除
  • 帧包装、帧传输、帧同步
  • 帧的差错恢复
  • 流量控制

5 网络层

网络层位于传输层和数据链路层之间,用于把数据从源主机经过若干个中间节点传送到目标主机,并向传输层提供最基础的数据传输服务,它要提供路由和选址的工作。

那什么是路由和选址呢?

选址

交换机是靠MAC来寻址的,而因为MAC地址是无层次的,所以要靠IP地址来确认计算机的位置,这就是选址。

路由

在能够选择的多条道路之间选择一条最短的路径就是路由的工作。

路由和选址都离不开IP,我们就详细介绍一下IP头部。

IP头

IP头部是由20个字节组成的,具体项所占的位数如下图:

img
img

具体的数据我们用Wireshark来表抓取一下,如图(蓝色部分为IP数据包):

img
img

version - 版本 Header Length - 首部长部 Differentiated Services Field - 优先级与服务类型 Total Length - 总长度,该字段用以指示整个IP数据包的长度,最长为65535字节,包括头和数据。 Identification - 标识符,唯一标识主机发送的每一份数据报。 Flags - 标志。分为3个字段,依次为保留位、不分片位和更多片位 Fragment offset - 段偏移量。该分片相对于原始数据报开始处位置的偏移量。 TTL(Time to Live生存时间) - 该字段用于表示IP数据包的生命周期,可以防止一个数据包在网络中无限循环地发下去。TTL的意思是一个数据包在被丢弃之前在网络中的最大周转时间。该数据包经过的每一个路由器都会检查该字段中的值,当TTL的值为0时此数据包会被丢弃。TTL对应于一个数据包通过路由器的数目,一个数据包每经过一个路由器,TTL将减去1。 Protocol - 协议号。用以指示IP数据包中封装的是哪个协议。 Header checksum - 首部校验和。检验和是16位的错误检测字段。目的主机和网络中的每个网关都要重新计算报头的校验和,如果一样表示没有改动过。 Source - 源IP地址。该字段用于表示数据包的源地址,指的是发送该数据包的设备的网络地址。 Destination - 目标IP地址。该字段用于表示数据包的目标的地址,指的是接收节点的网络地址。

6 传输层

传输层是面向连接的、可靠的的进程到进程通信的协议。TCP提供全双工服务,即数据可在同一时间双向传播。TCP将若干个字节构成一个分组,此分组称为报文段(Segment)。提供了一种端到端的连接。

传输层的协议主要有TCP 和 UDP,TCP(Transimision Control Protocal)是一种可靠的、面向连接的协议,传输效率低。UDP(User Datagram Protocal)是一种不可靠的、无连接的服务,传输效率高。 下面重点介绍一下TCP的三次握手和四次挥手。

1) TCP的功能

TCP主要是将数据进行分段打包传输,对每个数据包编号控制顺序,运输中丢失、重发和丢弃处理。

2) TCP头的介绍

有点和IP头类似,我们先来张图看下:

img
img

Source Port & Destination Port - 源端口号和目标端口号;计算机通过端口号识别访问哪个服务,比如http服务或ftp服务;发送方端口号是进行随机端口;目标端口号决定了接收方哪个程序来接收。 Sequence number - 32位序列号,TCP用序列号对数据包进行标记,以便在到达目的地后重新重装。在建立连接时通常由计算机生成一个随机数作为序列号的初始值。 Acknowledgment number - 32位确认号,确认应答号。发送端接收到这个确认应答后,可以认为这个位置以前所有的数据都已被正常接收。 Header Length - 首部长度。单位是 ‘4’个’字节’,如果没有可选字段,那么这里的值就是 5。表示 TCP 首部的长度为 20 字节。 checksum - 16位校验和。用来做差错控制,TCP校验和的计算包括TCP首部、数据和其它填充字节。 flags - 控制位。TCP的连接、传输和断开都受这六个控制位的指挥 window size - 本地可接收数据的数目,这个值的大小是可变的。当网络通畅时将这个窗口值变大加快传输速度,当网络不稳定时减少这个值可以保证网络数据的可靠传输。它是来在TCP传输中进行流量控制的

3) 传说中的三次握手和四次挥手(抓包演示)

三次握手和四次挥手到底是怎么回事呢,我用一台主机A(172.16.50.72:65076)起一个服务,另外一台主机B(172.16.17.94:8080)请求一下。 在A主机上启动node服务:

let http = require('http');
let url = require('url');

let server = http.createServer();
server.on('request', (req, res) => {
    let {pathname, querry} = url.parse(req.url, true);
    let result = [];
    req.on('data', (data) => {
        result.push(data);
    })
    req.on('end', () => {
        console.log(Buffer.concat(result).toString());
        res.end('hello world');
    })

})
server.listen(8080, () => {
    console.log('server started');
});

B主机连接A并发送数据:

curl -d "user":"lucy" 172.16.17.94:8080

用wireshark抓包演示一下。如下图:

img
img

上图中A为三次握手,B为数据传输,C为四次挥手。下面我们详细介绍一下这三个部分。

首先我们先图解一下wireshark抓到的数据,如下图:

img
img

我们把这个过程分为三部分,第一部分为三次握手建立连接,第二部分为数据传输,第三次为四次挥手断开连接。

三次握手

我们分析一下三次握手的过程(包括ack 和 seq的值变化)。

img
img

为了方便描述我们将主动发起请求的172.16.17.94:8080 主机称为客户端,将返回数据的主机172.16.17.94:8080称为服务器,以下也是。

  • 第一次握手: 建立连接。客户端发送连接请求,发送SYN报文,将seq设置为0。然后,客户端进入SYN_SEND状态,等待服务器的确认。
  • 第二次握手: 服务器收到客户端的SYN报文段。需要对这个SYN报文段进行确认,发送ACK报文,将ack设置为1。同时,自己还要发送SYN请求信息,将seq为0。服务器端将上述所有信息一并发送给客户端,此时服务器进入SYN_RECV状态。
  • 第三次握手: 客户端收到服务器的ACK和SYN报文后,进行确认,然后将ack设置为1,seq设置为1,向服务器发送ACK报文段,这个报文段发送完毕以后,客户端和服务器端都进入ESTABLISHED状态,完成TCP三次握手。

数据传输

img
img
  • 客户端先向服务器发送数据,该数据报是lenth为159的数据。
  • 服务器收到报文后, 也向客户端发送了一个数据进行确认(ACK),并且返回客户端要请求的数据,数据的长度为111,将seq设置为1,ack设置为160(1 + 159)。
  • 客户端收到服务器返回的数据后进行确认(ACK),将seq设置为160, ack设置为112(1 + 111)。

四次挥手

当客户端和服务器通过三次握手建立了TCP连接以后,当数据传送完毕,就要断开TCP连接了,就有了神秘的“四次挥手”。

img
img
  • 第一次挥手:客户端向服务器发送一个FIN报文段,将设置seq为160和ack为112,;此时,客户端进入 FIN_WAIT_1状态,这表示客户端没有数据要发送服务器了,请求关闭连接;
  • 第二次挥手:服务器收到了客户端发送的FIN报文段,向客户端回一个ACK报文段,ack设置为1,seq设置为112;服务器进入了CLOSE_WAIT状态,客户端收到服务器返回的ACK报文后,进入FIN_WAIT_2状态;
  • 第三次挥手:服务器会观察自己是否还有数据没有发送给客户端,如果有,先把数据发送给客户端,再发送FIN报文;如果没有,那么服务器直接发送FIN报文给客户端。请求关闭连接,同时服务器进入LAST_ACK状态;
  • 第四次挥手:客户端收到服务器发送的FIN报文段,向服务器发送ACK报文段,将seq设置为161,将ack设置为113,然后客户端进入TIME_WAIT状态;服务器收到客户端的ACK报文段以后,就关闭连接;此时,客户端等待2MSL后依然没有收到回复,则证明Server端已正常关闭,客户端也可以关闭连接了。

注意:在握手和挥手时确认号应该是对方序列号加1,传输数据时则是对方序列号加上对方携带应用层数据的长度。

7 应用层

应用层常见协议有HTTP、HTTPS 、FTP 、SMTP等。

TCP/IP模型我们基本介绍完了,那层与层之间是怎样合作和分工的呢,我们用两张图介绍一下: 发送方的数据是从上往下传输的,即从应用层向物理层传输。接收方的数据是从下往上传输的,即从物理层向应用层传输。如下两张图。

img
img

发送方是从高层到低层封装数据:

  • 在应用层要把各式各样的数据如字母、数字、汉字、图片等转换成二进制
  • 在TCP传输层中,上层的数据被分割成小的数据段,并为每个分段后的数据封装TCP报文头部
  • 在TCP头部有一个关键的字段信息端口号,它用于标识上层的协议或应用程序,确保上层数据的正常通信
  • 计算机可以多进程并发运行,例如在发邮件的同时也可以通过浏览器浏览网页,这两种应用通过端口号进行区分
  • 在网络层,上层数据被封装上亲的报文头部(IP头部),上层的数据是包括TCP头部的。IP地址包括的最关键字段信息就是IP地址,用于标识网络的逻辑地址。
  • 数据链路径层,上层数据成一个MAC头部,内部有最关键的是MAC地址。MAC地址就是固化在硬件设备内部的全球唯一的物理地址。
  • 在物理层,无论在之前哪一层封装的报文头和还是上层数据都是由二进制组成的,物理将这些二进制数字比特流转换成电信号在网络中传输
img
img

接收方是从低层到高层解封装

  • 数据封装完毕传输到接收方后,将数据要进行解封装
  • 在物理层,先把电信号转成二进制数据,并将数据传送至数据链路层
  • 在数据链路层,把MAC头部拆掉,并将剩余的数据传送至上一层
  • 在网络层,数据的IP头部被拆掉,并将剩余的数据送至上一层
  • 在传输层,把TCP头部拆掉,将真实的数据传送至应用层
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2020-01-11,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 浏览器
    • URL
      • 浏览器解析URL
        • HTTP协议
          • IP地址
            • DNS
            • 2 TCP/IP参考模型及协议
            • 1) 模型
            • 2) 协议
            • 3 物理层
            • 4 数据链路层
            • 5 网络层
            • IP头
            • 6 传输层
            • 1) TCP的功能
            • 2) TCP头的介绍
            • 3) 传说中的三次握手和四次挥手(抓包演示)
            • 7 应用层
            相关产品与服务
            数据传输服务
            腾讯云数据传输服务(Data Transfer Service,DTS)可帮助用户在业务不停服的前提下轻松完成数据库迁移上云,利用实时同步通道轻松构建高可用的数据库多活架构,通过数据订阅来满足商业数据挖掘、业务异步解耦等场景需求。同时,DTS 还提供私有化独立输出版本 DTS-DBbridge,支持异构数据库和同构数据库之间迁移和同步,可以帮助企业实现完整数据库迁移(如 Oracle)。
            领券
            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档