文章目录
- 概述
- 英语缩略语
- 一、Web浏览器
- 二、协议栈、网卡
- 三、集线器、交换机、路由器
- 四、接入网、网络运营商
- 五、防火墙、缓存服务器
- 六、Web服务器
- 总结
概述
从在浏览器中输入网址,到屏幕上显示出网页的内容,在这个只有几秒钟的过程中,很多硬件和软件都在各自的岗位上相互配合完成了一系列的工作。浏览器和Web服务器之间的交互很简单,即浏览器向Web服务器发送请求,Web服务器根据请求向浏览器发送响应。这个过程所经历的大致环节有:Web浏览器——>协议栈、网卡——>集线器、交换机、路由器——>接入网、网络运营商——>防火墙、缓存服务器——>Web服务器。
英语缩略语
ACK:Acknowledge,确认。
ADSL:Asymmetric Digital Subscriber Line,不对称数字用户线。
ARP:Address Resolution Protocol,地址解析协议。
ASK:Amplitude Shift Keying,幅移键控。
ATM:Asynchronous Transfer Mode,异步传输。
BAS:Broadband Access Server,宽带接入服务器。
BGP:Broder Gateway Protocol,边界网关协议。
CDS:Content Delivery Service,内容分发服务。
CRC:Cyclic Redundancy Check,循环冗余校验。
DHCP:Dynamic Host Configuration Protocol,动态主机配置协议。
DLL:Dynamic Link Library,动态链接库。
DNS:Domain Name System,域名服务系统。
FCS:Frame Check Sequence,帧校验序列。
FTP:File Transfer Protocol,文件传送协议。
FTTH:Fiber To The Home,光纤到户。
HDLC:High-level Data Link Control,高级数据连接控制。
HTML:HyperText Markup Language,超文本标记语言。
HTTP:HyperText Transfer Protocol,超文本传送协议。
IANA:Internet Assigned Number Authority,互联网编号管理局。
ICMP:Internet Control Message Protocol,互联网控制消息协议。
IP:Internet Protocol,互联网协议。
IX:Internet eXchange,互联网交换中心。
MAC:Media Access Control,介质访问控制。
MAU:Medium Attachment Unit,介质连接单元。
MSS:Maximum Segment Size,最大分段大小。
MTU:Maximum Transmission Unit,最大传输单元。
MX:Mail eXchange,邮件交换。
NOC:Network Operation Center,网络运行中心。
OLT:Optical Line Terminal,光线路终端。
ONU:Optical Network Unit,光网络单元。
PHY:Physical Layer Device,物理层装置。
PID:Process Identifier,进程标识符。
POP:Point of Presense,接入点。
PPP:Point to Point Protocol,点到点协议。
PPPoE:Point to Point Protocol over Ethernet,以太网的点对点协议。
PSK:Phase Shift Keying,相移键控。
QAM:Quadrature Amplitude Modulation,正交调幅。
RADIUS:Remote Authentication Dial-in User Service,远程认证拨号用户服务。
RAS:Remote Access Server,远程访问服务器。
Resolver:解析器。
SFD:Start Frame Delimiter,起始帧分界符。
SYN:Synchronize,同步。
Twisted pair cable:双绞线。
TCP:Transmission Control Protocol,传输控制协议。
UDP:User Datagram Protocol,用户数据报协议。
URI:Uniform Resource Identifier,同一资源标识符。
URL:Uniform Resource Locator,统一资源定位符。
一、Web浏览器
URL的元素构成如下。
http: + // + Web服务器名 + / + 目录名 + / + … + 文件名
URL的开头表示访问数据源的机制,即协议。
双斜杠后面的字符串表示服务器的名称。
服务器名称后面的是数据源的路径名,可省略。
浏览器的第一步工作就是对URL进行解析。
对URL进行解析后,浏览器确定了Web服务器和文件名,接下来就是根据这些信息来生成HTTP请求消息。
一条请求消息中只能写一个URL,如果需要获取多个文件,必须对每个文件单独发送一条请求。
生成HTTP消息后,需要委托操作系统将消息发送给Web服务器,因为浏览器本身不具备将消息发送到网络中的功能。在将消息发送给Web服务器时,需要查询网址中服务器域名对应的IP地址。
IP地址的网络号和主机号通过子网掩码区分,子网掩码为1的部分表示网络号,子网掩码为0的部分表示主机号。主机号全为0表示整个子网,主机号全为1表示向子网上所有设备发送包,即广播。
通过服务器名称查询其IP地址或者根据IP地址查询服务器名称的机制就是DNS。通过DNS查询IP地址的操作称为域名解析,负责执行解析操作的是解析器。解析器是一段程序,它包含在操作系统的Socket库中。
Socket库是用于调用网络功能的程序组件集合。
向DNS服务器发送消息时,也需要知道DNS服务器的IP地址,只不过这个IP地址是作为TCP/IP的一个设置项目事先设置好的,不需要再去查询。
可以在Windows中自行设置DNS服务器地址,如下图所示。
目标服务器的寻找过程如下图所示。
在进行收发数据之前,双方需要先建立管道,建立管道的关键在于管道两端的数据出入口,这些出入口称为套接字。需要先创建套接字,然后再将套接字连接起来形成管道。首先,服务器一方先创建套接字,然后等待客户端向该套接字连接管道,当服务器进入等待状态时,客户端就可以连接管道了。具体来说,客户端也会先创建一个套接字,然后从该套接字延伸出管道,最后管道连接到服务器端的套接字上。当双方的套接字连接起来之后,通信准备就完成了。接下来,将数据送入套接字就可以收发数据了,收发数据结束之后,连接的管道将会被断开。
Socket表示库,socket表示程序组件的名称,套接字表示管道两端的接口。
应用程序是通过“描述符”这一类似号码牌的东西来识别套接字的。
二、协议栈、网卡
操作系统中的网络控制软件也称协议栈,网络硬件也称网卡。
浏览器、邮件等一般应用程序收发数据时用TCP;DNS查询等收发较短的控制数据时用UDP。
协议栈是根据套接字中记录的控制信息来工作的。
Windows中可以用netstat命令显示套接字内容,如下图所示。
图中的每一行相当于一个套接字,当创建套接字时,就会在这里增加一行新的控制信息。地址后面的是端口号,IP和端口号通过冒号分隔,LISTENING表示等待对方连接的状态,ESTABLISHED表示完成连接并正在进行数据通信的状态表。0.0.0.0表示通信还没开始,IP地址不确定。
显示套接字使用的命令具体解释如下。
netstat -ano
netstat 用于显示套接字的内容
a 不仅显示正在通信的套接字,还显示包括尚未开始通信等状态的所有套接字
n 显示IP地址和端口号
o 显示使用该套接字的程序PID
浏览器委托协议栈使用TCP协议来收发数据。
创建套接字时,首先分配一个套接字所需的内存空间,然后向其中写入初始状态。
头部是用来记录和交换控制信息的字段。
TCP头部共占20字节,其格式如下所示。
字段名称 | 长度(比特) | 含义 |
---|---|---|
发送方端口号 | 16 | 发送网络包的程序的端口号 |
接收方端口号 | 16 | 网络包的接收方程序的端口号 |
序号(发送数据的顺序编号) | 32 | 发送方告知接收方该网络包发送的数据相当于所有发送数据的第几个字节 |
ACK号(接收数据的顺序编号) | 32 | 接收方告知发送方接收方已经收到了所有数据的第几个字节 |
数据偏移量 | 4 | 表示数据部分的起始位置,认为表示头部的长度 |
保留 | 6 | 保留,现在未使用 |
控制位 | 6 | URG:表示紧急指针字段有效 ACK:表示接收数据序号字段有效 PSH:表示通过flush操作发送数据 RST:强制断开连接,用于异常中断的情况 SYN:发送方和接收方相互确认序号,表示连接操作 FIN:表示断开连接 |
窗口 | 16 | 接收方告知发送方窗口大小(无需等待确认可一起发送的数据量) |
校验和 | 16 | 用来检查是否出现错误 |
紧急指针 | 16 | 表示应紧急处理的数据位置 |
可选字段 | 可变长度 | 除了上面的固定头部字段之外,还可以添加可选字段,除了连接操作,很少使用该字段 |
通信操作中使用的控制信息分为两类:头部中记录的信息;套接字(协议栈中的内存空间)中记录的信息。
连接操作的第一步是在TCP模块出创建表示连接控制信息的头部。
通过TCP头部中的发送方和接收方端口号可以找到要连接的套接字。
MTU是一个网络包的最大长度,以太网中一般为1500字节。
MSS是指除去头部之后,一个网络包所能容纳的TCP数据的最大长度。
MTU和MSS的示意图如下。
HTTP请求消息一般不会很长,一个网络包就能装下,但如果其中要提交表单数据,长度就可能超过一个网络包所能容纳的数据量,这时发送缓冲区中的数据会被以MSS长度为单位进行拆分,拆分出来的每块数据会被放进单独的网络包中。
ACK返回的包号表示该包及之前的包都已经收到。
网络包的结构如下图所示。
IP模块负责添加MAC头部和IP头部,MAC头部是以太网用的头部,包含MAC地址,IP头部是IP用的头部,包含IP地址。
IP头部共占20字节,其格式如下所示。
字段名称 | 长度(比特) | 含义 |
---|---|---|
版本号 | 4 | IP协议版本号 |
头部长度 | 4 | IP头部的长度,可选字段会导致头部长度变化,所以这里需要指定头部长度 |
服务类型 | 8 | 表示包传输优先级 |
总长度 | 16 | 表示IP消息的总长度 |
ID号 | 16 | 用于识别包的编号,一般为包的序列号。如果一个包被IP分片,则所有分片都拥有相同的ID |
标志 | 3 | 该字段有3个比特,其中2个比特有效,分别代表是否允许分片,以及当前包是否为分片包 |
分片偏移量 | 13 | 表示当前包的内容为整个IP 消息的第几个字节开始的内容 |
生存时间(Time to Live,TTL) | 8 | 表示包的生存时间,这是为了避免网络出现回环时一个包永远在网络中打转。每经过一个路由器,这个值就会减1,减到0时这个包就会被丢弃 |
协议号 | 8 | 表示协议的类型 TCP: 06 UDP: 11 ICMP: 01 |
头部校验和 | 16 | 用于检查错误,现在已不使用 |
发送方IP地址 | 32 | 网络包发送方的IP地址 |
接收方IP地址 | 32 | 网络包接收方的IP地址 |
可选字段 | 可变长度 | 除了上面的头部字段之外,还可以添加可选字段用于记录其他控制信息,但可选字段很少使用 |
IP地址实际上并不是分配给计算机的,而是分配给网卡的,因此当计算机上存在多块网卡时,每一块网卡都会有自己的IP地址。很多服务器上都会安装多块网卡,这时一台计算机就有多个IP地址,在填写发送方IP地址时就需要判断到底应该填写哪个地址。这个判断相当于在多块网卡中判断应该使用哪一块网卡来发送这个包,也就相当于判断应该把包发往哪个路由器,因此只要确定了目标路由器,也就确定了应该使用哪块网卡,也就确定了发送方的IP地址。
在Windows中显示路由表如下图所示。
网络目标是包要发往的设备地址,要向这个地址发包,可以将包发给网关(路由器)进行转发。
网络掩码是用来判断IP地址中网络号和主机号分界线的值。
网关在TCP/IP的世界里就是路由器的意思。
接口是发送包的网络接口,如果和网关地址相同,则表示不通过路由器转发,可以直接向目标IP地址发送包。
最后一列是跃点数,数越小说明距离越近。
MAC头部共占14字节,其格式如下所示。
字段名称 | 长度(比特) | 含义 |
---|---|---|
接收方MAC地址 | 48 | 网络包接收方的MAC 地址,在局域网中使用这一地址来传输网络包 |
发送方MAC地址 | 48 | 网络包发送方的MAC 地址,接收方通过它来判断是谁发送了这个包 |
以太类型 | 16 | 使用的协议类型。一般在TCP/IP 通信中只使用0800和0806这两种。常见的类型有: 0000-05DC:IEEE 802.3 0800:IP 协议 0806:ARP 协议 86DD:IPv6 |
IP模块根据路由表Gateway栏的内容判断应该把包发送给谁。查询MAC地址需要使用ARP。
网卡的内部结构如下图所示。
网卡的ROM中保存着全世界唯一的MAC地址,这是在生产网卡时写入的,网卡中保存的MAC地址会由网卡驱动程序读取并分配给MAC模块。
当信号连续为1或连续为0时,比特之间的界限就会消失,如果将时钟信号叠加进去,就可以判断出比特之间的界限了。
不需要重发的数据用UDP发送更高效。 向DNS服务器查询IP地址的时候使用的是UDP协议。TCP之所以复杂,就是要管理发送和确认的进度,有错误时重发包。
UDP没有TCP的接收确认、窗口等机制,因此在收发数据之前也不需要交换控制信息,也就是说不需要建立和断开连接的步骤,只要在从应用程序获取的数据前面加上UDP头部,然后交给IP进行发送就可以了。UDP协议没有其他功能,遇到错误或者丢包也一概不管,因为UDP只负责单纯地发送包,并不像TCP一样会对包的送达状态进行监控,所以协议栈也不知道有没有发生错误。这样并不会引发什么问题,出错时就收不到来自对方的回复,应用程序会注意到这个问题,并重新发送一遍数据,这样的操作本身并不复杂,也并不会增加应用程序的负担。
在无需重发数据,或者是重发了也没什么意义的情况下,使用UDP发送数据的效率会更高。
UDP头部共占8字节,其格式如下所示。
字段名称 | 长度(比特) | 含义 |
---|---|---|
发送方端口号 | 16 | 网络包发送方的端口号 |
接收方端口号 | 16 | 网络包接收方的端口号 |
数据长度 | 16 | UDP头部后面数据的长度 |
校验和 | 16 | 用于校验错误 |
三、集线器、交换机、路由器
从计算机发送出来的网络包会通过集线器、交换机、路由器等设备被转发,最终到达目的地。
局域网网线使用的是双绞线,其中“双绞”的意思就是以两根信号线为一组缠绕在一起,这种拧麻花一样的设计是为了抑制噪声的影响。
产生噪声的原因是网线周围的电磁波,当电磁波接触到金属等导体时,在其中就会产生电流。如果将信号线缠绕在一起,信号线就变成了螺旋形,其中两根信号线中产生的噪声电流方向就会相反,从而使得噪声电流相互抵消,噪声就得到了抑制。
集线器将信号发送给所有连接在它上面的线路,即当信号到达集线器后,会被广播到整个网络中。由于集线器只是原封不动地将信号广播出去,所以即便信号受到噪声的干扰发生了失真,也会原样发送到目的地。出错的包在接收端被丢弃,丢弃包并不会影响数据的传输,因为丢弃的包不会触发确认响应,因此协议栈的TCP模块会检测到丢包,并对该包进行重传。
交换机的一个端口就相当于计算机上的一块网卡,但交换机的工作方式和网卡有一点不同。网卡本身具有MAC地址,并通过核对收到的包的接收方MAC地址判断是不是发给自己的,如果不是发给自己的则丢弃。交换机的端口不核对接收方MAC地址,而是直接接收所有的包并存放到缓冲区中。因此,和网卡不同,交换机的端口不具有MAC地址。交换机根据MAC地址表查找MAC地址,然后将信号发送到相应的端口。
交换机只将包转发到具有特定MAC地址的设备连接的端口,其他端口都是空闲的,因此交换机可以同时转发多个包。相对地,集线器会将输入的信号广播到所有的端口,如果同时输入多个信号就会发生碰撞,无法同时传输多路信号,因此从设备整体的转发能力来看,交换机要高于集线器。
网络包经过集线器和交换机之后,现在到达了路由器,并在此被转发到下一个路由器。路由器和交换机是有区别的,因为路由器是基于IP设计的,而交换机是基于以太网设计的。
路由器的结构如下图所示。
与交换机不同的是,路由器的各个端口都具有MAC地址和IP地址。以以太网端口为例,路由器的端口具有MAC地址,因此它就能够成为以太网的发送方和接收方,端口还具有IP 地址,从这个意义上来说,它和计算机的网卡是一样的。当转发包时,首先路由器端口会接收发给自己的以太网包,然后查询转发目标,再由相应的端口作为发送方将以太网包发送出去。
完成包接收操作之后,路由器就会丢弃包开头的MAC头部。MAC头部的作用就是将包送达路由器,其中的接收方MAC地址就是路由器端口的MAC地址。接下来,路由器会根据MAC头部后方的IP头部中的内容进行包的转发操作。
路由表中子网掩码为0.0.0.0的记录表示“默认路由”。
转发的包长度超过了输出端口能传输的最大长度,就无法直接发送这个包了。遇到这种情况,可以使用IP协议中定义的分片功能对包进行拆分,缩短每个包的长度。在分片之前还需要看一下IP头部中的标志字段,确认是否可以分片。如果查询标志字段发现不能分片,那么就只能丢弃这个包,并通过ICMP消息通知发送方。
对包进行拆分的分片过程如下图所示。
路由器判断下一个转发目标的方法如下:如果路由表的网关列内容为IP地址,则该地址就是下一个转发目标;如果路由表的网关列内容为空,则IP头部中的接收方IP地址就是下一个转发目标。
路由器也会使用ARP来查询下一个转发目标的MAC地址。
IP(路由器)负责将包送达通信对象这一整体过程,而其中将包传输到下一个路由器的过程则是由以太网(交换机)来负责的。
四、接入网、网络运营商
家庭和公司的内网是通过接入网连接到网络运营商的,接入网需要通过用户名和密码验证用户的身份,然后由网络运营商向用户分配公有地址。
互联网的整体架构如下图所示。
ADSL是一种利用架设在电线杆上的金属电话线来进行高速通信的技术,它的上行方向(用户到互联网)和下行方向(互联网到用户)的通信速率是不对称的。
用户端路由器发出的网络包通过ADSL Modem和电话线到达电话局,然后到达ADSL的网络运营商,在网络包从用户传输到运营商的过程中,会变换几种不同的形态,整个过程如下图所示。
ADSL采用的调制方式是振幅调制和相位调制相结合的正交振幅调制方式,如下图所示。
将振幅调制和相位调制两种方式组合起来,正交振幅调制就可以用一个波表示更多的比特,从而提高传输速率。
光纤是由一种双层结构的纤维状透明材质(玻璃和塑料)构成的,通过在里面的纤芯中传导光信号来传输数字信息。ADSL信号是由多个频段的信号组成的,比较复杂,但光信号却非常简单,亮表示1,暗表示0。光纤的结构如下图所示。
数字信息并不能一下子变成光信号,需要先将数字信息转换成电信号,然后再将电信号转换成光信号。电信号用1表示高电压,用0表示低电压,将电信号输入LED、激光二极管等光源后,这些光源就会根据信号电压的变化发光,高电压发光亮,低电压发光暗。光信号在光纤中传导之后,就可以通过光纤到达接收端,接收端的光敏元件可以根据光的亮度产生不同的电压。当光信号照射到上面时,光亮的时候就产生高电压,光暗的时候就产生低电压,这样就将光信号转换成了电信号。
光通信原理如下图所示。
用户发送的网络包会通过ADSL和FTTH等接入网到达运营商的BAS,可将BAS理解为一种进化型的路由器。
PPPoE是将PPP消息装入以太网包进行传输的方式。PPPoE包格式如下图所示。
BAS在收到用户路由器发送的网络包之后,会去掉MAC头部和PPPoE头部,然后用隧道机制将包发送给网络运营商的路由器。隧道机制类似于套接字之间建立TCP连接。
互联网内部如下图所示。
ADSL、FTTH等接入网是与用户签约的运营商设备相连的,这些设备称为POP,互联网的入口就位于这里。网络包通过接入网之后,到达运营商POP的路由器。
POP中包括各种类型的路由器,路由器的基本工作方式是相同的,但根据其角色分成了不同的类型。
NOC是运营商的核心设备,从POP传来的网络包都会集中到这里,并从这里被转发到离目的地更近的POP,或者是转发到其他的运营商。可将NOC简单理解为规模扩大后的POP。
互联网内部使用BGP机制在运营商之间交换路由信息。
互联网交换中心(IX)是一个中心设备,通过连接到中心设备的方式来减少线路数量,如下图所示。
可以看到,有了IX后能够使得线路数量大幅减少。
五、防火墙、缓存服务器
防火墙只允许发往指定服务器的指定应用程序的网络包通过,从而屏蔽其他不允许通过的包,可以降低相应的风险。
包过滤方式的防火墙可根据接收方IP地址、发送方IP地址、接收方端口号、发送方端口号、控制位等信息来判断是否允许某个包通过。
防火墙可以根据包的起点和终点来判断是否允许其通过,但仅凭起点和终点并不能筛选出所有有风险的包。如果包中含有引起服务器宕机的特定数据,防火墙也无法发现,于是包就被放行了,当包到达服务器时,就会引发服务器宕机。只有检查包的内容才能识别这种风险,因此防火墙对这种情况无能为力。修复服务器Bug防止宕机或者在防火墙之外部署用来检查包的内容并阻止有害包的设备或软件。
当服务器的访问量上升时,增加服务器线路的带宽是有效的,但并不是网络变快了就可以解决所有的问题。使用多台服务器来分担负载,减少每台服务器的访问量是比较有效的。
使用负载均衡器分配访问的示例如下图所示。
缓存服务器是一台通过代理机制对数据进行缓存的服务器,代理介于服务器和客户端之间,具有对服务器访问进行中转的功能。当进行中转时,它可以将服务器返回的数据保存在磁盘中,并可以代替服务器将磁盘中的数据返回给客户端。
部署在客户端的代理是正向代理,部署在服务器端的代理是反向代理。透明代理放在请求消息从浏览器传输到服务器的路径中,当消息经过时进行拦截,然后再转发给服务器。
六、Web服务器
服务器将接收到的电信号还原为数字信息的过程如下图所示。
根据信号还原数字信息如下图所示。
网卡的MAC模块将网络包从信号还原为数字信息,校验FCS并存入缓冲区。
网卡驱动会根据MAC头部判断协议类型,并将包交给相应的协议栈。
协议栈的IP模块会检查IP头部,判断是不是发给自己的;判断网络包是否经过分片;将包转交给TCP模块或UDP模块。
收到数据包时,TCP模块会根据收到的包的发送方IP地址、发送方端口号、接收方IP地址、接收方端口号找到相对应的套接字;将数据块拼合起来并保存在接收缓冲区中;向客户端返回ACK。
服务器返回响应消息的主要类型如下所示。
总结
对本文内容的总结如下图所示。
本文参考书目:
网络是怎样连接的/(日)户根勤著:周自恒译–北京:人民邮电出版社,2017.1