简介
- 《网络是怎样连接的》是一本计算机网络入门书籍,中级从业者可以查漏补缺,梳理凌乱的计算机网络知识,了解网络全貌。
- 书中从打开浏览器,在地址栏中输入网址开始讲解,计算机是如何处理网址信息,最后又是如何把网络信息显示在浏览器中。
- 书中所涵盖的网络知识比较全面,但只是点到为止,不然这A5大的一本书,也不可能330几页就能讲完,要知道,计算机网络是一个很庞大的系统,虽然发展史可能才数十年,但是能支撑这全球网络设备通信,远比想象的要复杂,但话又说回来,任何复杂的知识只要拆解的足够细,只要有点学习能力,都能搞懂。
- 所以我觉得这本书对各部分的网络知识分解和讲解都是恰到好处。既能了解网络全貌,又能了解各个环节所涉及到的相关知识,并以提问的方式引发读者思考。
- 这本书主要内容都集中在前两个章节,毕竟HTTP协议和协议栈相关协议内容都很复杂,三四五章节主要是对网络包和信号传输过程进行讲解,最后一个章节主要是描述了服务器的工作原理以及与客户端的一些差异。
正文
一图浏览全书(摘自书中序第16页)
如图,从打开浏览器输入网址开始,共分这样六步最终把网络内容显示在浏览器上,每一步分为一个章节展开讲解。
第一章 浏览器生成消息
首先会对浏览器中输入的网址(URL,Uniform Resource Locator,统一资源定位符)进行解析,分为域名和文件路径,以图中为例:http://www.lab.glasscom.com/simple1.htm
- 请求协议:超文本传输协议
http
,Hypertext Transfer Protocol,请求协议还有文件传输ftp
、邮件mailto
、文件file
、新闻news
- 域名:
www.lab.glasscom.com
,域名也有层次结构,根据句点.
分割,分为根域和子域,通常根域被省略不写,完整的域名应该在最后再追加一个句点.
。
全世界根域服务器只有13个
- 文件路径:
/simple1.htm
是web服务器中的文件路径,这部分通常被称为URI(Uniform Resource Identifier统一资源标识符),也就是要访问的目标,这部分也可以是其他CGI程序(web服务器以外的程序) - 方法和端口号:这里有两个个隐藏的部分,首先是请求方法这里用的是
GET
方法,请求参数拼接在URL中,需要注意的是GET方法只能传递几百个字节大小的数据,还有一个经常用的是POST
方法,请求参数是以表单的形式上传,还有其他方法例如:HEAD、OPTIONS、PUT、DELETE、TRACE、CONNECT
;其次是域名和文件路径中间隐藏了端口号,web程序的端口号默认是80,邮件(mailto)是25.
每个部分解析完之后,就开始生成请求消息,请求消息中有很多头字段信息,大体分为通用头、请求头、响应头、实体头,详见HTTP Header官方介绍,需要注意的是HTTP1.0和1.1有部分差异。
请求之前会先根据域名通过解析器去DNS服务器查询web服务器的IP地址。
- IP:通常可以理解为计算机在网络中的地址,准确的说应该是计算机网卡的地址,就好像是一栋楼里的门牌号一个意思。
- web服务器:可以理解为存储网络数据的计算机程序
- DNS服务器:与web服务器一样,都是服务器的一种,只不过它是专门用来存储域名和IP地址关系表格的计算机,因为域名分层关系,所以一个域名通常按照层次关系被分开存储。
- 解析器:计算机中有标准的Socket库,提供相应的解析器供应用程序去查询IP地址,域名作为参数被封装成UDP消息,发往最近的DNS服务器(DNS服务器IP地址在接入网络时会自动被设置),因为域名被分开存储,每次查询都很耗时,所以DNS服务器会采用缓存技术提升效率,同时设置缓存数据的有效期。
查询到web服务器IP地址后,会委托协议栈发送请求,大致分为四个阶段。
- 创建套接字
- 将管道连接到服务器的套接字上(保存对方IP地址和端口号)。
- 收发数据。
- 断开连接并删除套接字。
描述符:应用程序用于识别套接字的机制
IP和端口号:客户端与服务器之间用于识别套接字的机制
请求发出后会收到响应消息,状态码如下:
状态码 | 含义 |
---|---|
1xx | 告知请求的处理进度和状况 |
2xx | 成功 |
3xx | 表示需要进一步操作 |
4xx | 客户端错误 |
5xx | 服务器错误 |
第二章 用电信号传输TCP/IP数据
上一章主要了解了通过解析器向DNS服务器获取IP,然后再封装请求消息的大致过程,本章主要介绍应用程序如何委托协议栈进行收发消息。
先了解一下协议栈大致结构(摘自书中图2.1):
第一章介绍了协议栈收发数据的四个阶段,接下来展开介绍它的工作原理。这四个阶段都是应用程序委托Socket库来完成的。
- 创建套接字(Socket)
当解析器拿到IP地址后,就会创建套接字Socket程序实例,系统为套接字分配内存空间,然后向里面里面记录IP地址、端口号、通信状态等控制信息,协议栈会参考这些记录的控制信息进行工作。
Windows中查看套接字命令:netstat -ano,a表示所有套接字,n表示IP地址和端口号,o显示使用该套接字的程序PID
终端中输入命令会显示如下内容
字段名 | 含义 |
---|---|
Proto | 显示协议名称,TCP或UDP |
Local Address | 本机IP地址和端口号,多个网卡显示多个IP地址和端口号。0.0.0.0表示没有绑定IP地址和端口号。 |
Foreign Address | 通信对象的IP地址和端口号,0.0.0.0表示没开始通信,没有绑定IP和端口号,UDP不绑定IP和端口号,显示*.* |
State | 通信状态,LISTENING等待对方链接,ESTABLISHED完成连接并正在进行数据通信的状态 |
- 套接字创建完成后,开始进行连接操作。
第一步是在TCP模块创建表示连接控制信息的头部,发起连接时TCP头部中控制位SYN
会设置为1,还有数据包序号
和窗口
大小等,通过TCP头部中的发送方和接收方端口号可以找到要连接的套接字。TCP模块头部创建好之后又会传递给并委托IP模块进行发送,然后网络包就会通过网络到达服务器。服务器在收到连接请求时,如果接受连接同样会设置SYN
(如果拒绝则不设置SYN
,而是RST
为1),同时会设置ACK
控制位为1,表示接收到相应的网络包,客户端在收到服务端的ACK
响应后,客户端还会再发一个ACK
响应包,表示收到了服务端的响应,这时连接操作基本完成,可以随时进行数据收发。(网络部分后边章节介绍)
这个连接确认过程就是面试经常被闻到的三次握手
TCP头部信息如下:
字段名称(TCP头部20字节) | 长度(比特) | 含义 |
---|---|---|
发送方端口号 | 16 | 发送网络包的程序的端口号 |
接收方端口号 | 16 | 网络包的接收方程序的端口号 |
序号(发送数据的顺序编号) | 32 | 发送方告知接收方该网络包发送的数据相当于所有发送数据的第几个字节 |
ACK号(接受数据的顺序编号) | 32 | 接收方告知发送方,接收方已经收到了数据的第几个字节。ACK,acknowledge |
数据偏移量 | 4 | 表示数据部分的起始位置,也可以认为是头部长度 |
保留 | 6 | 该字段保留,现在未使用 |
控制位 | 6 | 该字段中的每个比特分别表示以下通信控制含义: |
URG:紧急指针字段有效; | ||
ACK:接收数据序号字段有效,一般表示数据已被接收方收到; | ||
PSH:表示通过flush操作发送数据; | ||
RST:强制断开连接,用于异常中断情况; | ||
SYN:发送方和接收方相互确认序号,表示连接操作; | ||
FIN:表示断开连接 | ||
窗口 | 16 | 接收方告知发送方窗口大小(即无需等待确认可一起发送的数据量) |
校验和 | 16 | 用来校验是否出现错误 |
紧急指针 | 16 | 表示应紧急处理的数据位置 |
可选字段 | 可变长度 | 除了上面的固定头部字段外,还可以添加可选字段,但除了连接操作之外,很少使用可选字段。 |
- 连接完成,开始收发数据
在HTTP请求消息交给协议栈进行发送的时候,需要判断网络包的容量,因为Http请求消息通常数据量都比较大,而网络包的容量则有限。协议栈中用MTU(Maximum Transmission Unit)
表示网络包的最大长度,通常是1500字节,TCP和IP头部长度通常是40字节,MTU
减去TCP和IP头部长度就是能容纳的最大数据长度MSS(Maximum Segment Size)
。所以当HTTP请求的数据量超过这个限制便会被切割成MSS
大小的数据包进行传输。
数据被拆分之后便会对数据包进行发送,每个数据包都有自己的序号,但是这些数据包并不是按顺序发送的,而是随机发送的,因为顺序发送数据通信过程容易被预测,因而遭受攻击。
数据发送过程是通过ACK
号进行确认数据是否接收到,如果没有,则重新发送数据包,ACK
确认方式有两种:一来一回
和滑动窗口
,一来一回的方式是每接收到一个数据包就返回一个ACK
号,这样很影响性能,而且ACK
号是有等待时长限制的,虽然有动态调整机制,但是这样传输效率非常低;滑动窗口的方式则是多个数据同时发送,然后在缓冲区中对这些数据进行拼接处理,虽然提高了数据发送量,但是网卡对数据的处理能力也是有限的,数据不能有效被处理就会被抛弃,所以就通过窗口
来管理ACK,窗口
一般和接收方缓冲区大小一致,发送方会根据窗口
大小进行数据发送,这样便提升了数据的处理效率。另外ACK
和窗口
是同一个响应包,而且会等待一定时间再做出响应。原因是分开传送会造成信息不对等,还会对网络传输效率造成影响,另外等待这段时间缓冲区的数据处理很快会更新ACK
号,只要发送最后一个ACK
号就可以了,或者也有可能收到其它通知操作。 - 数据发送完毕,断开并删除套接字
断开操作可以由任何一方发起,假设首先是客户端发送FIN
信号,然后服务器会响应ACK
号,再由服务器发送FIN
信号,客户端再回应ACK
号。
当断开信号确认完毕之后,等待一定时间(几分钟)相应的套接字就会被删除。为何不马上删除,是为了防止相同的套接字连接操作再次被发起。
在断开才做发起时,可能会有数据读取操作,这时数据读取操作会被挂起。
以上主要介绍协议栈中TCP包的收发操作过程,接下来看一下IP与以太网的包收发操作。
- 网络包结构
MAC头部用于以太网协议,将网络包传输到下一个转发设备;IP头部用于IP协议,根据目标地址判断下一个IP转发设备位置。
刚开始理解这段很困难,感觉MAC头部和IP头部的用处是一样的,但为什么会同时存在,而且都有用到呢?书都看完了也没看到说明原因,这一点感觉很不好,网上查了一下也没有很细的说明,网友反应很多书里面似乎都没有太多相关说明,这里说一下个人理解。
IP地址是适用于虚拟网络。MAC地址用于物理网络。虚拟网络地址就好像快递包裹留下的手机号,但是最后快递是怎么到达最终目的地只有快递公司知道,而物理网络就好像的具体地址,例如XX省XX市……门牌号XX,快递公司运输快递的方式,水运、陆运、空运?具体什么方式,经过哪些地方由快递公司决定,不论经过什么地方,都会有相应的手机号和具体地址,似乎可以认为手机号就是用来查询具体地址的(老司机除外)。
这个例子可能不是很恰当,但需要知道的是先有的以太网协议,后有的IP协议,以太网只只用于以太网类型的物理网络传输数据,但是换其他类型的物理网络,以太网协议可能就不适用了,这显然不是开放性网络设计的初衷,所以才有了IP网络,用来兼容不同物理网络之间进行数据传输。
以太网在传输网络包会先区路由表中查询转发目标的IP地址,在查询IP地址之前先了解一下子网掩码
,子网掩码
表示网络号与主机号之间的边界值。1的部分表示网络号,0的部分表示主机号,IP地址主机号全0表示整个子网,全1表示向子网上所有设备发送包,即‘广播’。子网掩码和目标地址都是0表示默认网关,所以通过IP地址和子网掩码做与运算便可以计算出下一个转发目标,如果都不匹配则会转向默认网关。查询到IP地址后由TCP模块
开始生成IP头部
,IP头格式如下:
字段名称(IP头部20字节) | 长度(比特) | 含义 |
---|---|---|
版本号 | 4 | IP协议版本号目前使用的版本号是4 |
头部长度(IHL) | 4 | IP头部长度。可选字段可导致头部长度变化,因此这里需要指定头部的长度。 |
服务类型(ToS) | 8 | 表示包传输优先级。最初的协议规格里对这个参数规定很模糊,最近DiffServ规格从新定义了这个字段的用法 |
总长度 | 16 | 表示IP消息的总长度 |
ID号 | 16 | 用于识别包的编号,一般为包的序列号。如果一个包被IP分片,则所有分片都拥有ID |
标志(Flag) | 3 | 该字段有三个比特,其中两个比特有效分别代表是否允许分片,以及当前包是否为分片包 |
分片偏移量 | 13 | 表示当前包的内容为整个IP消息的第几个字节开始的内容。 |
生存时间(TTL) | 8 | 表示包的生存时间,这个是为了避免网络出现回环时一个包永远在网络中打转,没经过一个路由器,这个值就会减1,减到0时这个包就会被丢弃。 |
协议号 | 8 | 协议号表示协议的类型(以下均为16进制)TCP:06;UDP:11;ICMP:01 |
头部校验和 | 16 | 用于校验错误,现在已经不用 |
发送方IP地址 | 32 | 网络包发送方IP地址 |
接收方IP地址 | 32 | 网络包接收方IP地址 |
可选字段 | 可变长度 | 除了上面的头部字段外,还可以添加可选字段用于记录其他控制信息,但可选字段很少用 |
IP头部创建完,开始由IP模块
生成以太网用的MAC头部
字段名称(MAC头部14字节) | 长度(比特) | 含义 |
---|---|---|
接收方MAC地址 | 48 | 网络包接收方的MAC地址,在局域网中使用这一地址来传输网络包。 |
发送方MAC地址 | 48 | 网络包发送方的MAC地址,接收方通过它来判断是谁发送了这个包 |
以太类型 | 16 | 使用的协议类型。下面是一些常见类型,一般在TCP/IP通信中只使用0800和0806这两种。 |
0000-05DC:IEEE802.3 | ||
0800:IP协议 | ||
0806:ARP协议 | ||
86DD:IPv6 |
在生成MAC头部之前首先要知道目的地的MAC地址,这个MAC地址就是通过ARP在网络中发送广播,向附近所有计算机询问MAC地址,很显然这不是一个很高效的方法,所有这个地方也会有缓存机制,同时设置有效期,一般几分钟。
可以在Windows终端中输入
arp -a
命令,查询网络中的MAC地址。
MAC地址是网卡生产时被写入的,而且是全世界唯一,网卡中保存的MAC地址是由网卡驱动读取出来并保存在网卡的ROM中。
MAC头部生成之后,由MAC模块
会从缓冲区
中读取数据,还会再加3个控制数据,分别是:报头、起始帧分节符、FCS
。
网络包大概是这个样子:
报头和起始帧分节符(SFD) | MAC头部 | IP头部 | TCP头部 | 数据 | FCS |
---|
报头
用来测定时机,起始帧分节符(SFD)
用来确定帧的起始位置,FCS(帧校验序列)
是用来校验网络包是否因为噪声导致数据错误、紊乱
FCS校验算法类似CRC(循环冗余校验)算法
噪声:主要是电子设备或线路本身所产生的电磁波干扰。
MAC模块
生成通用信号(时钟信号+数据信号),由PHY(MAU)模块
转换成可以在网线中传输的格式,并通过网线传输出去,传输到服务器。以上大致过程如下图:
当服务器发出响应包时,客户端IP模块
会对响应包接收方IP地址进行校验,如果不是本机IP地址,则会发送一个ICMP消息
,否则接收此响应包并交给TCP模块
进行后面的处理。
ICMP消息
消息 | 类型 | 含义 |
---|---|---|
Echo reply | 0 | 响应Echo消息 |
Destination unreachable | 3 | 出于某些原因没有到达目的地而是被丢弃,则通过此消息通知发送方。可能的原因包括目标IP地址在路由表中不存在;目标端口号不存在对应的套接字;需要分片,但分片被禁用 |
Source quench | 4 | 当发送的包数量超过路由器的转发能力时,超过的部分会被丢弃,这时会通过这一消息通知发送方。但是,并不是说遇到这种情况一定会发送这一消息。当路由器的性能不足时,可能连这条消息都不发送,就直接把多余的包丢弃了。当发送方接收到这条消息时,必须降低发送速率 |
Redirect | 5 | 当查询路由表后判断该包的入口和出口为同一个网络接口时,则表示这个包不需要该路由器转发,可以由发送方直接发送给下一个路由器。遇到这种情况时,路由器会发送这条消息,给出下一个路由器的IP地址,指示发送方直接发送过去 |
Echo | 8 | ping命令发送的消息。收到这条消息的设备需返回一个Echo reply消息,以便确认通信对象是否存在 |
Time exceeded | 11 | 由于超过了IP头部中的TTL字段表示的存活时间而被路由器丢弃,此时路由器会向发送方发送这条消息 |
Parameter problem | 12 | 由于IP头部字段存在错误而被丢弃,此时会向发送方发送这条消息 |
以上操作过程都是基于TCP协议,虽然TCP协议的数据传输非常可靠,但是过程过于复杂,效率不高,
因此有些情况会采用UDP协议,像DNS解析用的就是UDP协议,还有音视频数据传输也是用的UDP。先来看一下UDP协议头部信息:
字段名称(UDP头部8字节) | 长度(比特) | 含义 |
---|---|---|
发送方端口号 | 16 | 网络包发送方端口号 |
接收方端口号 | 16 | 网络包接收方端口号 |
数据长度 | 16 | UDP头部后面的数据长度 |
校验和 | 16 | 用于校验错误 |
由此可见UDP协议非常简单,相比TCP协议中头部控制信息要少很多,UDP协议的功能非常少,基本就只负责发送包,协议栈并不知道是否发生错误,出错时应用程序不能收到接收方的回复,所有由应用程序决定是否重新发包,而TCP则一直监听包的送达状态。所以不需要重发数据
或者控制用的短数据交换操作
用UDP协议
效率更高。
UDP数据长度 = IP包最大65535 - IP头部20 - UDP头部8 = 65507字节。
第三章 从网线到网络设备
- 双绞线
网卡中的PHY(MAU)模块负责将包转换成电信号,信号通过RJ-45接口进入双绞线。
电信号是正负变化的电压,电信号在网线中传输会出现衰减,线越长衰减越多,高频信号会产生电磁波也会消耗一部分能量。
然而局域网中的双绞线的拧麻花一样的设计就是为了抑制噪声的影响,而且每对信号线的缠绕间隔都不一样。
双绞线种类有:五类、超五类、六类、超六类、七类,每种线都有不同的信号传输速率和频率。
PHY(MAU):以太网由多种派生方式,每种方式中信号收发装置的名称都不一样。100Mbit/s以上的叫PHY(物理层装置),以前低俗方式中叫MAU(介质连接单元)。
噪声:是电子设备发出的电池波,经过金属线(网线)就会沿电磁波传播的右旋方向产生电流,从而扰乱电信号,“双绞线”的缠绕设计就是为了让线缆本身产生逆向电池波,从而抵消周围电池波的影响。
- 集线器
电信号会被送到集线器,然后被原封不动的广播的整个网络中,接收信号的设备(交换机、路由器、服务器)先根据MAC地址检测是否是自己的包,然后会对信号进行FCS校验,不匹配就直接丢弃。(不用担心出错,TCP模块检测到无响应的包会重新发包)
集线器有MDI/MDI-X两种接口,MDI表示直连,MDI-X表示交叉连接。 - 交换机
交换机的输入的端和输出端都能连接,信号线排成网格,每个交叉点都有一个电子开关,控制信号流向。
交换机也是直接转发包到目的地,它类似与计算机的网卡,但是它没有MAC地址,所以在接收包时没有MAC地址校验,直接把所有包都放到缓冲区,然后通过包的MAC地址发送到目的地。(交换机中维护着网络中设备的MAC地址表) - 全双工与半双工
全双工是交换机的工作方式,也就是可以同时发送和接受信号,而集线器不具备这样的功能,只支持半双工模式,也就是网络中有信号时要等待信号传输完毕再发送信号。因此全双工模式要比半双工模式效率更高。但是网络中并不是所有节点都支持全双工模式,比如集线器,传输速率也不同,这时在设备接入网络时就会发送脉冲信号
确认双方的工作模式以及传输速率 - 路由器
网络包经过交换机后会到达路由器,路由器可以支持多个端口:ADSL、FTTH、无线局域网、以太网等,每个端口都有自己的MAC地址和IP地址,同时根据MAC地址判断包是否接收。路由器的转发模块维护一张路由表,然后根据IP地址判断转发目标(忽略主机号,只匹配网络号),如果找不到路由地址,则选择默认路由地址0.0.0.0
。路由器的发送操作与计算机相同,也是通过ARP寻址(路由器中也有ARP缓存),在包的转发过程中,由于网络中各个端口的口径(最大包长度)不同,有可能会触发分片功能,来适应网络中输入输出端口的口径,如果不能分片(发送方程序不允许或者已经分片过的包)直接丢弃,并发送ICMP消息。
路由器的附加功能:地址转换
、包过滤
。地址转换可以使得私有地址计算机访问外网,也就是互联网,或者从外网可以访问内网。转换的原理就是将私有地址和端口转换成路由器的公有地址和端口,然后再发送包。包过滤功能类似防火墙设备或软件,原理是根据MAC头部、IP头部、TCP头部的相关控制信息进行过滤。
第四章 通过接入网进入互联网内部
- 接入网
连接互联网与家庭、公司网络的线路,一般有:ADSL、FTTH、CATV、电话线、ISDN等,公司还可能有专线。 - ADSL
ADSL(Asymmetric Digital Subscriber Line)接入网是通过ADSL Modem(调制解调器,俗称‘猫’)连接电话线接入互联网的。
互联网接入路由器会在网络包前面加上MAC头部、PPPoE头部、PPP头部总共3种头部,然后发送给ADSL Modem(PPPoE方式)。
ADSL Modem将包拆分成ATM信元,并将信元通过正交振幅调制
成电信号发送给分离器。调制的原因是原始的方波信号容易失真,高频信号发出的噪声更大。
ADSL中数据传输的上行速率和下行速率是不同的,原因是ADSL通过不同频率的合成来提高效率,根据噪声条件的不同,每个波表示的比特数是可变的。
信号进入分离器会与电话信号混合在一起从电话线中传出,分离器的作用就是分离ADSL信号和电话信号,保证电话通话声音不被ADSL信号干扰。
信号从分离器会到达DSLAM,然后再到BAS,最后到达互联网。
PPP:Point to Point Protocol。点对点协议。它是电话线、ISDN等通信线路使用的一种协议,集成了用户认证、配置下发、数据压缩、加密等各种功能。
PPPoE:PPP消息装入以太网包进行传输的方式。
DSLAM:数字用户线接入复用设备。可以理解为多个ADSL Modem的集合。可以将电信号还原成信元,或者直接把网络包还原出ADSL信号。
BAS:宽带接入服务器,也是一种路由器。可以将ATM信元还原成原始包(从PPP头部取出,追加上隧道专用头部)。
- FTTH
FTTH是用光纤代替ADSL将用户接入路由器和运营商的BAS连接起来的接入方式。接入方式有两种:一种是直连
,直接通过光纤接入附近的电话局;另一种是分路
,用户端安装ONU
设备,然后接入附近的分光器,再由分光器接入电话局。
光纤是一种双层结构的纤维状透明材质(玻璃和塑料)构成,通过纤芯传到光信号来传输数字信息,亮表示1,暗表示0。光纤分多模(50μm或62.5μm)和单模(8~10μm),多模可以传输多条光线,单模只能传输一条光线。因为光线在传输过程中会进行多次折射,多模光纤中有多条光线且折射角度不同,所以传输距离越长信号失真越大,而单模光纤中只有一条光线,所以传输距离的影响很小,失真不会很大。
ONU:Optical Network Unit,光网络单元。用于电信号转换成光信号,同时与电话机的
OLT
设备配合避免产生碰撞。
OLT:Optical Line Terminal,光线路终端。
一对一连接的端口可以不分配IP地址,这种方式称为无编号。
- 运营商
网络包通过接入点后,到达运营商POP
的路由器。之后所有网络包都会集中到NOC
。而运营商之间通过路由器的BGP
机制实现信息共享,进而达成互联。在实际链路中各个运营商是通过IX
设备实现互联的。
POP:Point of Presense,接入点。
NOC:Network Operation Center。网络运行中心。(POP的放大版)
BGP:Border GateWay Protocol。边界网关协议。
IX:Internet eXchange。互联网交换中心。核心是具有大量高速以太网端口的二层交换机。
第五章 服务器端的局域网中有什么玄机
- web服务器部署
部署在公司内网:接入外网之前需要建立防火墙。
部署在运营商的数据中心或直接租用运营商服务器:抗灾能力强。(租用服务器难道指的是云服务?) - 防火墙
防火墙可以分为包过滤、应用层网关、电路层网关等方式。
包过滤是通过包中各个头部控制信息进行过滤,例如端口号限制应用程序访问、TCP的控制位判断连接方向。 - 负载均衡
DNS服务器自动轮询分配。优点是配置简单,缺点是不能跨页面访问。
负载均衡器。也是一台web服务器,用于分配网络请求,优点是可以判断请求相关性,缺点是判断逻辑复杂。
缓存服务器。按功能分类分担负载,将相对静态的数据进行缓存。优点是速度快,缺点是CGI程序生成的动态数据不易缓存,且缓存周期管理复杂。
代理:不是转发消息,而是接收请求消息后,伪装成原始客户端向web服务器发起请求。
正向代理:配置在用户端,例如在浏览器中设置代理服务器。
反向代理:配置在服务器端,例如上面说的缓存服务器。
透明代理:集合正向代理和反向代理的优点。对请求消息进行拦截。
缓存服务器转发给web服务器的消息会添加一个
Via
字段,用与告知web服务器这是一条转发消息,如果缓存服务器中由数据还会添加一个If-Modified-Since
字段,表示上次数据缓存时间。可以通过配置不添加字段。
- 内容分发服务
面向用户,选择最近主要运营商设置缓存服务器。一种方法是利用DNS服务器和路由表信息选择最近缓存服务器,另一种方法是通过HTTP请求消息中Location字段进行重定向。
第六章 请求到达Web服务器,响应返回浏览器
- 服务器端收发操作
服务器程序启动后会创建套接字进入等待连接状态。
服务器接收网络包,由网卡的MAC模块将电信号还原出数字信息,校验FCS和MAC地址并放入缓冲区。
再根据MAC头部判断协议类型交给协议栈处理,协议栈中IP模块检查IP头部判断是否是自己的、网络包是否经过分片、包转交给TCP或UDP模块。
如果是发起连接,TCP模块会确认SYN控制位,检查接收方端口号,为相应的等待连接套接字生成副本,记录发送方IP地址和端口号等信息。
TCP模块发送方的IP地址和端口号、接收方的IP地址和端口号找到相应的套接字,将数据库拼接起来并保存到缓冲区,向客户端返回ACK。(由于多个客户端的连接操作会使得服务器生成多个套接字副本并建立连接,所以TCP模块仅凭接收方IP地址和端口号是无法识别哪个套接字与哪个客户端进行的通信)
如果数据收发完成调用了socket的close,TCP模块会生成一个控制位FIN为1的TCP头部,返回一个ACK信号。 - 浏览器显示内容
服务器返回信息后,浏览器会根据响应消息中Content-Type字段值进行判断具体消息内容类型,主要由文字、图像、声音、视频等多种类型。 - Web服务器的访问控制
客户端IP地址
客户端域名
用户名和密码
总结
此处省略一万字……