网络初探01-从浏览器到服务器过程全貌学习总结

本文是学习《网络是怎样连接的》后的总结,详细介绍了从用户在浏览器输入URL到服务器接收请求的整个过程,包括DNS解析、套接字创建、TCP/IP头部作用、路由器转发及服务端响应等关键步骤。
摘要由CSDN通过智能技术生成

网络初探01

前言:

最近在学习网络方面的知识,这篇文章是看完《网络是怎样连接的》这本书之后的学习总结。

总览

在这里插入图片描述
上图是一个Http网络请求的主要流程,我们目前主要关注的是客户端和服务端是怎样发送和接收请求的,至于中间的网络运营商怎样转发暂时不是我们的关注点。
我们从用户在浏览器输入地址开始,一直到服务器接收请求之后返回响应为止,一路探索网络是如何运作的。

客户端发送请求

浏览器根据域名请求DNS服务获取IP

· 假设用户要访问http://www.processon.com,当用户在浏览器输入网址之后,浏览器是没办法直访问这个网址的,因为要访问服务器必须使用协议:IP:端口这样的格式才行。
· 那么怎样才能让浏览器获得IP和端口呢?
首先,当用户没有输入端口的时候,浏览器会使用默认端口号80,所以只要服务器的端口是80,用户就不需要输入端口号,可以省略。剩下的IP需要通过DNS服务来查询,DNS是域名系统(英文:Domain Name System,缩写:DNS)是互联网的一项服务。它作为将域名和IP地址相互映射的一个分布式数据库,能够使人更方便地访问互联网。DNS使用UDP端口53。当前,对于每一级域名长度的限制是63个字符,域名总长度则不能超过253个字符。
· DNS提供的功能就是通过域名查询IP的功能,比方说DNS服务器中保存了这样一个key-value结构的数据:www.processon.com111.3.78.231。那么浏览器就可以通过DNS查询到域名的IP是111.3.78.231,然后拿到IP之后再去访问这个IP地址下端口为80的程序了。
· 实际上DNS的域名查询功能可以是域名与IP为一对多的关系,那么查询到多个IP应该使用哪一个呢,可以通过轮询,每次访问的时候,都用下一个IP就行了。

浏览器调用Socket库创建套接字

· 在浏览器拿到IP之后,需要访问这个服务器的时候,需要调用操作系统的Socket库来建立连接,Socket库可以看做是操作网络的一些组件的集合,所有的应用程序使用网络功能的时候都需要调用这个库。我们常用的connect、close等都是这个库的一些组件,关于这个库的其他知识点暂时还没学习到,就不展开说明了。
· 首先浏览器会去创建套接字,简单来说就是调用Socket库填写服务器IP和端口,再申请当前浏览器在这次连接使用的端口号。

浏览器发送数据

· 有了套接字之后,就可以发送数据了,当然在http请求中需要先向服务器建立TCP连接之后才能发送数据,发送数据和建立连接的通信过程是差不多的,只是TCP的头部设置不同,现在暂时关注发送数据的阶段。
· 浏览器将数据和套接字对象交给Socket库,Socket库将信息交给TCP模块,然后TCP模块会创建一个TCP头,将TCP头放到数据的前面,然后把整体交给IP模块,IP模块将TCP传递过来的所有内容都作为数据处理,然后在前面加上IP头和MAC头,然后IP模块再将整体内容交给网卡,网卡将IP模块转交过来的内容在前面加上起始帧分界符(SFD,Start Frame Delimiter),在末尾加上帧校验序列(FCS,Frame Check Sequence)。

用图形表示头部的追加
在这里插入图片描述
这不就是套娃吗?

头部的作用

看到这个头那个头的,先不说这些头占用了多少字节,可能自己的头都要大了。

那么这些头有什么用呢?
先看TCP头,TCP头主要包含的信息是客户端的端口和服务端的端口,用来找到具体的程序用的。再来看一下TCP头的具体内容有哪些:
在这里插入图片描述
客户端端口号:这里指的是浏览器创建套接字时申请的端口号。
服务端端口号:这里指的是服务端的80端口。
序号:告知服务端当前数据包相当于整体数据的第几个字节。
ACK号:服务端告知客户端已经接收到了整体数据的第几个字节。
数据偏移量:表示数据部分的起始位置,也相当于头部的长度是多少。
保留:这部分保留,相当于还没有任何意义。
控制位:该字段每个比特位表示如下意义:

URG:表示紧急指针字段有效。
ACK:表示ACK号有效,通常表示数据已经接收到。
PSH:表示通过flush操作发送的数据。
RST:强制断开连接,用于异常中断。
SYN:客户端和服务端相互确认序号,用于连接操作。
FIN:表示断开连接。

窗口:服务端告诉客户端的窗口大小(无需等待确认可以一起发送的数据量)
校验和:用来检查是否出现错误
紧急指针:表示应该紧急处理的数据的位置.
可选字段:除了上面的这些固定头部以外,还可以添加可选字段,但除了连接操作之外,很少使用到。

