导图社区 户根勤:网络是怎样连接的思维导图
这是一篇关于网络是怎样连接的结构思维导图。框架清晰,内容全面。对网络研究感兴趣的小伙伴可以看看哟。
编辑于2022-11-15 09:17:00 广东网络(OSI七层模型)
名词解释
OSI
Open System Interconnection Reference Model, 开放式系统互联通信参考模型
一种概念模型,由国际标准化组织提出,一个试图使各种计算机在世界范围内互连为网络的标准框架
URI
Uniform Resource Identifier, 统一资源标识符
URI的内容是一个存放网页的数据的文件名或者是一个 CGI 程序的文件名,例如“/dir1/file1.html”“/dir1/program1.cgi”等
也可以直接使用“http:”开头的URL来作为URI,加上html、cgi这些访问目标统称为URI
URL
Uniform Resource Locator, 统一资源定位符
FTP
File Transfer Protocol, 文件传送协议
域名
Domain Name
就是像 www.glasscom.com 这样以句点(.)分隔的名称
由于IP地址具有不方便记忆并且不能显示地址组织的名称和性质等缺点,人们设计出了域名,并通过网域名称系统(DNS,Domain Name System)来将域名和IP地址相互映射,使人更方便地访问互联网,而不用去记住能够被机器直接读取的IP地址数串
端口
用来识别要连接的服务器程序的编码
不同的服务器程序会使用不同的编码,如Web是80,邮件是25
端口数是一组16位二进制,故共有65536个端口,但0端口是 TCP/IP 网络中的保留端口,这意味着不应在 TCP 或 UDP 消息中使用它。故可用端口有65535个
HTTP
Hypertext Transfer Protocol, 超文本传送协议
CGI
Common Gateway Interface, 公共网关接口
Web服务器程序调用其他程序的规则规范
HTML
Hyper Text Markup Language, 超文本标记语言
用来描述网页的一种标记语言,包括一系列标签.通过这些标签可以将网络上的文档格式统一,使分散的Internet资源连接为一个逻辑整体。HTML文本是由HTML命令组成的描述性文本,HTML命令可以说明文字,图形、动画、声音、表格、链接等。
DNS
Domain Name System, 域名服务系统
可将服务器名称和IP地址进行关联,还可以将邮件地址和邮件服务器进行关联,以及为各种信息关联相应的名称
协议栈
操作系统内部的网络控制软件,也叫“协议驱动”“TCP/IP驱动”等
Socket
用于调用网络功能的程序组件集合
socket
Socket库中的程序组件
套接字
数据管道的两端接口
都是套接字
描述符
用于识别某个特定的套接字
当创建套接字后,我们就可以使用这个套接字来执行收发数据的操作了。这时,只要我们出示描述符,协议栈就能够判断出我们希望用哪一个套接字来连接或者收发数据了。
HOST
主机
TCP
Transmission Control Protocol, 传输控制协议
一种面向连接的、可靠的、基于字节流的传输层通信协议
UDP
User Datagram Protocol, 用户数据报协议
为应用程序提供了一种无需建立连接就可以发送封装的 IP 数据包的方法
数据很短,用一个包就能装得下的情况
MX
Mail eXchange,邮件交换。
缓存
指的是将使用过的数据存放在离使用该数据的地方较近的高速存储装置中,以便提高后续访问速度的技术
WAN
Wide Area Network, 广域网
LAN
Local Area Network, 局域网
网关
Gateway, 在 TCP/IP 的世界里就是路由器的意思
不同网段之间的通信,要借助网关。这里的网关就是指路由器了
路由器可以做网关,防火墙可以做网关(介于局域网和互联网),三层交换机可以做网关,一台普通pc可以做网关,甚至一个智能手机(当热点)也可以做网关。
网关的作用就是帮助两个不能直接互通的网络,进行数据转发的。
网络包/数据包
网络中的数据会被切分成几十字节到几千字节的小块,每一个小数据块被称为一个包
MAC
Media Access Control, 媒体访问控制
符合IEEE规格的局域网设备都使用同一格式的地址,这种地址被称为MAC地址,也叫硬件地址,局域网地址,以太网地址,物理地址
SYN
Synchronize Sequence Numbers, 同步序列编号
TCP/IP建立连接时使用的握手信号
通过告知初始序号使通信双方保持步调一致,以便完成后续的数据收发检查
ACK
Acknowledge character, 确认字符
在数据通信中,接收站发给发送站的一种传输类控制字符。表示发来的数据已确认接收无误
双方在通信时必须确认网络包是否已经送达,而设置ACK bit 就是用来进行这一确认
相当于是一封回执确认单
MTU
Maximum Transmission Unit, 最大传输单元
MSS
Maximum Segment Size, 最大分段大小
SFD
Start Frame Delimiter, 起始帧分界符
FCS
Frame Check Sequence, 帧校验序列
ARP
Address Resolution Protocol, 地址解析协议
以太网
Ethernet, 以太网是一种为多台计算机能够彼此自由和廉价地相互通信而设计的通信技术
三个基本性质
将包发送到 MAC 头部的接收方 MAC 地址代表的目的地
用发送方 MAC 地址识别发送方
用以太类型识别包的内容
原型是半双工模式,故会发生信号碰撞
以太网是一种总线型局域网
是当今现有局域网采用的最通用的通信协议标准(是局域网的一种,为总线型局域网)
以太网的设计本来就是将包发送到整个网络的,然后只有相应的接收者才接收包,而其他设备则会忽略这个包
全双工模式
以太网规范中规定了在网络中有信号时要等该信号结束后再发送信号,因此发送和接收还是无法同时进行。于是,人们对以太网规范进行了修订,增加了一个无论网络中有没有信号都可以发送信号的工作模式,同时规定在这一工作模式下停用碰撞检测。这种工作模式就是全双工模式。在全双工模式下,无需等待其他信号结束就可以发送信号,因此它比半双工模式速度要快
网卡与网线信号收发模块
MAU
Medium Attachment Unit, 介质连接单元
PHY
Physical Layer Device, 物理层装置
在速率为 100 Mbit/s 以上的以太网中都叫 PHY
MDI
Media Dependent Interface, 媒体相关接口
MDI-X 是 MDI-Crossover 的缩写
对 RJ-45 接口和信号收发模块进行直连接线, 而 MDI-X 则是交叉接线
集线器的接口一般都是 MDI-X 模式,要将两台集线器相连时,就需要将其中一台改成 MDI 模式
交叉网线,就是一种将发送和接收信号线反过来接的网线。总之,接收与发送要相连
一根交叉网线不用集线器就可以连接两台计算机
广播地址
broadcast address
是一种特殊的地址,将广播地址设为接收方地址时,包会发送到网络中所有的设备。MAC 地址中的 FF:FF:FF:FF:FF:FF和 IP 地址中的 255.255.255.255 都是广播地址
HUB
多端口转发器
集线器,repeater hub
路由器,switching hub
TTL
Time To Live, 生存时间
表示包的有效期,包每经过一个路由器的转发,这个值就会减 1,当这个值变成 0 时,就表示超过了有效期,这个包就会被丢弃。这个机制是为了防止包在一个地方陷入死循环。如果路由表中的转发目标都配置正确,应该不会出现这样的情况,但如果其中的信息有问题,或者由于设备故障等原因切换到备用路由时导致暂时性的路由混乱,就会出现这样的情况
ICMP
Internet Control Message Protocol, Internet控制报文协议
它是TCP/IP协议簇的一个子协议,用于在IP主机、路由器之间传递控制消息
接入网
指连接互联网与家庭、公司网络的通信线路
ADSL
Asymmetric Digital Subscriber Line, 不对称数字用户线
它是一种利用架设在电线杆上的金属电话线来进行高速通信的技术,它的上行方向(用户到互联网)和下行方向(互联网到用户)的通信速率是不对称的。
ISDN
Integrated Services Digital Network, 综合业务数字网
一个数字电话网络国际标准,是一种典型的电路交换网络系统
ISDN使用的频率较低,部分频率占用电话波段,速度慢,单线达到128k后电话无法使用,但传输距离比较远。ADSL使用的是高频,速度快,电话可以正常使用,信号容易受到干扰,每隔几公里必须设信号加强设备
FTTH
Fiber To The Home, 光纤到户。指的是将光纤接入家庭的意思
CATV
Community Antenna Television, 社区公共电视天线系统,国内一般指广电有线电视系统,或者广电有线电视网络
ISP
Internet Service Provider, 网络业务提供商
国内指中国联通、中国电信、中国广电、中国移动四大运营商
电话局
指的就是以上四家电信运营商
BAS
Broadband Access Server, 宽带接入服务器。它也是一种路由器
PPP
Point-to-Point Protocol, 点到点协议
它是电话线、ISDN 等通信线路所使用的一种协议,集成了用户认证、配置下发、数据压缩、加密等各种功能
PPPoE
Point-to-Point Protocol Over Ethernet, 以太网上的点对点协议,是将点对点协议(PPP)封装在以太网(Ethernet)框架中的一种网络隧道协议
ATM
Asynchronous Transfer Mode, 异步传输
它是在以电话线为载体的传统电话技术基础上扩展出来的一种通信方式。它的数据传输是以“信元”为单位来进行的,这和以包为单位传输数据的 TCP/IP 很像,但这种方式并不适用于计算机通信。
IDF
Intermediate Distribution Frame, 中间配线盘
MDF
Main Distribution Frame, 主配线盘(总配线架)
DSLAM
DSL Access Multiplexer,数字用户线接入复用设备
它是一种电话局用的多路 ADSL Modem,可以理解为将多个 ADSL Modem 整合在一个外壳里的设备
ONU
Optical Network Unit,光网络单元
它和光纤收发器一样,可以将电信号转换成光信号,除此之外还具有和电话局的 OLT 相互配合避免信号碰撞的功能。这个设备有时也被叫作终端盒,因此终端盒这个词本身是对光纤收发器和 ONU 等光纤终端设备的统称
OLT
Optical Line Terminal,光线路终端
RADIUS
Remote Authentication Dial-in User Service,远程认证拨号用户服务
RAS
Remote Access Server,远程访问服务器
DHCP
Dynamic Host Configuration Protocol,动态主机配置协议
HDLC
High-level Data Link Control,高级数据联接控制
HDLC 协议原本是为在专线中传输网络包而设计的,拨号接入方式对这一规格进行了一些修正
CHAP
Challenge Handshake Authentication Protocol,挑战握手认证协议
PAP
Password Authentication Protocol,密码验证协议
POP
Point of Presense,中文一般叫作“接入点”
对于互联网服务提供商(ISP)来说,POP是一个将互联网从一个地方接到其他地方的入网点。入网点必须有一个唯一的互联网协议(IP)地址
专线
是固定连接线路,不需要进行身份认证,参数是根据传真、书面等方式下发后进行手动配置的,因此也不需要 PPP、DHCP 等机制。其实这就是最古老的互联网接入方式
NOC
Network Operation Center,网络运行中心
BGP
Border Gateway Protocol,边界网关协议
互联网内部使用 BGP 机制在运营商之间交换路由信息
IX
Internet eXchange,中文一般叫作“互联网交换中心
CDN
Content Delivery Network 或 Content Distribution Network, 内容分发服务
提供这种服务的厂商称为 CDSP, Content Delivery Service Provider, 内容分发服务运营商
多任务
操作系统提供的一种功能,可以让多个任务(程序)同时运行。实际上,一个处理器在某一个瞬间只能运行一个任务,但通过短时间内在不同的任务间切换,看起来就好像是同时运行多个任务一样。有些操作系统称之为“多进程”
多任务和多线程
多任务和多线程的区别在于任务和线程的区别。在操作系统内部,任务是作为单独的程序来对待的,而线程则是一个程序中的一部分
浏览器
URL的格式
开头文字表示浏览器应当使用的访问方法
开头的“http:”“ftp:”“file:”“mailto:”这些单词都是访问方法,访问Web服务器使用HTTP协议;访问FTP服务器使用FTP协议……
工作过程
首先解析URL,从而生成发送给Web服务器的请求信息。以HTTP协议的URL为例
该URL就可以访问到这个服务器下的file1.html文件
也可以省略文件名,根据事前在服务器上设置好的文件名省略时要访问的默认文件名,一般默认为根目录/下的index.html或default.html
HTTP协议
定义了客户端和服务器之间交互的消息内容和步骤。通俗点说就是客户机对服务器发送请求信息:请求服务器“对什么”“进行什么操作”
“对什么”部分称为URI
一般来说URI的内容是一个存放网页数据的文件名或是一个CGI程序的文件名,例如 .html 或者 .cgi
“进行什么操作”部分称为方法
例如读取URI表示的数据、将客户端输入的数据发送给URI表示的程序等
使用什么方法由场景确定
GET
获取 URI 指定的信息
POST
从客户端向服务器发送数据
PUT
替换URI指定的服务器上的文件
HEAD
获取文件最后更新时间等属性信息
OPTION
用于通知或查询通信选项
TRACE
在使用代理的环境中检查改写请求的情况
DELETE
删除URI指定的服务器上的文件
CONNECT
使用代理传输加密消息时使用的方法
收到HTTP请求消息之后,Web 服务器会对其中的内容进行解析,通过URI和方法来判断“对什么”“进行怎样的操作”,并根据这些要求来完成自己的工作,然后将结果存放在响应消息中。在响应消息的开头有一个状态码,它用来表示操作的执行结果是成功还是发生了错误。当我们访问 Web 服务器时,遇到找不到的文件就会显示出 404 Not Found 的错误信息,其实这就是状态码。状态码后面就是头字段和网页数据。响应消息会被发送回客户端,客户端收到之后,浏览器会从消息中读出所需的数据并显示在屏幕上。到这里,HTTP 的整个工作就完成了。
HTTP请求和响应消息长啥样?
HTTP消息有严格的格式要求,是一种数字消息
请求消息
请求行
重点是开头的方法,告诉web服务器它应该进行怎样的操作
例:GET /sample1.htm HTTP/1.1
消息头
用于表示请求的附加信息
尽管通过请求行我们就可以大致理解请求的内容,但有些情况下还需要一些额外的详细信息,而消息头的功能就是用来存放这些信息。消息头的规格中定义了很多项目,如日期、客户端支持的数据类型、语言、压缩格式、客户端和服务器的软件名称和版本、数据有效期和最后更新时间等
HTTP主要的头字段
例:
消息体
包含客户端向服务器发送的数据
在使用 GET 方法的情况下,仅凭方法和 URI,Web 服务器就能够判断需要进行怎样的操作,因此消息体中不需要填写任何数据。
请求消息发送出去后,web服务器会返回响应消息
响应消息
第一行为状态码和响应短语
状态码
1xx
告知请求的处理进度和情况
2xx
成功
3xx
表示需要进一步操作
4xx
客户端错误
5xx
服务器错误
用来解释状态码的短语
消息头
消息体
服务器向客户端发送的数据,例如从文件中读取的数据,或者CGI应用程序输出的数据,消息体的内容是二进制数据
例如一个返回图片的响应消息
TCP/IP
互联网和公司内部的局域网都是基于 TCP/IP 的思路来设计的,就是由一些小的子网,通过路由器连接起来组成一个更大的网络
消息发送的过程:①首先经过子网中的集线器到路由器,转发到距离发送者最近的路由器上。②接下来,路由器会根据消息的目的地判断下一个路由器的位置,然后将消息发送到下一个路由器,即消息再次经过子网内的集线器被转发到下一个路由器。前面的过程不断重复,最终消息就被传送到了目的地
子网
用集线器连接几台计算机设备的一个单位
一种对包进行转发的设备,分为中继式集线器和交换式集线器两种
路由器
一些家用路由器中已经内置了集线器功能,因此大家可以理解为这种路由器内部同时包含路由器和集线器两种设备,它们在里面已经连接起来了
凡是通过集线器连接起来的所有设备都属于同一个子网
集线器与路由器的区别
路由器根据目标地址判断下一个路由器的位置
路由器是按照 IP 规则传输包的设备
IP 协议根据目标地址判断下一个 IP 转发设备的位置
IP头部
集线器在子网中将网络包传输到下一个路由
集线器是按照以太网规则传输包的设备
子网中的以太网协议将包传输到下一个转发设备
MAC头部
网络
子网再通过路由器连接起来就形成一个网络
网络中的每台计算机设备都会有个地址,称为ip地址(32位)
ip地址映射到现实中就是xx号xx室,层次化结构
xx号对应的号码称为网络号
xx室对应的号码称为主机号
ip地址蕴含的信息包括网络号和主机号
十进制表示:xxx.xxx.xxx.xxx
网络号和主机号连起来总共是32bit:xxxxxxxx.xxxxxxxx.xxxxxxxx.xxxxxxxx
由子网掩码来区分ip地址的内部结构
子网掩码也是32bit,为1的部分表示网络号,为0的部分表示主机号
表示方法
24表子网掩码1的个数, 例如11111111 11111111 11111111,即255 255 255
主机号数值的两种特殊情况
广播:向子网上所有设备发送包
源 IP 与目的 IP 分别同这个子网掩码进行与运算,相等则是在一个子网,不相等就是在不同子网 比如 A电脑:192.168.0.1 & 255.255.255.0 = 192.168.0.0 B电脑:192.168.0.2 & 255.255.255.0 = 192.168.0.0 C电脑:192.168.1.1 & 255.255.255.0 = 192.168.1.0 D电脑:192.168.1.2 & 255.255.255.0 = 192.168.1.0 那么 A 与 B 在同一个子网,C 与 D 在同一个子网,但是 A 与 C 就不在同一个子网,与 D 也不在同一个子网,以此类推
DNS
DNS机制:让人来使用名称,让路由器来使用IP地 址。为了填补两者之间的障碍,需要有一个机制能够通过名称来查询IP地址,或者通过IP地址来查询名称,这样就能够在人和机器双方都不做出牺牲的前提下完美地解决问题。这个机制就是 DNS。
也就是向DNS服务器查询某个域名的ip地址
DNS服务器在某个地方的机房,而对应DNS客户端就在我们电脑上
DNS客户端部分称为DNS解析器,或简称解析器
通过DNS查询IP地址的操作称为域名解析,负责进行解析操作的就叫解析器
解析器实际上是一段程序,包含在操作系统的socket库中
库就是一堆通用程序组件的集合,Socket库中包含的程序组件可以让其他的应用程序调用操作系统的网络功能,解析器就是这个库中的其中一种程序组件
使用解析器,即调用gethostbyname程序
通过DNS获取IP的内部原理:
调用解析器后,解析器会向DNS服务器发送查询信息,然后DNS服务器会返回响应信息,包含查询到的IP地址
向DNS服务器发送消息也需要事前知道DNS服务器的IP地址,这一地址是作为TCP/IP的设置方法事先设置好了,不需要再去查询
DNS服务器中所有信息都是按照域名以分层次的结构来保存的。用句号分隔,比如 www.lab.glasscom.com,这里的句点代表了不同层次之间的界限。域名中越靠右的层级越高,一个层级称为一个域
以公司组织类比: www.lab.glasscom.com→com域:事业集团 glasscom域:部 lab域:科 的 www
所有DNS服务器都存了根域服务器地址,查询时DNS客户端会从最近的DNS服务器开始查,也就是客户端的TCP/IP设置中填写的DNS服务器地址。然后到根域服务器,然后再根据域名从右往左一层一层找到最后存了IP地址的DNS服务器
协议栈
内部结构
应用程序
浏览器、电子邮件客户端、Web 服务器、电子邮件服务器等程序,它们会将收发数据等工作委派给下层的部分来完成
Socket库
包括解析器,用来实现DNS查询
操作系统内部
协议栈
上半部分
负责用TCP协议收发数据操作
像浏览器、邮件等一般的应用程序都是使用TCP
负责用UDP协议收发数据操作
像DNS查询等收发较短的控制数据时使用UDP
下半部分
用IP协议控制网络包收发操作
ICMP协议
用于告知网络包传送过程中产生的错误以及各种控制消息
ARP协议
用于根据IP地址查询相应的以太网MAC地址
IP地址和MAC地址的最大区别:IP地址划分时基于地理区域,换了不同地方,即便是同一台硬件设备,IP地址一定不一样,可以理解为和地理位置有关;而MAC地址不依赖于地理区域,换了不同地方,只要还是同一台硬件设备,MAC地址就不会变,它只和硬件设备有关
真正生效的是网卡驱动进行初始化时在 MAC 模块中设置的那个 MAC 地址
MAC相当于是身份证,IP相当于住址。人在哪里居住IP就在哪里,所以IP是会变的。但收件人ID是不会变的。
网卡驱动
负责控制网卡硬件
网卡
负责完成实际的收发操作,对网线中的信号执行发送和接收的操作
网络硬件可能是插在计算机主板上的板卡,也可能是笔记本电脑上的 PCMCIA 卡,或者是计算机主板上集成的芯片,不同形态的硬件名字也不一样,但统称为网卡
转发设备
局域网的结构
网线
双绞线
内部是双绞线结构,“双绞”的意思就是以两根信号线为一组缠绕在一起,这种拧麻花一样的设计是为了抑制噪声的影响
噪声的产生原因:电磁波
外源性噪声:电机、荧光灯、CRT 显示器等设备泄漏出来的电磁波
消除原理:将信号线缠绕在一起,信号线就变成了螺旋形,其中两根信号线中产生的噪声电流方向就会相反,从而使得噪声电流相互抵消,噪声就得到了抑制
两根信号线之间
内源性噪声:从网线中相邻的信号线泄漏出来的。由于传输的信号本身就是一种电流,当电流流过时就会向周围发出电磁波,这些电磁波对于其他信号线来说就成了噪声。这种内部产生的噪声称为串扰(crosstalk)
消除原理:在一根网线中,每一对信号线的扭绞间隔(节距)都有一定的差异,这使得在某些地方正信号线距离近,另一些地方则是负信号线距离近。由于正负信号线产生的噪声影响是相反的,所以两者就会相互抵消。从网线整体来看,正负的分布保持平衡,自然就会削弱噪声的影响
两对信号线之间
网线的性能是以“类”来区分的
双绞线种类
同轴电缆
光纤电缆
网线接口
也称网卡接口,常见的为 RJ-45,用于双绞线的连接,俗称水晶头
网卡与集线器之间的连接剖面
根据IEEE802.3标准要求,集线设备和网卡端口的PHY芯片只保证驱动100米的铜缆,对更远的传输距离则不作保证
集线器 Hub
中继电路:将输入的信号广播到集线器的所有网线接口上。当多个端口同时输入信号时,信号就会混合在一起输出到所有端口,这就产生了信号碰撞
接下来信号从所有接口流出到达连接在集线器上的所有设备,这些设备在收到信号之后会通过 MAC 头部中的接收方 MAC 地址判断是不是发给自己的,如果是发给自己的就接受,否则就忽略。这样,网络包就能够到达指定 MAC 地址的接收方了。这一过程适用于客户端、服务器、路由器等所有具有收发以太网网络包功能的设备
线路中只允许单向传输,也就是半双工模式。因为集线器没有缓冲区,在广播的时候,如果还接收信号,就会造成信号碰撞→←
工作在物理层
交换机 Switch
根据 MAC 地址表查找接收方 MAC 地址对应的输出端口。属于以太网部分[MAC↔MAC]
工作原理
信号到达网线接口,并由 PHY(MAU)模块进行接收,这一部分和集线器的接收方式是相同的
PHY(MAU)模块会将网线中的信号转换为通用格式,然后传递给 MAC 模块。MAC 模块将信号转换为数字信息,然后通过包末尾的 FCS 校验错误,如果没有问题则存放到缓冲区中。可以认为每个交换机网线接口后面都是一块网卡,每个端口相当于是计算机上的一块网卡
但交换机的工作方式和网卡不同
网卡本身具有 MAC 地址,核对接收包的 MAC 头部判断是否自为自己的包
交换机端口不具有 MAC 地址,而是直接接收所有的包并存放到缓冲区中
将包存入缓冲区后,接下来需要查询一下这个包的接收方 MAC 地址是否已经在 MAC 地址表中有记录了
MAC 地址表包含两个信息。MAC 地址和端口是一一对应的,通过这张表就能够判断出收到的包应该转发到哪个端口 例如交换机检查到这个包的 MAC 头部中的接收方 MAC 地址为 00-02-B3-1C-9C-F9,查表后便可得知这个地址位于8号端口上,包要从端口8发出
一个是设备的 MAC 地址
另一个是该设备连接在交换机的哪个端口上
MAC 表的维护
第一种是收到包时,将发送方 MAC 地址以及其输入端口的号码写入 MAC 地址表中。由于收到包的那个端口就连接着发送这个包的设备,所以只要将这个包的发送方 MAC 地址写入地址表,以后当收到发往这个地址的包时,交换机就可以将它转发到正确的端口了。交换机每次收到包时都会执行这个操作,因此只要某个设备发送过网络包,它的 MAC 地址就会被记录到地址表中
另一种是删除地址表中某条记录的操作,这是为了防止设备移动时产生问题,因此地址表中的记录不能永久有效,而是要在一段时间不使用后就自动删除
在过时记录被删除之前,依然可能有发给该设备的包到达交换机。这时,交换机会将包转发到老的端口,这时只要重启一下交换机清空更新地址表或者再等多一会达到自动删除的时间
特殊情况
当查询地址表记录中的目标端口和这个包的源端口是同一个端口(从交换机绕了一圈)
首先,计算机 A 发送的包到达集线器后会被集线器转发到所有端口上,也就是会到达交换机和计算机 B
然后,交换机转发这个包之后,这个包会原路返回集线器,然后,集线器又把包转发到所有端口,于是这个包又到达了计算机 A 和计算机 B
计算机 B 相当于收到了两个相同的包,会导致无法正常通信
因此,当交换机发现一个包要发回到原端口时,就会直接丢弃这个包
MAC 表没有地址
可能是因为具有该地址的设备还没有向交换机发送过包,或者这个设备一段时间没有工作导致地址被从地址表中删除了
解决方法:将包转发到除了源端口之外的所有端口上,无论该设备连接在哪个端口上都能收到这个包。只有相应接收者才确认接收。因为交换机规模撑死几千台,可以广播出去
如果目标 MAC 是一个广播地址,交换机会将包发送到除源端口之外的所有端口
交换器中的交换电路根据 MAC 地址表切换输出端
当网络包通过交换电路到达发送端口时,端口中的 MAC 模块和 PHY(MAU)模块会执行发送操作,将信号发送到网线中,这部分和网卡发送信号的过程是一样的
现在基本上都不使用集线器了,而是直接用交换机将终端和路由器相连接,在这种情况下,交换机的端口会自动切换为全双工模式
集线器:广播
交换机:端对端传播
全双工模式
只要MAC和端口对应上了之后,就相当于建立了一条独立的通道,而且网线是双绞线,信号收发可以同时进行
自动协商:确定最优的传输速率
能自动切换工作模式(半/全双工)之外,还能探测对方的传输速率并进行自动切换
当没有数据在传输时,网络中会填充一种被称为连接脉冲的脉冲信号。在没有数据信号时就填充连接脉冲,这使得网络中一直都有一定的信号流过,从而能够检测对方是否在正常工作
自动协商功能就利用了这样的脉冲信号,即通过这种信号将自己能够支持的工作模式 和传输速率相互告知对方,并从中选择一个最优的组合
最优组合:当两台设备通电并完成硬件初始化之后,就会开始用脉冲信号发送自己支持的速率和工作模式。当对方收到信号之后,会通过读取脉冲信号的排列来判断对方支持的模式,然后看看双方都支持的模式有哪些。 表 3.2 是按照优先级排序的,因此双方都支持的模式就是第 3 行及以下的部分。越往上优先级越高,因此在本例中 100 Mbit/s 全双工模式就是最优组合
可同时执行多个转发操作
当包从最上面的端口发送到最下面的端口时,其他端口都处于空闲状态,这些端口可以传输其他的包,因此交换机可以同时转发多个包
交换机只是将进来的包转发出去而已,它自己并不会成为发送方或者接收方,自然不会对 MAC 进行任何改写
路由器 Router
路由器根据“IP 地址”判断转发目标。[IP↔IP]
路由器与交换机的区别
路由器是基于 IP 层面设计的,而交换机是基于以太网设计的
二层交换机
因为交换机工作在二层数据链路层
三层路由器
因为路由器工作在三层 IP 层
从包的转发目标来看,IP 并不是委托以太网将包传输到最终目的地,而是传输到下一个路由器
传输到最终目的地——某台计算机网卡MAC的,是交换机
IP(路由器)负责将包送达通信对象这一整体过程,而其中将包传输到下一个路由器的过程则是由以太网(交换机)来负责的。
在一个子网络里面(比如一个公司可以有自己的内部网络),MAC 地址可以在这个子网络里面定位到不同的网络设备,IP 可以在整个 internet 中定位到不同的子网络。所以 MAC 是「设备 ↔ 设备」,而 IP 是「网络 ↔ 网络」
转发模块负责判断包的转发目的地
转发模块的工作就是进行路由表的匹配
端口模块负责包的收发操作
支持除局域网之外的多种通信技术,如 ADSL、FTTH,以及各种宽带专线等,只要端口模块安装了支持这些技术的硬件即可。这意味着端口模块是以实际的发送方或者接收方的身份来收发网络包的,故路由器的各个端口都具有 MAC 地址和 IP 地址
工作原理
首先通过端口将发过来的包接收进来,这一步的工作过程取决于端口对应的通信技术
以以太网端口为例,信号到达网线接口部分,其中的 PHY(MAU)模块和 MAC 模块将信号转换为数字信息,然后通过包末尾的 FCS 进行错误校验,如果没问题则检查 MAC 头部中的接收方 MAC 地址,看看是不是发给自己的包,如果是就放到接收缓冲区中,否则就丢弃这个包
完成包接收操作之后,路由器就会丢弃包开头的 MAC 头部。MAC 头部的作用就是将包送达路由器,其中的接收方 MAC 地址就是路由器端口的 MAC 地址。因此,当包到达路由器之后,MAC 头部的任务就完成了,于是原发送方的 MAC 头部(路由器端口的 MAC)就会被丢弃
通过路由器转发的网络包,其接收方 MAC 地址为路由器端口的 MAC 地址
接下来转发模块会根据接收到的包的 IP 头部中记录的接收方 IP 地址,在路由表中进行查询,以此判断转发目标IP
判断转发 IP 原则
网络号“最长匹配”原则
网络号长度相等的情况下选择跃点计数最小的记录
目标地址列中的 IP 地址表示的是子网,但也有一些例外,有时地址本身和其自身的子网掩码和路由表中的子网掩码是不一致的,这是路由聚合的结果
路由聚合
路由器B发往这三个子网中的任何一个都是通过路由器A转发,故可以在路由表中将这 3 个子网聚合成 10.10.0.0/16,这样也可以正确地进行转发,但减少了路由器B的路由表中的记录数量
经过路由聚合,多个子网会被合并成一个子网,子网掩码会发生变化,同时,目标地址列也会改成聚合后的地址
路由表的子网掩码列只是用来在匹配目标地址时告诉路由器源地址和目标地址应该匹配多少个比特
网络号部分全为1=主机号部分全为0,即子网掩码为255.255.255.255,表明了IP地址的所有位都是网络位的标识,这样每一个IP地址都是独立的一个网段,可以作为运营商设备的管理地址或loopback接口地址
主机号部分不全为0,则可以表示子网中有计算机
最后一列是跃点计数,它表示距离目标 IP 地址的距离是远还是近。这个数字越小,表示距离目的地越近
路由表的维护
路由器中对路由表的维护是与包转发操作相互独立的,也就是说,在转发包的过程中不需要对路由表的内容进行维护
维护方法
由人手动维护路由记录
根据路由协议机制,通过路由器之间的信息交换由路由器自行维护路由表的记录
如果在路由表中找不到匹配的目标,在庞大的网络中每台路由器若采用广播的方法回产生大量无用网络包造成网络堵塞,故路由器遇到不知道该转发到哪的包会直接丢弃
转发目标全部匹配在路由表中不现实,解决方法:找不到匹配路由时选择默认路由
默认路由的子网掩码为0.0.0.0, 意思是网络包接收方 IP 地址和路由表目标地址的匹配中需要匹配的比特数为 0,换句话说,就是根本不需要匹配。只要将子网掩码设置为 0.0.0.0,那么无论任何地址都能匹配到这一条记录,这样就不会发生不知道要转发到哪里的问题了
只要将互联网接入路由器的网关填入这一列,当匹配不到其他路由时,网络包就会被转发到互联网接入路由器。这条记录也称默认路由,填的网关为默认网关
通俗的说:就是在自己电脑里配置的一个 IP 地址,以便在发给不同子网的机器时,发给这个 IP 地址
由于匹配的比特数越长优先级越高(最长匹配原则),因此子网掩码为0.0.0.0 的记录优先级是最低的,只有当找不到其他匹配的记录时,才会选择这条记录
路由器判断下一个转发目标的两条路径
如果路由表的网关列内容为 IP 地址,则该地址就是下一个转发目标
然后通过 ARP 查询接收方 IP 地址的 MAC 地址
如果路由表的网关列内容为空,则 IP 头部中的接收方 IP 地址就是下一个转发目标
找到转发目标 IP 后
更新 IP 头部的 TTL(包的有效期),设为62或128
不同的线路和局域网类型各自能传输的最大包长度也不同,因此输出端口的最大包长度可能会小于输入端口。即使相同也可能因为添加了头部数据而导致变化,ADSL、FTTH 等宽带接入技术中使用的 PPPoE 协议就属于这种情况。一旦转发的包长度超过了输出端口能传输的最大长度就要进行拆分
首先看输出端口的 MTU 与要转发的包的长度比较,如果输出端口 MTU 太小就要分片。但分片之前要看看 IP 头部的标志字段确认是否可分片,不能分片就只能丢弃并 ICMP 通知发送方
不能分片的情况
发送方应用程序等设置了不允许分片
这个包已经是经过分片后的包
在分片中,TCP 头部及其后面的部分都是可分片的数据,尽管 TCP 头部不属于用户数据,但从 IP 来看也是 TCP 请求传输的数据的一部分。数据被拆分后,每一份数据前面会加上 IP 头部,其大部分内容都和原本的 IP 头部一模一样,但其中有部分字段需要更新,这些字段用于记录分片相关的信息
最后转发模块将包转移到转发目标对应的端口,路由器会根据接入网的规则来发送包
以以太网的包发送为例,即在包前面加上 MAC 头部,设置其中的一些字段,然后将完成的包转换成电信号并发送出去。发送出去的网络包会通过交换机到达下一个路由器。由于接收方 MAC 地址就是下一个路由器的地址,所以交换机会根据这一地址将包传输到下一个路由器。接下来,下一个路由器会将包转发给再下一个路由器,经过层层转发之后,网络包就到达了最终的目的地
填写接收方 IP 地址
然后还需填写输出端口的 MAC 地址,还有一个以太类型字段,填写 0080
端口的 MAC 地址一般也是在硬件生产过程中写入 ROM 中的
路由器的附加功能
地址转换
出现背景
原本互联网的设计是每台设备一个IP地址,所有客户端都直接连接到互联网。但随着联网设备的增加,过不了多久,可分配的地址就用光了。如果不能保证每台设备有唯一不重复的地址,就会从根本上影响网络包的传输
解决方式
改变固定地址的分配方式,也就是一台设备一个地址的分配方式
假如有 A、 B 两家公司,它们的内网是完全独立的。这种情况下,两家公司的内网之间不会有网络包流动,即使 A 公司的某台服务器和 B 公司的某台客户端具有相同的 IP 地址也没关系,因为它们之间不会进行通信。只要在每家公司自己的范围内,能够明确判断网络包的目的地就可以了,是否和其他公司的内网地址重复无关紧要,只要每个公司的网络是相互独立的,就不会出现问题。
解决地址不足的问题,利用的就是这样的性质,即公司内部设备的地址不一定要和其他公司不重复。这样一来,公司内部设备就不需要分配固定地址了,从而大幅节省了 IP 地址。但需要规定某些地址是用于内网的,这些地址叫作私有地址,而原来的固定地址则叫作公有地址
内网中可作私有地址的范围
10.0.0.0 ~ 10.255.255.255
172.16.0.0 ~ 172.31.255.255
192.168.0.0 ~ 192.168.255.255
私有地址的来源
将公有地址中没分配的一部分拿出来规定只能在内网使用它们
公司内网与互联网连接的方法
公司网络外网部分架设对互联网开放的服务器,分配公有地址,可以和互联网直接通信
内网部分则分配私有地址,内网中的设备不能和互联网直接收发网络包,而是通过一种特别的机制进行连接,这个机制就叫地址转换
地址转换原理
在转发网络包时对 IP 头部中的 IP 地址和端口号(TCP和UDP端口号)进行改写
首先改写发送方的IP和端口为地址转换设备的互联网接地端口地址和空闲的随机端口
地址转换设备不仅有路由器,有些防火墙也有地址转换功能,它的工作方式和路由器是相同的
为什么要改写端口号
早期地址转换机制是只改写地址,不改写端口号
不改写端口那每个私有地址就要有一一对应的公有地址
公司人一多,需要的公有地址就多了,所以改写端口号来解决这个问题
端口号是一个 16 比特的数值,总共可以分配出几万个端口,因此如果用公有地址加上端口的组合对应一个私有地址,一个公有地址就可以对应几万个私有地址,这种方法提高了公有地址的利用率
16 比特可以表示 65 536 个端口号,但并不是所有这些端口都可以用于地址转换
改写前的私有地址和端口号,以及改写后的公有地址和端口号,会作为一组相对应的记录保存在地址转换设备内部的一张表中
改写发送方IP和端口后包就被发到互联网了,然后服务器会返回一个包。服务器返回的包的接收包是原始包的发送方,因此返回的包的接收方就是改写后的公有地址和端口号。这个公有地址其实是地址转换设备的地址,因此这个返回包就会到达地址转换设备
从互联网一端来看,实际的通信对象是地址转换设备(这里指的是路由器)
对于从互联网访问公司内网的包,如果在对应表中没有记录就无法正常转发。理解为没有访问互联网的内网设备,表中也就没有记录,互联网无法向其发送网络包。所以要访问内网的设备,就要事先添加记录
地址转换器再根据表通过公有地址和端口号找到相对应的私有地址和端口号,并改写接收方信息,然后将包发给公司内网,这样包就能够到达原始的发送方了
当数据收发结束,进入断开阶段,访问互联网的操作全部完成后,对应表中的记录就会被删除
包过滤
在对包进行转发时,根据 MAC 头部、IP 头部、TCP 头部的内容,按照事先设置好的规则决定是转发这个包,还是丢弃这个包。我们通常说的防火墙设备或软件,大多数都是利用这一机制来防止非法入侵的
接入网和运营商
互联网是通过路由器来转发包的
以太网线无法实现单纯的长距离传输
双绞线的极限距离是 100 米,但光纤的连接距离可以长达几公里
如果网络包的目标服务器位于家庭、公司网络中的话,那么就不需要通过互联网接入路由器,而是直接转发给目标服务器,也不会进入互联网
互联网接入路由器是按照接入网规则来发送包
接入网的概念
指连接互联网与家庭、公司网络的通信线路。一般家用的接入网方式包括 ADSL、FTTH、CATV、电话线、ISDN 等,公司则还可能使用专线
ADSL结构
网络包传输过程中的形态变化
ADSL Modem
将包拆分成信元
会把包拆分成很多小格子,每个小格子成为一个信元。开头有 5 个字节的头部,后面是 48 个字节的数据,用于一种叫作 ATM 的通信技术。使用信元来传输数据,就比较容易和其他设备进行整合,可以降低开发投入和设备投入。如果不是出于这样的原因,其实并不需要将包拆分成信元,实际上也有一些 ADSL运营商使用的 ADSL Modem 是不进行数据拆分的
将信元“调制”成电信号
以太网采用的是用方波信号表示 0 和 1 的方式
ADSL Modem 采用了一种用圆滑波形(正弦波)对信号进行合成来表示 0 和 1 的技术,这种技术称为调制
使用不同频率的波增加传输的比特数提高速率
一般情况下,一个波可表示几个比特到几十个比特
上行方向(用户到互联网)和下行方向(互联网到用户)的传输速率是不同的,波的数量不同,导致了上下行速率不同
上行使用 26 个频段
下行则可以使用 95 个或者 223 个频段
下行使用的频段较高,这些信号容易衰减而且更容易受到噪声的影响,因此这些频段可能只能表示较少的比特数
噪声和衰减等影响线路质量的因素在每条线路上都不同,而且会随着时间发生变化。因此,ADSL 会持续检查线路质量,动态判断使用的频段数量,以及每个频段分配到的比特数
当 Modem 通电后,会发送测试信号,并根据信号的接收情况判断使用的频段数量和每个频段的比特数,这个过程称为训练(握手),需要几秒到几十秒的时间
噪声干扰下的 ADSL
ADSL 信号受到干扰后并不会立即造成错误。ADSL 信号分布在多个频段上,只有和噪声频率相同的信号会受到影响而无法读取,即可用的信号数量减少,结果导致速率下降
分离器
信号从电话线传入的时候分离器需要负责将电话信号和 ADSL 信号进行分离
分离器的功能是将一定频率以上的信号过滤掉,也就是过滤掉了 ADSL 使用的高频信号,只有电话信号才会进入电话机(低通滤波器)
对于另一头的 ADSL Modem,则是传输原本的混合信号给它。因为ADSL Modem 内部已经具备将 ADSL 频率外的信号过滤掉的功能,因此不需要在分离器过滤
还可以防止电话对 ADSL 产生干扰
放下电话听筒时,电话机的电路和电话线是断开的,当拿起听筒时电话机就和电话线相连,电话机的信号就会传到电话线上。这两种状态的差异会导致噪声等线路状态的改变,如果 ADSL 通信过程中拿起话筒导致线路状态改变,就需要重新训练(握手),这就会导致几十秒的通信中断,分离器可以防止发生这样的问题
新技术能够快速重新握手,即便没有分离器也不会影响 ADSL 通信,G.992.2 的 ADSL规格就包含这种技术,但 ADSL 信号还是会影响电话,因此 G.992.2 的 ADSL 规格中一般还是需要使用分离器(ADSL会影响电话,电话不会影响ADSL了)
电话线接口
大楼里的IDF
大楼里的MDF
保安器,防止雷电等情况下电话线中产生过大电流的一种保护装置,内部有保险丝
电话电缆
集合到电话局附近的电缆隧道
通过电缆隧道进入电话局后,电缆会逐根连接到电话局的 MDF 上
DSLAM
信号通过电话线到达电话局之后,会经过配线盘、分离器到达 DSLAM.这一过程和用户端的 ADSL Modem 在接收数据时的过程是一样的
只不过安装这么多 Modem 需要占用大量的空间,而且监控起来也非常困难。因此,电话局使用了 DSLAM 设备,它是一种将相当于很多个 ADSL Modem 的功能集中在一个外壳里的设备
但与用户端的 ADSL Modem 不完全相同:用户端 ADSL Modem 具备以太网接口,可以与用户端的路由器和计算机交互,收发以太网包,而 DSLAM 一般不用以太网接口,而是用 ATM 接口,和后方路由器收发数据时使用的是原始网络包拆分后的 ATM 信元形式
BAS
包转发设备,将ATM信元还原为原始包
丢弃MAC和PPPoE头部
加上隧道专用头部(隧道:类似于套接字之间建立的 TCP 连接)
网络包通过隧道到达隧道专用路由器
去掉隧道专用头部
IP 包被取出并转发到互联网内部
隧道
将包含头部在内的整个包从隧道的一头扔进去,这个包就会原封不动地从隧道的另一头出来,就好像在网络中挖了一条地道,网络包从这个地道里穿过去一样
隧道的实现方式
首先需要在网络上的两台隧道路由器之间建立 TCP 连接
只要具备隧道功能,是不是路由器无所谓,有时也会使用服务器来建立隧道
然后将连接两端的套接字当作是路由器的端口,并从这个端口来收发数据
在路由器收发包时,是基于隧道的规则向隧道中放入或取出网络包,这时,TCP 连接就好像变成了一根网线,包从这里穿过到达另一端
添加隧道头部
将包含头部在内的整个包装入另一个包中传输到隧道的另一端
随着接入网发展到 ADSL 和 FTTH,接入网连接的路由器也跟着演进,而这种进化型的路由器就叫作 BAS
具有用户认证和配置下发功能
ADSL 和 FTTH 接入网中,都需要先输入用户名和密码,登录之后才能访问互联网,而 BAS 就是登录操作的窗口
传统电话拨号上网使用PPP,故没有BAS,只有RAS
ADSL 和 FTTH 使用 PPPoE,故有BAS
BAS 使用 PPPoE 方式来实现这个功能。PPPoE 是由传统电话拨号上网上使用的 PPP 协议发展而来的
使用电话线或者 ISDN 拨号上网时的PPP拨号上网工作方式
工作过程
用户向运营商的接入点拨打电话
电话接通后输入用户名和密码进行登录操作
在 ADSL 和 FTTH 中可以通过PPP的用户名和密码登录步骤根据用户名来切换不同的运营商
如何切换运营商?
用户名和密码通过 RADIUS协议从 RAS 发送到认证服务器,认证服务器校验这些信息是否正确
认证服务器确认无误后会返回 IP 地址等配置信息,并将这些信息下发给用户
用户的计算机根据这些信息配置 IP 地址等参数,完成 TCP/IP 收发网络包的准备工作,接下来就可以发送 TCP/IP 包了
在接入互联网时,必须为计算机分配一个公有地址,但这个地址并不是事先确定的。因为在拨号连接时,可以根据电话号码来改变接入点,而不同的接入点具有不同的 IP 地址,因此无法事先在计算机上设置这个地址。所以,在连接时运营商会向计算机下发 TCP/IP 配置信息,其中就包括为计算机分配的公有地址
PPP 协议传输消息的方式
类似于 MAC 头部封装 IP 包,要传输 PPP 消息,必须有另一个包含报头、FCS、信号格式等元素的“容器”,然后将 PPP 消息装在这个容器里
这个容器(相当于 MAC 头部)称为 HDLC
拨号上网中的 PPP
对于 ADSL 和 FTTH,如果可以和前面一样借用 HDLC 来作为容器,PPP 协议就可以直接使用了
但是,ADSL 和 FTTH 又并不能使用 HDLC,因此需要寻找另一个机制作为替代——用以太网包代替 HDLC 来装载 PPP 协议
这里的以太网设计和 PPP 有所不同,为了弥补这些问题就重新设计了一个新的规格,这就是 PPPoE
PPPoE 是将 PPP 消息装入以太网包进行传输的方式
ADSL中的 PPP(PPPoE)
FTTH中的 PPP(PPPoE)
PPPoA
与 PPPoE 的区别:直接将 PPP 消息装入信元
不用加 MAC 头部和 PPPoE 头部
这就意味着需要和 BAS 收发 PPP 消息的设备,也就是计算机和路由器,必须和 ADSL Modem 是一体的,否则 PPP 机制就无法工作了
第一种是将计算机和 ADSL Modem 用 USB 接口连接起来,这样ADSL Modem 就和计算机成为一体了。不过这种方法并未普及
另一种是将 ADSL Modem 和路由器整合成一台设备。这种方式和 PPPoE 中使用路由器上网的方式基本没什么区别,因此得到了广泛的普及
这种方法就无法用计算机直连modem了,当由于地址转换产生问题时,这种方式就不容易处理了,因为我们无法抛开路由器用计算机直接上网
PPPoE 需要添加头部,相应的 MTU 就小了; PPPoA 则不会发生 MTU 变小的情况
PPPoE 会降低网络效率; PPPoA 无法分离 Modem 和路由器
为了解决这一矛盾,运营商采用 DHCP 协议从 BAS 向用户端下发 TCP/IP 配置i信息
DHCP
原理
客户端请求配置信息
DHCP服务器下发配置信息
特点
不需要验证用户名和密码
也就无法通过用户名来切换运营商网络
可以单纯地传输以太网包,不需要添加额外的 PPP 头部,因此不会占用 MTU
采用 DHCP 的运营商使用的 ADSL Modem 也和 PPPoE、PPPoA方式不同,这种 ADSL Modem 不使用信元,而是直接将以太网包调制成ADSL 信号,因此没有 ADSL Modem 和路由器无法分离的问题
使用信元的 PPPoE 和 PPPoA 方式中,BAS 需要配备比较昂贵的 ATM 接口,因此不使用信元还可以控制成本
FTTH
用光纤来代替 ADSL 将用户端接入路由器和运营商的 BAS 连接起来的接入方式就是 FTTH
光纤结构
光通信原理
光线在纤芯和包层的边界上反射时,会由于反射角产生相位变化,相位不一致时会发生干涉抵消,只有那些相位一致的光线才会继续在光纤中传导
相位变化
干涉抵消
相位不同的波在干涉后会变弱、消失,最后就只剩下相位相同的波向周围扩散开来
有几个特定的角度下,向反射面前进的光和反射回来的光的相位是一致的,只有以这些角度反射的光才能继续向前传导
这个角度非常关键,纤芯的直径也是根据这个角度来确定的,而且纤芯的直径大小会极大地改变光纤的性质。根据纤芯直径,光纤可以划分成几种类型
单模光纤(8~10 μm)
只有入射角很小的光线才能进入,因此在能够保持相位一致的角度中,只有角度最小的光线能进入光纤
单模光纤的纤芯直径就是按照只允许相位一致的最小角度的光进入而设计的
相位一致的可传输角度只有单个
能通过的光线较少,相应地对于光源和光敏元件的性能要求就较高,但信号的失真会比较小
纤芯传导的光线只有一条,不会因为行进距离的差异产生时间差,所以即便光纤很长,也不会产生严重的失真
用于距离较远的建筑物之间的连接
用于FTTH
多模光纤(50 μm 或 62.5 μm)
在相位一致的角度中,不仅角度最小的可以在光纤中传导,其他角度更大一些的也可以
可以有多条光线在纤芯中同时传导
相位一致的可传输角度可有多个
能通过的光线较多,对光源和光敏元件的性能要求也就较低,从而可以降低光源和光敏元件的价格
多条反射角不同的光线同时传导,其中反射角越大的光线反射次数越多,走过的距离也就越长;相对地,反射角越小的光线走过的距离越短。光通过的距离会影响其到达接收端的时间,也就是说,通过的距离越长,到达接收端的时间越长。结果,多条光线到达的时间不同,信号的宽度就会被拉伸,这就造成了波形失真。因此,光纤越长,失真越大,当超过允许范围时,通信就会出错
主要用于一座建筑物里面的连接
FTTH形态。只是光信号的传输方式有一些区别,实际传输的网络包是相同的
直连方式
用户和最近的电话局之间用一根光纤连接
首先用户端的光纤收发器(终端盒)将以太网的电信号转换成光信号。这一步只进行电信号到光信号的转换,而不会像 ADSL 一样还需要将包拆分成信元,可以认为是将以太网包原原本本地转换成了光信号
接下来光信号通过连接到光纤收发器的光纤直接到达 BAS 前面的多路光纤收发器(相当于 ADSL 中的 DSLAM)
多路光纤收发器将光信号转换成电信号,BAS 的端口接收之后,将包转发到互联网内部
服务器收到包后会返回响应,响应包的光信号也是沿着同一条光纤传输到用户端
前往互联网的上行光信号和前往用户的下行光信号在光纤中会混合在一起,故需要进行区分
区分的方法是上行和下行信号采用不同波长的光。波长不同的光混合后可通过棱镜原理进行分离,因此光纤中的上行和下行信号即便混合起来也可以识别。像这样在一条光纤中使用不同的波长传输多个光信号的方式叫作波分复用
为有独享光纤高速上网需求的大企事业单位或集团用户提供的,传输带宽2M-155M不等
分路方式
在用户附近的电线杆上安装一个分光器,通过这个设备让光纤分路,同时连接多个用户
这种模式下用户端就不需要光纤收发器了,而是替换成叫 ONU (光网络单元)的设备
ONU 作用
对OLT发送的广播进行选择性接收,若需要接收该数据要对OLT进行接收响应
对用户需要发送的以太网数据进行收集和缓存,按照被分配的发送窗口向OLT端发送该缓存数据
ONU接入方式
FTTC(Fiber To The Curb):ONU放置在小区的中心机房;
FTTB(Fiber To The Building):ONU放置在楼道的接线箱;
FTTH(Fiber To The Home):ONU放置在家庭用户中;
将以太网的电信号转换成光信号之后,会到达 BAS 前面的一个叫作 OLT (光线路终端)的设备
多个用户同时收发网络包时信号会在分光器产生碰撞。因此,OLT 和 ONU 中具备通过调整信号收发时机来避免碰撞的功能
用户端→电信局:OLT 会调整信号发送时机并向 ONU 下发指令,ONU 则根据 OLT 的指令来发送数据
电信局→用户端:BAS 端向用户发送数据时,分光器只需要将信号发给所有用户就可以了,这里并不会发生碰撞,但这样做会导致一个用户收到其他所有用户的信号,造成信息泄露的问题,因此需要在每个包前面加上用于识别 ONU 的信息,当 ONU 收到信号后,会接收发给自己的信号并将其转换成以太网信号
接入网整体工作过程
首先,接入路由器中需要配置运营商分配的用户名和密码
然后,接入路由器会根据 PPPoE 的发现机制来寻找 BAS
这个发现机制类似于ARP基于广播实现
用户询问:“ BAS 在不在 在的话请报告 MAC 地址 。”
BAS 回答 :“ 我在这里 我的 MAC 地址是 xx:xx:xx:xx:xx:xx 。”
然后用户端就知道了 BAS 的 MAC 地址,也就可以和 BAS 进行通信了
相当于拨号上网中的拨通电话动作
这个电话就是 BAS, BAS 的 MAC 就是电话号码
发送用户名和密码的方式
将密码进行加密的 CHAP 方式
不加密的 PAP 方式
BAS 向认证服务器发送密码时使用 RADIUS 协议,无论用户拨入使用 CHAP 还是 PAP,RADIUS 都是加密的
校验密码后 BAS 会下发 TCP/IP 配置信息
下发的 TCP/IP 参数会被配置到互联网接入路由器的 BAS端的端口上
如果将这些信息配置在计算机上,就相当于计算机拥有了公有地址,这种情况下不需要进行地址转换也可以访问互联网
但如果使用路由器来上网,BAS 下发的参数就会被配置在路由器上,而且公有地址也是分配给路由器的。这样一来,计算机就没有公有地址了
此时计算机会被分配一个私有地址,计算机发送的包需要通过路由器进行地址转换然后再转发到互联网中
网络电话、聊天、对战游戏等需要客户端之间直接收发网络包的应用程序都需要将自己的 IP 地址告知对方。这些应用程序会受到地址转换的影响
此时可以不使用路由器,而是直接让计算机接收来自 BAS 的 PPPoE 消息
就是采用最原始的上网方法。这样一来,计算机就具有了公有地址,不需要地址转换也可以上网了
只要将计算机直接连接到 ADSL Modem、光纤收发器、ONU 等设备,或者是通过集线器连接到这些设备,计算机就可以直接接收 PPPoE 消息了
不用路由器上网也有一点需要注意,因为上网的计算机拥有公有地址,这意味着来自互联网的包可以直接到达计算机,这可能导致计算机被攻击。因此,对于直接上网的客户端计算机,我们应该采取安装防火墙软件等防御手段
配置信息包括分配给上网设备的 IP 地址、DNS 服务器的IP 地址以及默认网关的 IP 地址。当使用路由器连接互联网时,路由器会根据这些信息配置自身的参数。这样一来,路由器的 BAS 端的端口就有了公有地址,路由表中也配置好了默认网关,接下来就可以将包转发到互联网中了
IP 指互联网中使用的公有地址
一对一连接的端口可以不分配 IP 地址,这种方式称为无编号
这种情况下,BAS 下发配置信息时就不会下发默认网关的 IP 地址
端口一般是由用户分配一个私有地址
默认网关即默认路由所关联的网关地址(第三列)
路由器根据路由表的目的地转发包,只不过在通过路由表判断转发目标之后,包不是按照以太网规则转发,而是按照 PPPoE 规则转发:首先要发送的包会被加上头部信息,并设置相应的字段
PPPoE包
MAC 头部
接收方 MAC 地址填写通过 PPPoE 发现机制查询到的 BAS 的 MAC 地址
发送方 MAC 地址填写互联网接入路由器的 BAS 端的端口的 MAC 地址
以太类型填写代表 PPPoE 的 8864(十六进制)
PPPoE 头部
PPP 头部
接下来,网络包会到达 BAS,而 BAS 会将 MAC 头部和 PPPoE 头部去掉,取出 PPP 头部以及后面的部分
然后通过隧道机制将包发送出去
最后,PPP 包会沿隧道到达另一端的出口,也就是网络运营商的路由器
运营商
运营商路由器(互联网入口)
互联网的实体并不是由一个组织运营管理的单一网络,而是由多个运营商网络相互连接组成的
ADSL、FTTH 等接入网是与用户签约的运营商设备相连的,这些设备称为 POP
POP 中有根据接入网的类型需要分别使用不同类型的路由器
路由器的基本工作方式是相同的,但根据其角色分成了不同的类型
一般路由器
专线
路由器是是具有通信线路端口的一般路由器。专线不需要用户认证、配置下发等功能,因此用一般的路由器就可以了
PPPoE 方式的 ADSL 和 FTTH
PPPoE 方式中,ADSL、FTTH 接入服务商会使用 BAS,运营商的路由器则与 BAS 相连
PPPoE 中的身份认证和配置下发操作由接入服务商的 BAS 来负责,运营商的路由器只负责对包进行转发,因此这里也是使用一般的路由器就可以了
PPPoA 方式的 ADSL
DSLAM 通过 ATM 交换机与 ADSL 的运营商的 BAS 相 连,然后再连接到运营商的路由器。用户端传输的信号先经过 ADSL Modem 拆分成 ATM 信元并进行调制,然后 DSLAM 将信号还原成信元,通过 ATM 交换机转发到 BAS,最后 BAS 将信元还原成网络包,再通过运营商的路由器转发到互联网内部
RAS
电话、ISDN 等拨号方式的接入网
拨号接入需要对用户拨电话的动作进行应答,而 RAS 就具备这样的功能。此外,RAS 也具备通过 PPP 协议进行身份认证和配置下发的功能
不同部分的路由器选择
接入网部分路由器需要配备大量的端口,但能传输的网络包数量相对比较少,因为接入网的速率比互联网核心网络要低,因此选择端口多价格便宜的路由器
另一部分用于连接运营商和核心 NOC 以及其他的 POP 所有连接接入网的路由器发出的包都会集中到这里,使用的线路速率也比较高,因此这里需要配备转发性能和数据吞吐量高的路由器
NOC
运营商的核心设备,从 POP 传来的网络包都会集中到这里,并从这里被转发到离目的地更近的 POP,或者是转发到其他的运营商
NOC 和 POP 并没有非常严格的界定。NOC 里面也可以配备连接接入网的路由器,很多情况下是和 POP 共用的
理解成 NOC 就是规模扩大后的 POP
大楼室内可以用线路直接连接
室外线路的连接
运营商的网络中需要传输大量的包,已经超过了双绞线能容纳的极限,因此一般还是更多地使用光纤
对于自己拥有光纤的运营商
光纤将 NOC 和 POP 直接连接起来
对于不拥有光纤的公司
从其他公司租借光纤,但所谓租借并不是光纤本身,而是叫作通信线路服务
也可以租借整条光纤,称为 Dark Fibre
运营商之间的连接
网络包前往下一站
如果最终目的地 Web 服务器和客户端是连接在同一个运营商中的,那么 POP 路由器的路由表中应该有相应的转发目标
运营商的路由器可以和其他路由器交换路由信息,从而自动更新自己的路由表,通过这一功能,路由信息就实现了自动化管理
经过几次查表转发之后,网络包就到达了 Web 服务器所在的 POP 的路由器,然后从这里被继续转发到 Web 服务器
如果服务器的运营商和客户端的运营商不同
网络包需要先发到服务器所在的运营商,这些信息也可以在路由表中找到,这是因为运营商的路由器和其他运营商的路由器也在交换路由信息
运营商之间的路由信息交换
让相连的路由器告知路由信息就可以了。只要获得了对方的路由信息,就可以知道对方路由器连接的所有网络,将这些信息写入自己的路由表中,也就可以向那些网络发送包了
获得对方的路由信息之后,我们也需要将自身的路由信息告知对方。这样一来,对方也可以将发往我们所在子网的包转发过来。这个路由信息交换的过程是由路由器自动完成的,这里使用的机制称为 BGP
根据告知的路由内容可将路由交换分为两类
转接
将互联网中的路由全部告知对方
如果运营商 D 将互联网上所有路由都告知运营商 E,则运营商 E 不但可以访问运营商 D,还可以访问运营商 D 后面的运营商 B、A 和 C。然后,通过运营商 D 就可以向所有的运营商发送包。像这样,通过运营商 D 来发送网络包的方式称为转接
对等/非转接
两个运营商之间仅将与各自网络相关的路由信息告知对方。这样,只有双方之间的网络可以互相收发网络包
IX
设置一个中心设备,通过连接到中心设备的方式来减少线路数量,这个中心设备就称为 IX
IX的核心是具有大量高速以太网端口的二层交换机
运营商的路由器连接到 IX 核心交换机上的方法
当运营商 NOC 和 IX 位于同一幢大楼里时
只要从 NOC 中将光纤延长出来接到 IX 交换机就可以了
NOC 和 IX 不在同一幢大楼里
一种是从路由器延伸出一根通信线路并连接到 IX 交换机上
另一种是将路由器搬到 IX 机房里,用通信线路将路由器和 NOC 连起来,再将路由器连到 IX 交换机上
互联网的路由交换机制
公司中使用的方式是寻找与目的地之间的最短路由,并按照最短路由来转发包,因此,周围的所有路由器都是平等对待的
但运营商之间不能采用最短路由策略,如果单纯采用最短路由的方式,那么其他运营商的包就都会走这条线路,对这家运营商来说也无法区分是谁走的
首先,互联网中可以指定路由交换的对象,可以只将路由信息提供给那些交了费的运营商,那些没交费的运营商也就无法将网络包发送过来了
其次可以设置优先级,例如当某个目的地有多条路由时,可以对每条路由设置优先级
这样一来,对于没有交换路由信息的运营商网络,我们就无法将网络包发送过去了
如果一个运营商走不过去,可以走另一个运营商,无论网络包要发送到什么地方,都会确保能够获取相应的路由信息
服务端局域网
服务器的部署地点
服务器直接部署在公司网络上
现在这种部署方式非主流
第一个原因是 IP 地址不足。这样的方式需要为公司网络中的所有设备,包括服务器和客户端计算机,都分配各自的公有地址。然而现在公有地址已经不够用了
另一个原因是安全问题。这种方式中,从互联网传来的网络包会无节制地进入服务器
部署防火墙
只允许发往指定服务器的指定应用程序的网络包通过,从而屏蔽其他不允许通过的包
防火墙可分为包过滤、应用层网关、电路层网关等几种方式
包过滤原理
检查头部信息设置过滤条件
包过滤案例
通过端口号限定应用程序
阻止除了必需服务(如 Web 服务)以外的所有应用程序的包
要限定某个应用程序时,可以在判断条件中加上 TCP 头部或者 UDP 头部中的端口号。Web 服务器的端口号为 80A,因此我们在刚才的接收方 IP 地址和发送方 IP 地址的基础上再加上 80 端口作为条件就可以了。也就是说,当包的接收方 IP 地址为 Web 服务器地址,且接收方端口号为80 时,允许这些包通过
通过控制位判断连接方向
Web 使用的 TCP 协议是双向收发网络包的,因此如果单纯地阻止从 Web 服务器发往互联网的包,则从互联网访问 Web 服务器的操作也会受到影响而无法进行。故我们应该根据访问的方向来判断
首先 TCP 执行连接操作时,第一个包必定是SYN = 1,ACK = 0。我们就根据这个条件,假如发送方是 Web 服务器,就拦截这个包
假如发送方是客户端,那根据规则表不会拦截客户端的包进入服务器
通过接收方 IP 地址、发送方 IP 地址、接收方端口号、发送方端口号、TCP 控制位这些条件,我们可以判断出通信的起点和终点、应用程序种类,以及访问的方向
若采取 UDP 协议,例如对 DNS 服务器的访问
就无法设置规则只允许公司内部访问互联网上的 DNS 服务器,而阻止从互联网访问公司内部的 DNS服务器。这一性质不仅适用于 DNS,对于所有使用 UDP 协议的应用程序都是共通的。在这种情况下,只能二者择其一——要么冒一定的风险允许该应用程序的所有包通过,要么牺牲一定的便利性阻止该应用程序的所有包通过
如果是使用包过滤之外的其他方式的防火墙,有时候是可以判断 UDP 应用程序的访问方向的
从外部无法访问公司内网
包过滤方式的防火墙不仅可以允许或者阻止网络包的通过,还具备地址转换功能
互联网路由器的路由表中没有私有地址的路由信息,因此凡是接收方为私有地址的包,在经过互联网中的路由器时都会被丢弃,这就是为什么必须使用地址转换的原因。 相对地,防火墙内置的路由功能可以由用户自行设置,因此可以在路由表中配置私有地址相关的路由,使得公司内网到公开区域的访问可以以私有地址的形式来进行,这意味着公司内网和公开区域之间传输的包不需要地址转换
实现方式:和包过滤一样,以起点和终点作为条件,根据需要设置是否需要进行地址转换。私有地址和公有地址之间的对应关系,以及端口号的对应关系都是自动管理的,因此只需要设置是否允许地址转换就可以了
最后通过防火墙
如果判断结果为阻止,那么这个包会被丢弃并被记录下来。这是因为这些被丢弃的包中通常含有非法入侵的痕迹,通过分析这些包能够搞清楚入侵者使用的手法,从而帮助我们更好地防范非法入侵。只不过当判断规则比较复杂时,通过路由器的命令难以维护这些规则,而且对阻止的包进行记录对于路由器来说负担也比较大,因此才出现了专用的硬件和软件。如果规则不复杂,也不需要记录日志,那么用内置包过滤功能的普通路由器来充当防火墙也是可以的。如果将内置包过滤功能的路由器用作防火墙,则在丢弃包时基本上不会留下记录,这是因为路由器的内存容量小,没有足够的空间用来记录日志
防火墙无法抵御的攻击
仅凭起点和终点并不能筛选出所有有风险的包。比如,假设 Web 服务器在收到含有特定数据的包时会引起宕机。但是防火墙只关心包的起点和终点,因此即便包中含有特定数据,防火墙也无法发现,于是包就被放行了。然后,当包到达 Web 服务器时,就会引发服务器宕机
解决方案
修复 Web 服务器程序中的 BUG 防止宕机
是在防火墙之外部署用来检查包的内容并阻止有害包的设备或软件
服务器放在网络运营商等管理的数据中心里,或者直接租用运营商提供的服务器
数据中心是与运营商核心部分 NOC 直接连接的,或者是与运营商之间的枢纽 IX 直接连接的
服务请求负载均衡
高速线路会传输大量的网络包,这会导致服务器的性能跟不上。增加带宽或者更换性能更好的服务器不一定能完美解决,在这种情况下,使用多台服务器来分担负载的方法更有效。这种架构统称为分布式架构,其中对于负载的分担有几种方法
法一:采用多台 Web 服务器,减少每台服务器的访问量
要采用这样的方法,必须有一个机制将客户端发送的请求分配到每台服务器上。具体的做法有很多种
通过 DNS 服务器来分配
当访问服务器时,客户端需要先向 DNS 服务器查询服务器的 IP 地址,如果在 DNS 服务器中填写多个名称相同的记录,则每次查询时DNS 服务器都会按顺序返回不同的 IP 地址。例如,对于域名 www.lab.glasscom.com,如果我们给它分配如下 3 个 IP 地址。当第 4 次查询时就又回到第 1 次查询的结果,这种方式称为轮询(round-robin),通过这种方式可以将访问平均分配给所有的服务器
但这种方式是有缺点的。假如多台 Web 服务器中有一台出现了故障,这时我们希望在返回 IP 地址时能够跳过故障的 Web 服务器,然而普通的DNS 服务器并不能确认 Web 服务器是否正常工作,因此即便 Web 服务器宕机了,它依然可能会返回这台服务器的 IP 地址
此外,轮询分配还可能会引发一些问题。在通过 CGI 等方式动态生成网页的情况下,有些操作是要跨多个页面的,如果这期间访问的服务器发生了变化,这个操作就可能无法继续。例如在购物网站中,可能会在第一个页面中输入地址和姓名,在第二个页面中输入信用卡号,这就属于刚才说的那种情况
使用一种叫作负载均衡器的设备
使用负载均衡器时,首先要用负载均衡器的 IP 地址代替 Web 服务器的实际地址注册到 DNS 服务器上
于是,客户端会认为负载均衡器就是一台 Web 服务器,并向其发送请求,然后由负载均衡器来判断将请求转发给哪台 Web 服务器
操作没有跨多个页面
根据 Web 服务器的负载状况来进行判断。负载均衡器可以定期采集 Web 服务器的 CPU、内存使用率,并根据这些数据判断服务器的负载状况,也可以向 Web 服务器发送测试包,根据响应所需的时间来判断负载状况
不去查询服务器的负载,而是根据事先设置的服务器性能指数,按比例来分配请求
操作跨多个页面
不考虑 Web 服务器的负载,而是必须将请求发送到同一台 Web 服务器上,此时要判断操作是否跨页面
在发送表单数据时在里面加上用来表示关联的信息,或者是对 HTTP 规格进行扩展,在 HTTP 头部字段中加上用来判断相关性的信息。这样,负载均衡器就可以通过这些信息来作出判断,将一系列相关的请求发送到同一台Web 服务器,对于不相关的请求则发送到负载较低的服务器
在 HTTP 头部字段中加上用来判断相关性的信息,这些信息就叫cookie
法二:使用缓存服务器分担负载
将整个系统按功能分成不同的服务器,如 Web 服务器、数据库服务器。缓存服务器就是一种按功能来分担负载的方法
缓存服务器是一台通过代理机制对数据进行缓存的服务器。代理介于 Web 服务器和客户端之间,具有对 Web 服务器访问进行中转的功能。当进行中转时,它可以将 Web 服务器返回的数据保存在磁盘中,并可以代替 Web 服务器将磁盘中的数据返回给客户端。这种保存的数据称为缓存,缓存服务器指的也就是这样的功能
在来自客户端的访问中,总有一部分访问可以无需经过 Web 服务器,而由缓存服务器直接处理。即便只有这一部分操作通过缓存服务器提高了速度,整体性能也可以得到改善。此外,通过让缓存服务器处理一部分请求,也可以减轻 Web 服务器的负担,从而缩短 Web 服务器的处理时间
工作过程
缓存服务器和负载均衡器一样,需要代替 Web 服务器被注册到 DNS 服务器中。然后客户端会向缓存服务器发送 HTTP 请求消息
这时,缓存服务器会接收请求消息,这个接收操作和 Web 服务器相同
创建用来等待连接的套接字
当客户端进行连接时执行连接操作
然后接收客户端发送的请求消息,从客户端来看,缓存服务器就相当于 Web 服务器
缓存服务器会检查请求消息的内容,看看请求的数据是否已经保存在缓存中。根据是否存在缓存数据,后面的操作会有所不同
假设不存在缓存数据,缓存服务器会在 HTTP 头部字段中添加一个 Via 字段,表示这个消息经过缓存服务器转发,然后将消息转发给 Web 服务器
若只有一台 Web 服务器:只要将 Web 服务器的域名和 IP 地址配置在缓存服务器上,让它无条件转发给这台服务器就可以了
如果一台缓存服务器对应多台 Web 服务器,需要根据请求消息的内容来判断应该转发给哪台 Web 服务器
根据请求消息的 URI 中的目录名来进行判断
要实现这个判断先在缓存服务器上设置 • 当 URI 为 /dir1/ 这个目录时,转发给 www1.lab.glasscom.com • 当 URI 为 /dir2/ 这个目录时,转发给 www2.lab.glasscom.com
在这个过程中,缓存服务器会以客户端的身份向目标 Web 服务器发送请求消息。也就是说,它会先创建套接字,然后连接到 Web 服务器的套接字,并发送请求消息。从 Web 服务器来看,缓存服务器就相当于客户端。于是,缓存服务器会收到来自 Web 服务器的响应消息,接收消息的过程也是以客户端的身份来完成的
接下来,缓存服务器会在响应消息中加上 Via 头部字段,它表示这个消息是经过缓存服务器中转的,然后缓存服务器会以 Web 服务器的身份向客户端发送响应消息。同时,缓存服务器会将响应消息保存到缓存中,并记录保存的时间
在中转消息的过程中,缓存服务器还会顺便将页面数据保存下来,随着缓存数据的积累,用户访问的数据命中缓存的几率也会提高
缓存服务器会添加一个 If-Modified-Since 头部字段并将请求转发给 Web 服务器,询问 Web 服务器用户请求的数据是否已经发生变化
然后,Web 服务器会根据 If-Modified-Since 的值与服务器上的页面数据的最后更新时间进行比较,如果在指定时间内数据没有变化,就会返回一个表示没有变化的响应消息
返回消息到达缓存服务器,然后缓存服务器就会知道 Web 服务器上的数据和本地缓存中的数据是一样的,于是就会将缓存的数据返回给客户端
部署位置
部署在 Web 服务器之前
部署在客户端
部署在互联网边缘
Web 服务器运营者和网络运营商签约,将可以自己控制的缓存服务器放在客户端的运营商处,可以控制这些服务器
但必须在所有的运营商 POP 中都部署缓存服务器才行
作为一个 Web 服务器运营者,如果自己和这些运营商签约并部署缓存服务器,无论是费用还是精力都是吃不消的。为了解决这个问题,一些专门从事相关服务的厂商出现了,他们来部署缓存服务器,并租借给 Web 服务器运营者。这种服务称为内容分发服务,提供这种服务的厂商称为 CDSP
首先 CDSP 会与主要的运营商签约,并部署很多台缓存服务器,其次 CDSP 会与 Web 服务器运营者签约,使 得 CDSP 的缓存服务器配合 Web 服务器工作。具体的,只要 Web 服务器与缓存服务器建立关联,那么当客户端访问 Web 服务器时,实际上就是在访问 CDSP 的缓存服务器。缓存服务器可以缓存多个网站的数据,因此 CDSP 的缓存服务器就可以提供给多个 Web 服务器的运营者共享,平摊成本
如何找到最近的缓存服务器
用 DNS 分配访问 IP
在 DNS 服务器返回 Web 服务器 IP 地址时,对返回的内容进行一些加工,使其能够返回距离客户端最近的缓存服务器的 IP 地址
DNS 服务器需要事先从缓存服务器部署地点的路由器收集路由信息
接下来,DNS 服务器根据路由表查询从本机到 DNS 查询消息的发送方,也就是客户端 DNS 服务器的路由信息
通过重定向服务器分配访问目标
HTTP 规格中定义了很多头部字段,其中有一个叫作 Location 的字段。当 Web 服务器数据转移到其他服务器时可以使用这个字段,它的意思是“您要访问的数据在另一台服务器上,请访问那台服务器吧。”这种将客户端访问引导到另一台Web 服务器的操作称为重定向,通过这种方法也可以将访问目标分配到最近的缓存服务器
当使用重定向告知客户端最近的缓存服务器时,首先需要将重定向服务器注册到 Web 服务器端的 DNS 服务器上
然后,客户端才会将 HTTP 请求消息发送到重定向服务器上
重定向服务器收集了来自各个路由器的路由信息,并根据这些信息找到最近 的缓存服务器
然后将缓存服务器的地址放到 Location 字段中返回响应
最后,客户端就会重新去访问指定的缓存服务器了
重定向的方法是根据客户端发送来的 HTTP 消息的发送方 IP 地址来估算距离的,因此精度较高
重定向服务器不仅可以返回带有 Location 字段的 HTTP 消 息,也可以返回一个通过网络包往返时间估算到缓存服务器的距离的脚本,通过在客户端运行脚本来找到最优的缓存服务器
缓存的更新
如果每次访问缓存服务器都要向 Web 服务器查询数据是否有更新,也会增加响应时间。故最好让 Web 服务器在原始数据发生更新时,立即通知缓存服务器,使得缓存服务器上的数据一直保持最新状态,这样就不需要每次确认原始数据是否有变化了,而且从第一次访问就可以发挥缓存的效果。内容分发服务采用的缓存服务器就具备这样的功能
对于 CGI 程序生成的动态页面,将应用程序生成的部分,也就是每次内容都会发生变化的动态部分,与内容不会发生变化的静态部分分开,只将静态部分保存在缓存中
法三:在客户端一侧部署缓存服务器
缓存服务器使用的代理机制最早就是放在客户端一侧的,这才是代理的原型,称为正向代理(forward proxy)。
目的:实现缓存、实现防火墙
代理的由来
防火墙的目的是防止来自互联网的非法入侵,而要达到这个目的,最可靠的方法就是阻止互联网和公司内网之间的所有包。不过,这样一来,公司员工就无法上外网了,因此还必须想一个办法让必要的包能够通过,这个办法就是利用代理
代理的原理
先接收来自客户端的请求消息,然后再转发到互联网中,这样就可以实现只允许通过必要的网络包了
如果能够利用代理的缓存,那么效果就会更好,因为对于以前访问过的数据,可以直接从位于公司内网的代理服务器获得
代理在转发过程中可以查看请求的内容,所以可以根据内容判断是否允许访问。也就是说,通过代理可以禁止员工访问危险的网站,或者是与工作内容无关的网站。包过滤方式的防火墙只能根据 IP 地址和端口号进行判断,因此无法实现这一目的
使用方法
在使用正向代理时,一般需要在浏览器的设置窗口中的“代理服务器”一栏中填写正向代理的 IP 地址
在没有设置正向代理的情况下,浏览器会根据网址栏中输入的http://... 字符串判断 Web 服务器的域名,并向其发送请求消息
没有正向代理时,浏览器会从网址中提取出 Web 服务器域名后面的文件名或目录名,然后将其作为请求的URI 进行发送
当设置了正向代理时,浏览器会忽略网址栏的内容,直接将所有请求发送给正向代 理
在请求的 URI 字段中填写完整的 http://... 网址
URI 部分为 http://... 这样的完整网址,因此可以根据这个网址来转发,不需要像服务器端的缓存服务器一样事先设置好转发目标 Web 服务器,而且可以发给任意 Web 服务器
反向代理
将请求消息中的 URI 中的目录名与 Web 服务器进行关联,使得代理能够转发一般的不包含完整网址的请求消息
透明代理(transparent proxy)
查看请求消息的包头部。因为包的 IP 头部中包含接收方 IP 地址,只要知道了这个地址,就知道用户要访问哪台服务器了
透明代理放在请求消息从浏览器传输到 Web 服务器的路径中,当消息经过时进行拦截。一般只有一条路。多条路则每条都要设置
服务器和浏览器
首先要明确的是服务器的网络相关的部分,如网卡、协议栈、Socket 库等功能和客户端却并无二致。无论硬件和 OS 如何变化,TCP 和 IP 的功能都是一样的,或者说这些功能规格都是统一的
服务器的程序结构
每有一个客户端连接进来,就启动一个新的服务器程序,确保服务器程序和客户端是一对一的状态
首先程序分成两个模块,即等待连接模块和负责与客户端通信的模块
可以分成两个可执行文件,但一般是在一个程序内部分成两个模块
当服务器程序启动并读取配置文件完成初始化操作后,就会运行等待连接模块。这个模块会创建套接字,然后进入等待连接的暂停状态
接下来,当客户端连发起连接时,这个模块会恢复运行并接受连接,然后启动客户端通信模块,并移交完成连接的套接字
接下来,客户端通信模块就会使用已连接的套接字与客户端进行通信
每次有新的客户端发起连接,都会启动一个新的客户端通信模块(b),因此(b)与客户端是一对一的关系。这样,(b)在工作时就不必考虑其他客户端的连接情况,只要关心自己对应的客户端就可以了
每次启动一个新的模块会比较耗时,还有一种方法是事先启动几个客户端通信模块,当客户端发起连接时,从空闲的模块中挑选一个出来将套接字移交给它来处理
通信结束后,这个模块就退出了
服务器端的套接字和端口号
客户端和服务器最根本的区别
对方没有等待连接的状态下,无法单方面进行连接。因此,只有这个部分必须区分发起连接和等待连接这两个不同的角色。从数据收发的角度来看,这就是客户端与服务器的区别,也就是说,发起连接的一方是客户端,等待连接的一方是服务器
具体工作过程
首先,协议栈调用 socket 创建套接字
接下来调用 bind 将端口号写入套接字中。在客户端发起连接的操作中,需要指定服务器端的端口号,这个端口号也就是在这一步设置的。具体的编号是根据服务器程序的种类,按照规则来确定的,例如 Web 服务器使用 80 号端口
设置好端口号之后,协议栈会调用 listen 向套接字写入等待连接状态这一控制信息
这样一来,套接字就会开始等待来自客户端的连接网络包
然后,协议栈会调用 accept 来接受连接
如果包没有到达,就会转为等待包到达的状态,并在包到达的时候继续执行接受连接操作
因此,在执行 accept 的时候,一般来说服务器端都是处于等待包到达的状态,这时应用程序会暂停运行
一旦客户端的包到达,就会返回响应包并开始接受连接操作
接下来,协议栈会给等待连接的套接字复制一个副本,然后将连接对象等控制信息写入新的套接字中
在复制出一个新的套接字之后,原来那个处于等待连接状态的套接字仍会以等待状态继续存在
接收新连接以等待连接的套接字为母本创建新的套接字
如果不创建新副本,而是直接让客户端连接到等待连接的套接字上,那么就没有套接字在等待连接了,这时如果有其他客户端发起连接就会遇到问题。为了避免出现这样的情况,协议栈采用了这种创建套接字的新副本,并让客户端连接到这个新副本上的方法
新创建的套接字副本必须和原来的等待连接的套接字具有相同的端口号
如果一个端口号对应多个套接字,就无法通过端口号来定位到某一个套接字
解决方案:要确定某个套接字时,不仅使用服务器端套接字对应的端口号,还同时使用客户端的端口号再加上 IP 地 址,总共使用下面 4 种信息来进行判断:• 客户端 IP 地址 • 客户端端口号 • 服务器 IP 地址 • 服务器端口号
为什么有这四个信息后还需要描述符?
在套接字刚刚创建好,等待连接的套接字中没有客户端 IP 地址和端口号,这 4 种信息是不全的。此外,为了指代一个套接字,使用一种信息(描述符)比使用 4 种信息要简单。出于上面两个原因,应用程序和协议栈之间是使用描述符来指代套接字的
当 accept 结束之后,等待连接的过程也就结束了,这时等待连接模块会启动客户端通信模块,然后将连接好的新套接字转交给客户端通信模块
服务器的连接阶段
10BASE-T接收电信号还原为数字信号过程(网卡)
首先从报头部分提取出时钟信号,报头的信号是按一定频率变化的,只要测定这个变化的频率就可以和时钟信号同步了
接下来,按照相同的周期延长时钟信号,并在每个时钟周期位置检测信号的变化方向。上升沿为1,下降沿为0。于是电信号被还原成数字信号
接下来需要根据包末尾的帧校验序列(FCS)来校验错误,即根据校验公式计算刚刚接收到的数字信息,然后与包末尾的 FCS 值进行比较
当 FCS 一致,即确认数据没有错误时,接下来需要检查 MAC 头部中的接收方 MAC 地址,看看这个包是不是发给自己的
以太网的基本工作方式是将数据广播到整个网络上,只有指定的接收者才接收数据
网卡的 MAC 模块将网络包从信号还原为数字信息,校验 FCS 并存入缓冲区,然后网卡会向 CPU 发出一个中断
CPU 根据优先级判断是否处理后,就会暂停当前的工作,并切换到网卡的任务。然后,网卡驱动会开始运行,从网卡缓冲区中将接收到的包读取出来,根据 MAC 头部的以太类型字段判断协议的种类,并调用负责处理该协议的软件。这里,以太类型的值应该是表示 IP 协议,因此会调用 TCP/IP 协议栈,并将包转交给它
IP 模块
当网络包转交到协议栈时,IP 模块会首先开始工作
IP 模块首先会检查 IP 头部的格式是否符合规范,然后检查接收方 IP 地址,看包是不是发给自己的
当服务器启用类似路由器的包转发功能时,对于不是发给自己的包,会像路由器一样根据路由表对包进行转发
确认包是发给自己的之后,接下来需要根据头部信息检查包有没有被分片
如果是分片的包,则将包暂时存放在内存中,等所有分片全部到达之后将分片组装起来还原成原始包
如果没有分片,则直接保留接收时的样子,不需要进行重组
接下来需要检查 IP 头部的协议号字段,并将包转交给相应的模块
如果是 11(十六进制),则转交给 UDP 模块
如果协议号为 06(十六进制),则将包转交给 TCP 模块
TCP 模块
收到的包中 SYN 为 1 时,表示对方想要跟我们连接,TCP 模块就会执行接受连接操作
在此之前,需要先检查包的接收方端口号,并确认在该端口上有没有与接收方端口号相同且正在处于等待连接状态的套接字。如果指定端口号没有等待连接的套接字,则向客户端返回错误通知的包
如果存在等待连接的套接字,则为这个套接字复制一个新的副本,并将发送方 IP 地址、端口号、序号初始值、窗口大小等必要的参数写入这个套接字。同时分配用于发送缓冲区和接收缓冲区的内存空间
然后生成代表接收确认的 ACK 号,用于从服务器向客户端发送数据的序号初始值,表示接收缓冲区剩余容量的窗口大小
用这些信息生成 TCP 头部,委托 IP 模块发送给客户端
这个包到达客户端之后,客户端会返回表示接收确认的 ACK 号,当这个 ACK 号返回服务器后,连接操作就完成了
数据的收发阶段
当数据包到达时服务器 TCP 模块
首先,TCP 模块会检查收到的包对应哪一个套接字
可能有多个已连接的套接字对应同一个端口号,因此仅根据接收方端口号无法找到特定的套接字
这时需要根据 IP 头部中的发送方 IP 地址和接收方 IP 地址,以及 TCP 头部中的接收方端口号和发送方端口号共 4 种信息,找到上述 4 种信息全部匹配的套接字
匹配套接字后,TCP 模块会对比该套接字中保存的数据收发状态和收到的包的 TCP 头部中的信息是否匹配,以确定数据收发操作是否正常
具体来说,就是根据套接字中保存的上一个序号和数据长度计算下一个序号,并检查与收到的包的 TCP 头部中的序号是否一致。如果两者一致,就说明包正常到达了服务器,没有丢失。这时,TCP 模块会从包中提出数据,并存放到接收缓冲区中,与上次收到的数据块连接起来。这样一来,数据就被还原成分包之前的状态了
收到的数据进入接收缓冲区后,TCP 模块就会生成确认应答的 TCP 头部,并根据接收包的序号和数据长度计算出 ACK 号,然后委托 IP 模块发送给客户端
接下来,应用程序会调用 Socket 库的 read 来获取收到的数据,这时数据会被转交给应用程序
Web 服务器中,read 获取的数据内容就是 HTTP 请求消息
服务器程序会根据收到的请求消息中的内容进行相应的处理,并生成响应消息,再通过 write 返回给客户端
请求消息包括一个称为“方法”的命令,以及表示数据源的 URI(文件路径名),服务器程序会根据这些内容向客户端返回数据
Web 服务器公开的目录其实并不是磁盘上的实际目录,而是虚拟目录,而 URI 中写的就是在这个虚拟目录结构下的路径名。如果完全按照 URI 中的路径和文件名读取,那就意味着磁盘上所有的文件都可以访问,会很危险
读取文件时,需要先查询虚拟目录与实际目录的对应关系,并将 URI 转换成实际的文件名后,才能读取文件并返回数据。即相对路径
例如虚拟目录:/~user2/sub-user2/sample.html 对应的 实际目录:/home/user2/sub-user2/sample.html
文件名转换是有特例的,比如 URI 中的路径省略了文件名的情况,这时服务器会读取事先设置好的默认文件名。例如在浏览器中输入如下网址。 http://www.glasscom.com/tone/ 上面这个网址省略了文件名,服务器会在末尾添加默认文件名,如下。 http://www.glasscom.com/tone/index.html 在这个例子中,index.html 这个文件名是在服务器中设置好的,服务器会将它添加在目录名的后面
返回响应消息
Web 服务器调用 Socket 库的 write,将响应消息交给协议栈
这时,需要告诉协议栈这个响应消息应该发给谁,但我们并不需要直接告知客户端的 IP 地址等信息,而是只需要给出表示通信使用的套接字的描述符就可以了
接下来,协议栈会将数据拆分成多个网络包,然后加上头部发送出去。这些包中包含接收方客户端的地址,它们将经过交换机和路由器的转发,通过互联网最终到达客户端
CGI 程序的工作
首先浏览器向 Web 服务器请求消息中加入一些数据
一种是在 HTML 文档的表单中加上 method="GET",通过 HTTP 的 GET 方法,将输入的数据作为参数添加在 URI 后面发送给服务器
另一种方法是在 HTML 文档的表单中加上 method="POST",将数据放在 HTTP 请求消息的消息体中发送给服务器
服务器收到请求消息后,首先,Web 服务器会检查 URI 指定的文件名,看一看这个文件是不是一个程序
判断方法是在 Web 服务器中事先设置好的,一般是通过文件的扩展名来进行判断,例如将 .cgi、.php 等扩展名的文件设置为程序,当遇到这些文件时,Web 服务器就会将它们作为程序来对待
如果访问的文件是一个程序,Web 服务器会委托操作系统运行这个程序,然后从请求消息中取出数据并交给运行的程序
如果方法为 GET,则将 URI 后面的参数传递给程序
如果方法为 POST,则将消息体中的数据传递给程序
接下来,运行的程序收到数据后会进行一系列处理,并将输出的数据返回给 Web 服务器
输出的数据一般来说会嵌入到 HTML 文档中,因此 Web 服务器可以直接将其作为响应消息返回给客户端。输出数据的内容是由运行的程序生成的,Web 服务器并不过问,也不会去改变程序输出的内容
服务器断开阶段
在 HTTP1.0 中,是服务器先发起断开操作
服务器程序会调用 Socket 库的 close,TCP 模块会生成一个控制位 FIN 为 1 的 TCP 头部,并委托 IP 模块发送给客户端
客户端收到这个包之后,会返回一个 ACK 号。接下来客户端调用 close,生成一个 FIN 为 1 的 TCP 头部发给服务器,服务器再返回 ACK 号,这时断开操作就完成了
当断开操作完成后,套接字会在经过一段时间后被删除
Web 服务器的访问控制
Web 服务器的访问控制规则主要有以下 3 种
客户端 IP 地址
客户端域名
用户名和密码
设定访问控制后服务器的工作过程
根据客户端 IP 地址设置的规则
在调用 accept 接受连接时,就已经知道客户端的 IP 地址了,只要检查其是否允许访问就可以了
根据客户端域名设置的规则
使用 DNS 服务器根据 IP 地址反查域名
收到客户端的请求消息后,Web 服务器会委托协议栈告知包的发送方 IP 地址
然后 Web 服务器用这个 IP 地址生成查询消息并发送给最近的 DNS 服务器
接下来,DNS 服务器找出负责管辖该 IP 地址的 DNS 服务器,并将查询转发给它
管辖服务器查询到相应的域名之后返回结果
然后 Web 服务器端的 DNS 服务器再将结果转发给 Web 服务器
为了保险起见,还需要用这个域名查询一下 IP 地址,看看结果与发送方 IP 地址是否一致
是因为有一种在 DNS 服务器上注册假域名的攻击方式,因此我们需要进行双重检查。这种方式需要和 DNS 服务器进行多次查询,整个过程比较耗时,因此 Web 服务器的响应速度也会变慢
根据用户名和密码
Web 服务器会向用户发送一条响应消息,告诉用户需要在请求消息中放入用户名和密码
浏览器收到这条响应消息后,会弹出一个输入用户名和密码的窗口,用户输入用户名和密码
输入后,浏览器将这些信息放入请求消息中重新发送给服务器
然后,Web 服务器查看接收到的用户名和密码与事先设置好的用户名和密码是否一致,以此判断是否允许访问,如果允许访问,则返回数据
浏览器显示内容
首先需要判断响应消息中的数据属于哪种类型。Web 可以处理的数据包括文字、图像、声音、视频等多种类型,每种数据的显示方法都不同,因此必须先要知道返回了什么类型的数据
可以根据响应消息开头的 Content-Type 头部字段的值来进行判断
Content-Type: text/html
“/”左边的部分称为“主类型”,表示数据的大分类
右边的“子类型”表示具体的数据类型
当数据类型为文本时,还需要判断编码方式。这时需要用 charset 附加表示文本编码方式的信息
Content-Type: text/html; charset=utf-8
utf-8 表示编码方式为 Unicode,如果是 euc-jp 就表示 EUC 编 码,iso-2022-jp 表示 JIS 编码,shift_jis 表示 JIS 编码
除了通过 Content-Type 判断数据类型,还需要检查 Content-Encoding 头部字段
如果消息中存放的内容是通过压缩或编码技术对原始数据进行转换得到的,那么 Content-Encoding 的值就表示具体的转换方式,通过这个字段的值,我们可以知道如何将消息中经过转换的数据还原成原始数据
接下来只要根据数据类型调用用于显示内容的程序,将数据显示出来就可以了
以 HTML 文档为例来介绍。HTML 文档通过标签表示文档的布局和字体等样式信息,浏览器需要解释这些标签的含义,按照指定的样式显示文档的内容。实际的显示操作是由操作系统来完成的,浏览器负责对操作系统发出指令,例如在屏幕上的什么位置显示什么文字、使用什么样的字体等
网卡
网卡驱动从 IP 模块获取包之后,会将其复制到网卡内的缓冲区中,然后向 MAC 模块发送发送包的命令,接下来就轮到 MAC 模块进行工作了
MAC模块
首先,MAC 模块将包从缓冲区中取出,并在开头加上报头和起始帧分界符,在末尾加上用于检测错误的帧校验序列
报头是一串像 10101010…这样 1 和 0 交替出现的比特序列,长度为 56 比特,它的作用是确定包的读取时机
时钟信号是以 10 Mbit/s 或者 100 Mbit/s 这种固定频率进行变化的,就像我们乘坐自动扶梯一样,只要对信号进行一段时间的观察,就可以找到其变化的周期。因此,我们不能一开始就发送包的数据,而是要在前面加上一段用来测量时钟信号的特殊信号,这就是报头的作用——时钟同步
起始帧分界符 SFD 用来确定帧(数据包)的起始位置,最后两个 Bit 为 11
末尾的 FCS 帧校验序列用来检查包传输过程中因噪声导致的波形紊乱、数据错误,它是一串 32 比特的序列,是通过一个公式对包中从头到尾的所有内容进行计算而得出来的
在包传输过程中,如果受到噪声的干扰而导致其中的数据发生了变化,那么接收方计算出的 FCS 和发送方计算出的 FCS 就会不同
然后就可以将包通过网线发送出去了。发送信号的操作分为两种
使用集线器的半双工模式
某一时刻只能进行发送或接收其中一种操作
为了避免信号碰撞,首先要判断网线中是否存在其他设备发送的信号
若发生信号碰撞,则发送方会发送一段阻塞信号,然后所有的发送操作会全 部停止
等待一段时间之后,网络中的设备会尝试重新发送信号。但如果所有设备的等待时间都相同,那肯定还会发生碰撞,因此必须让等待的时间相互错开。具体来说,等待时间是根据 MAC 地址生成一个随机数计算出来的
每次发生碰撞就将等待时间延长一倍,最多重试 10次,如果还是不行就报告通信错误
最好的解决方法:全双工
然后,MAC 模块从报头开始将数字信息按每个比特转换成电信号,由 PHY,或者叫 MAU 的信号收发模块发送出去
将数字信息转换为电信号的速率就是网络的传输速率
接下来,PHY(MAU)模块会将 MAC 模块产生的信号格式转换为可在网线上传输的格式,并通过网线发送出去
网线中的信号的样子
根据以太网的规格,两台设备之间的网线不能超过 100 米
在使用集线器的半双工模式以太网中,一台设备发送的信号会到达连接在集线器上的所有设备。这意味着无论是不是发给自己的信号都会通过接收线路传进来,因此接收操作的第一步就是不管三七二十一把这些信号全都收进来再说
首先,PHY(MAU)模块会将信号转换成通用格式并发送给 MAC 模块
MAC 模块再从头开始将信号转换为数字信息,并存放到缓冲区中
当到达信号的末尾时,还需要检查 FCS
如果 FCS 校验没有问题,接下来就要看一下 MAC 头部中接收方MAC 地址与网卡在初始化时分配给自己的 MAC 地址是否一致,以判断这个包是不是发给自己的
如果一致则将包放入缓冲区,MAC 模块任务完成,并通知计算机收到了一个数据包,即发出一个中断信号
现在的硬件设备都遵循即插即用规范自动设置中断号,我们没必要去关心中断号了
当产生中断信号时,CPU 会暂时挂起正在处理的任务,切换到操作系统中的中断处理程序
中断处理程序会调用网卡驱动,从网卡的缓冲区中取出收到的包
中断处理会判断数据包中 MAC 头部的以太类型,然后交给相应的协议栈
协议栈的处理,以 0800 协议类型(IP协议)为例
网卡驱动判断是 0800 IP协议类型后,会交给 TCP/IP 协议栈处理
IP模块会检查IP头部确认格式是否正确
格式没问题后查看接收方IP是不是自己
如果不是,IP模块会通过ICMP消息将错误告知发送方
如果接收方IP正确,则要进行分片重组
网线和局域网中只能传输小包,因此需要将大的包切分成多个小包。IP模块会将分片后的包暂存在内存空间,然后等待 IP 头部中具有相同 ID 的包全部到达,然后再根据 分片偏移量(fragment offset) 进行还原成原始包
接下来包会被交给TCP模块
TCP模块会根据 IP 头部中的接收方和发送方 IP 地址,以及 TCP 头部中的接收方和发送方端口号来查找对应的套接字。找到对应的套接字之后,就可以根据套接字中记录的通信状态,执行相应的操作
例如,如果包的内容是应用程序数据,则返回确认接收的包,并将数据放入缓冲区,等待应用程序来读取
如果是建立或断开连接的控制包,则返回相应的响应控制包,并告知应用程序建立和断开连接的操作状态
协议栈再判断这个包应该交给哪个应用程序
使用交换机的全双工模式
发送和接收同时并行
IP模块
网络包结构
IP 模块会添加 IP 头部和 MAC 头部这两种头部
头部
包含目的地址等控制信息
相当于快递的面单
IP头部tou
包含 IP 协议规定的、根据 IP 地址将包发往目的地所需的控制信息
最重要的内容就是 IP 地址,它表示这个包应该发到哪里去。这个地址是由 TCP 模块告知的,而 TCP 又是在执行连接操作时从应用程序那里获得这个地址的,因此这个地址的最初来源就是应用程序
发送方IP地址
如果只有一块网卡,那计算机就只有一个IP地址
IP 地址实际上并不是分配给计算机/路由器的,而是分配给网卡的。如果有多个网卡,每一块网卡都有自己的IP地址
如何判断应该把数据包交给哪块网卡?
使用IP表(路由表)
Interface 列,表示网卡等网络接口
Gateway 列(网关)表示下一个路由器的 IP 地址
Gateway(网关)在 TCP/IP 的世界里就是路由器的意思
路由器和 Windows 不一样,当包可以直接发送到最终接收方时,一般网关列是留空的
如果路由表中网关(Gateway)列为空,则 IP 头部中的接收方 IP 地址就是要转发到的目标地址
路由表的维护
MAC头部/以太网头部
包含通过以太网的局域网将包传输至最近的路由器所需的控制信息,是属于以太网头部
发送方 MAC 地址来源
MAC 地址是在网卡生产时写入 ROM 里的。在操作系统启动过程中对网卡进行初始化的时候才会读取网卡 ROM 中的 MAC 地址,然后就一直放在内存中以便调用
接收方 MAC 地址来源
要执行根据 IP 地址查询接收方 MAC 地址的操作:ARP
ARP原理:其实是广播的寻址方式,用广播对同一子网内所有设备提问:“×× 这个 IP 地址是谁的?请把你的 MAC 地址告诉我。”然后就会有人回答:“这个 IP 地址属于我,我的 MAC 地址是××××”
为节约在网络中的广播次数,会将查询结果放到一块叫作 ARP 缓存的内存空间中留着以后用,下次查询就先查 ARP 缓存
当 IP 地址发生变化时,ARP 缓存的内容就会和现实发生差异。为了防止这种问题的发生,ARP 缓存中的值在经过一段时间后会被删除,一般这个时间在几分钟左右
数据
委托方要发送给对方的数据
相当于快递里的货物
发送原理
首先,发送方将包的目的地,也就是要访问的服务器的 IP 地址写入 IP 头部中
IP 协议根据这一地址查找包的传输方向,从而找到下一个路由器的位置
接下来 IP 协议会查找下一个路由器的以太网地址(MAC地址),并将这个地址写入MAC头部
最后委托以太网协议把包传输过去,有了MAC地址以太网就知道要将这个包发到哪一个路由器上了
封装好的包会被交给网络硬件,传递给网卡的网络包是一连串0和1组成的数字信息
网卡再将数字信息转化为电信号或光信号,然后通过网线或光纤发送出去
控制信息
分为两类
客户端和服务器相互联络时交换的控制信息
这些信息会被添加在客户端与服务器之间传递的网络包的开头
TCP控制信息/TCP头部
只有端口号,未包含 IP 地址,IP 地址在 IP头部
基础信息一共160bit,即20byte,还可加上可选字段
保存在套接字中,用来控制协议栈操作的信息
应用程序传递来的信息以及从通信对象接收到的信息都会保存在这里
协议栈的运行原理(邮局是如何派送信息的)
应用程序(浏览器)向操作系统内部的协议栈发出委托时,需要按照指定的顺序来调用 Socket 库中的程序组件
创建套接字(创建)
收发数据的两台计算机之间连接了一条数据通道,数据沿着这条通道流动,最终到达目的地
首先要建立数据流通的管道,建立管道的关键是确定数据出入口,这些出入口称为套接字。先创建套接字,再将套接字连接起来形成管道
套接字具体是什么?在协议栈内部有一块用于存放控制信息的内存空间,这里记录了用于控制通信操作的控制信息,例如通信对象的 IP 地址、端口号、通信操作的进行状态等,这些控制信息就是套接字的实体,或者说存放控制信息的内存空间就是套接字的实体。创建套接字操作的本质是分配用于套接字的内存空间
套接字中记录了用于控制通信操作的各种控制信息,协议栈则需要根据这些信息判断下一步的行动:协议栈是根据套接字中记录的控制信息来工作的
真正的套接字,用netstat命令显示
当创建套接字时,就会在这里增加一行新的控制信息,赋予”即将开始通信“的状态(LISTENING),并进行通信的准备工作
服务器一方先创建套接字,然后等待客户端向该套接字连接管道
客户端也会创建一个套接字,然后从该套接字延伸出管道,最后管道连接到服务器端的套接字上。当双方的套接字连接起来之后,通信准备就完成了
客户端的协议栈创建套接字:调用Socket库中的socket程序组件。
创建套接字内存空间的语句:int socket(int domain, int type, int protocol)
domian 的值
PT_INET
ipv4地址
PT_INET6
ipv6地址
PT_LOCAL
本地地址
type 的值
SOCK_STREAM
字节流,对应TCP
SOCK_DGRAM
数据报,对应UDP
SOCK_RAM
表示原始套接字
protocol
已被废弃,一般直接写0
套接字创建完成后协议栈会返回一个描述符,用来识别不同的套接字:例如打开两个浏览器窗口访问两台Web服务器就需要创建两个不同的套接字。在这样的情况下,我们就需要一种方法来识别出某个特定的套接字。这种方法就是描述符,我们可以将描述符理解成给某个套接字分配的编号(标明这个管道口的管道编号)
同时会为这个套接字随便分配一个端口号
将管道连接到服务端的套接字上(连接)
调用Socket库中的connect程序组件,需要指定描述符、服务器IP地址和端口号这三个参数
描述符
应用程序用来识别套接字的机制
服务器IP地址
端口号
客户端和服务器之间用来识别对方套接字的机制
连接操作的对象,也就是管道的另一头是某个具体的套接字。 IP地址只具体到xx号xx室,但是xx室里面有很多个人,要找到这个人就用端口号。当同时指定IP和端口号时,就可以明确识别出某台具体的计算机上的某个具体套接字
当协议栈执行连接操作时,会将这个随便分配的端口号通知给服务器
服务器就知道要把数据传到哪个管道口(套接字)了
服务器上所使用的端口号是根据应用的种类事先规定好的,仅此而已。比如 Web 是 80 号端口,电子邮件是 25 号端口
为什么不用描述符?
因为描述符是和委托创建套接字的应用程序进行交互时使用的,并不是用来告诉网络连接的另一方的,因此另一方并不知道这个描述符(没有出管道前是看不到管道编号的)如果说描述符是用来在一台计算机内部识别套接字的机制,那么端口号就是用来让通信的另一方能够识别出套接字的机制
连接的实际过程
创建连接关系的语句: int connect (int sockfd, const struct sockaddr *addr, socklen_t addrlen)
sockfd
socket文件描述符
sockaddr *addr
传入参数,指定服务器端地址信息,含IP地址和端口号
socklen_t addrlen
传入sizeof(addr)大小
调用connet语句后,服务器的IP地址和端口号信息就会被传入协议栈中的TCP模块
TCP模块就会与该IP地址交换控制信息
首先客户端TCP模块创建一个包含表示开始数据收发操作的控制信息的头部,重点关注IP地址和端口号,还有数据块的字节数,将这段数据随机赋予一个“序号”
然后将发送方的头部控制信息中的SYN位设置为1,表示该发送方可以连接,在设置SYN的同时还需要设置序号字段的值
头部创建好后,TCP模块会将信息传递给IP模块并委托它进行发送(IP模块相当于邮递员)
IP模块发送网络包后,网络包通过网络到达服务器,服务器IP模块接收到该网络包后传递给TCP模块,服务器TCP模块根据头部信息找到端口号对应套接字,找到后套接字中写入相应信息并改状态为“正在连接”
接着服务器TCP模块会返回响应,同样需要在头部设置发送方和接收方端口号以及SYN比特,还需要将ACK控制位设为1,表明接收到了相应网络包
服务器返回响应后,客户端也需要将ACK控制位设为1并发回服务器,告诉服务器刚刚的响应包已收到。
最后,套接字就已经进入随时可以收发数据的状态了,就可以认为这时有一根管子把两个套接字连接了起来
首先TCP模块会将应用程序要发送的数据切割成一块一块的数据块,算好每一块数据相当于从头开始的第几个字节
例如第二个数据块,相当于从头开始的1461个字节
在发送这一数据块时,会将算好的字节数写在TCP头部
上一步中,TCP模块算好了第二个数据块是从1461个字节开始,那序号就为1461,写在头部控制信息里
然后告诉接收方数据长度
接收方可以根据接收到的网络包减去头部长度得到数据长度
假设数据长度为1460
发送端:现在发送字节(序号)为1461的数据块,长度为1460 接收端:到2921字节(序号)之前的数据我都收到了,然后返回2921这个ACK号
这个返回 ACK 号的操作被称为确认响应,通过这种方式,发送端就能知道接收端收到了多少数据,有没有遗漏
在得到对方确认之前,发送过的包都会保存在发送缓冲区中。如果对方没有返回某些包对应 的 ACK 号,那么就重新发送这些包
但并不是没有返回ACK号就马上重传,TCP模块会等待一段时间,这个时间是动态的,为0.5s~1s,TCP根据ACK号返回时间动态调整等待时间
为了减少等待ACK号时浪费的时间,TCP采用滑动窗口方式来管理数据发送和ACK号
所谓滑动窗口,就是在发送一个包之后,不等待 ACK 号返回,而是直接发送后续的一系列包。这样一来,等待 ACK 号的这段时间就被有效利用起来了
滑动窗口方式可能会出现发送包频率超过接收方处理能力的情况,导致溢出
解决办法:接收方告诉发送方自己最多能接收多少数据,然后发送方根据这个值对数据发送操作进行控制。这个值称为窗口大小
接收方从缓冲区中取出数据传递给应用程序后更新窗口大小
在等待发送ACK号时正好需要更新窗口,这时就可以把ACK号和窗口更新放在一个包里发送,从而减少包的数量
提高发送窗口大小和 ACK 号 效率的原理:省略中间过程,只要发送最终结果
可以减少 ACK 号包的数量因为 ACK 号表示的是已收到的数据量,也就是说,它是告诉发送方目前已接收的数据的最后位置在哪里,因此当需要连续发送 ACK 号时,只要发送最后一个 ACK 号就可以了,中间的可以全部省略
收发数据(通信)
从应用程序调用write将要发送的数据交给协议栈开始
协议栈不关心应用程序传来的数据是什么内容
协议栈并不是一收到数据就马上发送出去,而是会将数据存放在内部的发送缓冲区中,并等待应用程序的下一段数据
如果一收到数据就马上发送出去,就可能会发送大量的小包,导致网络效率下降,因此需要在数据积累到一定量时再发送出去。至于要积累多少数据才能发送,则根据以下几个要素判断
数据长度
MTU
一个网络包的最大长度,以太网中一般为 1500 字节
MSS
除去头部之后,一个网络包所能容纳的 TCP 数据的最大长度
TCP和IP头部加起来一般是40字节
SFD
起始帧分界符
FCS
帧校验序列
时间
当应用程序们发送数据的频率不高时,为减少延迟,不必每次都等到缓冲区数据长度达到MSS,协议栈内部计时器计满之后就会把网络包发送出去
如果仅靠协议栈来判断发送的时机可能会带来一些问题,因此协议栈也给应用程序保留了控制发送时机的余地。应用程序在发送数据时可以指定一些选项,比如如果指定“不等待填满缓冲区直接发送”,则协议栈就会按照要求直接发送数据。像浏览器这种会话型的应用程序在向服务器发送数据时,等待填满发送缓冲区导致延迟会产生很大影响,因此一般会使用直接发送的选项
例如一篇长文的情况下,发送缓冲区中的数据就会超过 MSS 的长度,这时我们不需要继续等待后面的数据了。发送缓冲区中的数据会被以MSS长度为单位进行拆分,拆分出来的每块数据会被放进单独的网络包中
浏览器在委托协议栈发送请求消息之后,会调用 read 程序来获取响应消息
断开管道并删除套接字(断开)
可由客户端或服务器任意一方发起断开,完成数据发送的一方会发起断开过程
调用close进入断开阶段,将控制位中的FIN bit设为1
服务器→客户端:我数据都发完了,我会调用close程序,生成断开信息,在TCP头部将控制位FIN=1
客户端→服务器:收到服务器发来的 FIN=1 后,返回 ACK 号给服务器
然后应用程序会调用 read 来读取数据,协议栈会告诉应用程序来自服务器的数据已经全部收到了
应用程序会调用 close 来结束数据收发操作,同样生成FIN = 1的TCP包,发送给服务器,服务器收到后返回 ACK 号
至此,客户端和服务器通信全部结束
通信结束后会过一会后再删除套接字,以防因为网络延迟,FIN=1被新的应用程序创建的相同端口号接收,直接就被断开了
DNS工作过程
DNS服务器保存的记录
其他需要调用操作系统网络功能的应用程序
协议栈
协议栈:操作系统内部的网络控制软件,也叫“协议驱动”“TCP/IP 驱动”等
相当于是邮局
解析器委托协议栈发送一条获取IP地址的消息给DNS
接收DNS返回的消息并传送给解析器
解析器
生成发送给DNS的查询消息并发布委托给协议栈
查询消息包含的信息
域名
服务器、邮件服务器(邮件地址中@后面的部分)的名称
class
用来识别网络的信息,最初是用于区分互联网以外的其他网络,不过目前除了互联网并没有其他网络
记录类型
表示域名对应何种类型的记录。例如,当类型为A时,表示域名对应的是IP地址;当类型为MX时,表示域名对应的是邮件服务器。对于不同的记录类型,服务器向客户端返回的信息也会不同
接收DNS的返回消息,取出IP地址放在内存地址
浏览器