看到了吗,有这么多的部分,有些不好理解,所以现在主要知道TCP头是可以携带2边的端口就好。

下面来看看IP头部又是干什么的吧。
在这里插入图片描述
版本:IP协议版本号,目前使用的是4。
头部长度:IP头部的长度,可选字段会导致长度变化,所以这里需要指定头部长度。
服务类型TOS:表示包传输优先级,最初的协议规格里对这个参数的规定很模糊,最近DiffServ规格重新定义了这个字段的用法。
总长度:表示IP消息的总长度。也就是IP头部长度+数据长度。
ID号:用于识别包的编号,一般为包的序列号。如果一个包被分片,则该包的所有分片都有相同的编号。
标志:该字段有3个比特,其中只有2个有效,分别代表是否允许分片和当前是否为分片包。
分片偏移量:表示当前分片包在包中的位置。
生存时间TTL:表示包的生存时间,这是为了避免网络出现回环时一个包永远在网络中打转。每经过一个路由器值就会-1,直到0时就会被丢弃。
协议号:表示协议的类型。TCP:06,UDP:11,ICMP:01。
头部校验和:用于检查错误,现在已不使用。
客户端IP地址:网络包发送方的IP地址。
服务端IP地址:网络包接收方的IP地址。
可选字段:很少使用。

又是一些看不懂的东西,在这里主要知道的是IP头记录了发送方和接收方的IP地址就可以了,这才是我们最主要关注的。

· 看看MAC头有哪些内容吧。
在这里插入图片描述
接收方MAC地址:网络包接收方的地址,在局域网中使用这个地址来传送网络包。
发送方MAC地址:网络包发送方的地址,接收方通过这个地址来判断是谁发送的包。
以太类型:使用的协议类型。
下面是常用的类型,一般在TCP/IP通信中只使用0800和0806这2种。

0000-05DC:IEEE 802.3
0800:IP协议
0806:ARP协议
86DD:IPv6

每个网卡中保存着世界唯一的MAC地址,这是在生产网卡的时候写入到网卡ROM中去的,网卡中的MAC地址会由网卡驱动读取并分配给MAC模块。
MAC地址是给包传输的时候定位哪个设备使用的。

· 好,那么问题来了,客户端在发送请求的时候,知道的内容有客户端的IP、端口、MAC地址,有服务端的IP、端口。那么MAC地址去哪拿呢?如果需要知道服务端的MAC地址,就要先请求到服务端才能知道MAC地址,但是在请求发送之前,我们就得知道服务端的MAC地址,否则就是不按规则发送,发送就会失败,但是我们都还没发送请求到服务端,又怎么会有服务端的MAC地址呢?(来应聘之前,你得先有工作经验。可是我都还没应聘上,哪来的工作经验呢???)
其实我们的MAC地址不是要填写服务端的MAC地址(在一开始还不是),而是填写下一个路由器的MAC地址,而下一个路由器的地址是通过一个叫做ARP的功能查询到的。地址解析协议,即ARP(Address Resolution Protocol),是根据IP地址获取物理地址的一个TCP/IP协议。主机发送信息时将包含目标IP地址的ARP请求广播到局域网络上的所有主机,并接收返回消息,以此确定目标的物理地址。
· 那么在查询路由器MAC地址的时候,是不是通过路由器的IP去查询的呢?
我想应该是的,如果根据服务端IP去查询就说不通了。对ARP还不是很了解。

网卡转换信号

· 说完了上面的这些,现在我们来看看网卡是怎么把数据发送出去的吧。
先看一下网卡的基本组成:
在这里插入图片描述
网卡驱动从IP模块读取包之后,会将包复制到网卡的缓冲区中,然后向MAC模块发出发送包的命令。接下来就轮到MAC模块进行工作了。首先,MAC模块会将包从缓冲区中取出,并在开头加上报头和起始帧分界符,在末尾加上用于检测错误的帧校验序列。
网卡的MAC模块生成通用信号,然后由PHY(MAU)模块转换成可在网线中传输的格式,并通过网线发送出去。
至于信号怎么转换的不是我们关注的重点,也不容易理解,所以暂时不考虑了解。大概就是通过这样一个公式:高低电压 xor 时钟信号=比特值来计算出来的。

路由器转发请求

从私有地址到公有地址

数据通过网线到达路由器之后,路由器会检查包前面的MAC头部跟自己的MAC地址是不是一样的,如果不是一样的则丢弃,如果是一样的就会接收过来。然后就可以把包上的MAC头去掉,再替换成当前路由器到下一个路由器的MAC地址,下一个路由器的MAC地址也是通过ARP去查询到的。
那么,改完MAC之后就可以马上发送包了吗?不一定。
因为我们现在的家庭网络使用的都是私有地址,都是通过路由器分配的内网地址,外网是不能在TCP发起连接阶段访问的。
那么我们的电脑是如何接收到浏览器的响应数据的呢?
比方说,客户端现在的IP和端口是192.168.0.10:65530,在IP头部的发送方中记录的是192.168.0.10,在TCP头部中记录的发送方端口号是65530。假设这些在请求到服务端之后都不变,那么,在服务端给我们的响应包的时候,响应包的IP头部的接收方就会是192.168.0.10,在TCP头部中的接收方端口号是65530,这样确定能正确返回到客户端吗?不会定位到服务端的内网地址吗?
所以如果不处理的话是会有问题的,路由器需要将发送出去的请求头改写,在路由器内部会有一个地址转换的表,用我们上面的例子来表示,这个记录大概会是这样:

公网IP公网端口私有IP私有端口
101.123.124.1258000192.168.0.1065530

这样一来,就可以放心的把头部改写掉了,由于公网IP是全球唯一的,所以不会存在IP冲突找错设备的问题,再通过映射端口来解决找内网设备IP端口冲突的问题,相当于公网端口是内网设备某个网络连接的一个编号。
不过这样也有个问题,因为端口号是有限的,最多65535个,如果一个设备在不停地发起连接,那么很快就会占用完端口,一个内网中会存在的设备数量可以是非常多的,这样势必会造成其他设备网络异常。

通过地址转换,路由器就可以发送包了,然后到达网络运营商的路由器,然后到达公网环境,中间还是经过路由器的层层转发,最后到达服务端的路由器。

服务端接收请求

提取数据

服务端提取数据的处理基本上是客户端发送请求的逆向处理过程。

首先数据从路由器通过网线到达服务端网卡,
网卡中的PHY(MAU)模块会将电信号转换为通用格式后再发给MAC模块,
MAC模块再将电信号转换为数字信号,并存放到缓冲区中,
然后检查FCS,如果FCS校验没有问题,再比对MAC地址是否跟自己的一样,
如果MAC地址一样,则说明包是给自己的并且接收到的包没有问题,这时候,网卡就会向操作系统发送一个信号,告诉操作系统您有一个快递待签收,然后操作系统就会派网卡驱动去收包裹。
然后网卡驱动就将收到的包拿过来,判断是什么协议的,就给处理什么协议的组件去处理。还记得MAC头吗,里面保存了协议类型,我们的例子是Http请求,所以响应的也是用Http协议的,Http协议使用的是TCP/IP协议,所以在MAC头的以太类型中,返回的应该是0800,网卡驱动就是根据这个来判断的,然后将包交给IP模块去处理。
IP模块会去校验包里的接收方IP是不是给自己的,如果不是就会通过ICMP告知发送方出错了。
然后IP模块就会将包交给TCP模块,TCP模块的任务就是要通过客户端IP端口和服务端IP端口来找到之前创建好的套接字,
找到套接字之后,再通过套接字将数据读取到服务端程序中。

断开连接
服务端程序处理完毕之后,会发送一个Http响应给客户端,这时候的发送过程跟客户端是一样的,
客户端接收到响应之后,就会发送关闭连接的通知,服务端收到通知之后会返回一个ACK表示收到这个通知了,
然后服务端进入关闭连接状态,并发送通知给客户端,客户端收到之后也会返回一个ACK表示收到这个通知了。
这时断开工作就完成了,客户端和服务端的套接字会在一段时间后被删除。
这就是4次挥手

那么建立连接的3次握手又是怎么样的呢?
首先客户端会在自己这里创建一个套接字,然后发起连接请求,
连接请求到达服务端之后,服务端会为这个连接分配一个套接字副本,以后该连接都会使用这个副本,副本创建完毕之后,服务端会返回一个通知告诉客户端,连接已经建立好了,
客户端收到通知之后,会返回给服务端一个通知,也许是代表收到你的通知了,我接下来就要开始发送数据了。
这就是3次握手

写到这里,这篇总结算是结束了。
这本书写的挺全面的,从软件层一路写到硬件层,还说了网络运营商内部的流程,可以说覆盖面非常广了。这本书在当当上看了一下,售价是48.86元,有点贵,但我是在微信读书上面看的,无限卡免费看哦,微信读书二维码已经放到下面了,推荐给大家。
在这里插入图片描述
文章里的图是通过ProcessOn这个网址制作而成的,制作完成的图风格比较简洁,看起来蛮顺眼的,制作好的图可以下载成jpg等格式,文件本身是在线托管的,所以到哪里只要有网就可以在线制作图,挺方便的。
链接放到下面,推荐给大家。
注册立即领7天ProcessOn会员,点击注册:https://www.processon.com/i/60d59a07f346fb5e35b358f0
注册成功后,还有付费行业/岗位知识地图套餐限时0元领,点击领取:https://www.processon.com/ac/221111?from=ac201221
还可以扫码注册,二维码已经放到下面了。
在这里插入图片描述
关于网络,还有很多不懂的,在编写过程中难免会有错误和不足,欢迎指正、交流。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值