网络是怎样连接的
Last updated
Was this helpful?
Last updated
Was this helpful?
需要在浏览器和web服务器之间通信的机制。
要正确送达通信的对象。因为网络中计算机很多
传输内容要准确,不能丢失或损坏。
即,要把0和1准确搬运到目的地。
把数字信息分割成一个个小块,然后装入“包”packet中运送。相当于信件的运送包裹。
交换机和路由器相当于邮局或快递公司的分拣处理区。根据包的头部信息,来把包接力送到目的地。
网址,url,uniform resource locator。
开头是浏览器要使用的访问方法
http访问web服务器;ftp访问ftp服务器
有文件访问文件,如果是目录就访问默认的index或default
目录和文件不能重名,或者说目录就是文件
客户端和服务器之间交互消息的内容和步骤
访问什么:URI。就是“/dir1/file1.html ”这种
服务器要进行怎样操作:方法。
GET:获取文件内容;返回程序的输出数据
POST:发送数据
PUT:替换URI指定的文件,不存在就创建
DELETE:删除文件
get方法能发送的数据只有几百直接,发更多数据需要用post
先返回数据
如果包含图片,在相应位置插入图片标签,留出空间。
然后再次向服务器请求对应的图片。
每次只能获取一个文件,即一张图片一个url
浏览器将收集到的内容贴在页面上
浏览器 需要 解析网址、生成http消息、查询服务器对应的ip地址。
再通过 操作系统,把消息发送到网络。
操作系统看不懂域名,需要浏览器先翻译好ip地址。
多个 子网 通过 路由器 ,连接成了一个大的网络
子网 ,是几台计算机通过 集线器 连接而成。
网络中所有的设备都会被分配一个门牌号,就叫ip地址。
数据从计算机发出,到集线器,转发到最近的路由器,再转发到下一个路由器。不断转发直至到达目的地。
ip地址,是32比特数字。8比特一组分4组。变成10进制然后圆点隔开。
ip地址分为 网络号 和 主机号 两部分,分配关系用子网掩码来表示,1是网络号,0是主机号。
简写子网掩码:一共有多少个1
主机号全0:整个子网
主机号全1:向子网上所有设备发送
域名好记,但往往就很长,拿着这个找地址就很麻烦。
因此,人用域名,dns翻译成ip,路由器用ip
浏览器向最近dns服务器查询ip,查不到就继续向上查。
如何查询?
电脑上dns客户端,叫dns解析器。查ip就是域名解析
解析器包含在操作系统的socket库中。
socket库
库是一堆通用程序组件的集合。socket库是网络开发的标准库
简言之,就是掉一个api,传入域名,传出的就是ip地址了。
dns服务器地址是事先设置好的,不需要再去查询了。
客户端查询消息:
域名
邮件是@后的部分
类型
A是ip地址(address)
mx是邮件(mail exchange)
域名层次结构
根据域名分层保存。一个句点一层,一层被称为一个 域 。如com域
一个域的信息,作为一个 整体 存在dns服务器中。
一个域 可以划分多个 子域
域名中,越靠右层次越高。
如www.nik.co.jp
,jp是分给日本的域;co是日本国内的域;nik是某公司的域;www是服务器名称。
最上层是 根域,没有名字,要表示的话就在最后加一个点,如www.nik.co.jp.
一般忽略
查ip的时候,也是从右往左查。因为上级域会记录下级域的dns服务器信息。【简言之就一层层下去查】
根域dns服务器,保存在所有dns服务器中。里面一共存了13个ip地址。
现实中可能上下级域在同一个dns服务器上;也可能一个域在多个服务器上。
缓存
记住之前查询过的域名,存在或不存在等。设定一个过期时间。
浏览器等应用程序,不会自己向ip地址发送消息。
要委托操作系统的内部协议栈,来发送数字信息。
委托过程:
服务器创建套接字(两端接口),等待客户端连接
客户端连接到服务器端
收发数据,通信
断开链接,删除套接字
创建套接字
socket创建完后会返回一个描述符,用来区分不同的套接字。
因为同时可能有很多个连接,如一个程序两个页面就可能连两台服务器。
描述符是socket和应用程序交互,数据收发的通道。
连接阶段
连接需要:描述符、ip地址、端口号
描述符,是计算机内部识别套接字
端口号,是外部的另一方识别套接字
服务器的端口号是固定的,全球统一。
客户端的端口号,是在创建套接字的时候就分配了一个,连接的时候告诉服务器端就行了。
【客户端,生成套接字,给应用程序返回描述符,给服务器端返回端口号】
【感觉套接字,就是双方通信的一层抽象】
通信阶段
应用程序把数据放在自己的内存里,然后送到套接字里面,socket送到服务器端对应的套接字。
服务器端返回消息,会存放到应用程序的内存,里面的接受缓存区,这就相当于给应用程序了。
断开阶段
哪一方断开,另一方就会收到通知,然后也断开,把套接字删除
协议栈如何收发数据
应用程序,通过socket固定的api来收发数据。
操作系统内,tcp/udp协议,接受委托执行收发数据操作
ip负责把数据切小块,发送出去
网卡等硬件就是实际完成收发操作的。
调用socket创建套接字,会在协议栈内部开辟一块空间,用来存放控制信息。里面一行就是一个套接字。
里面存放如,对方ip和端口;等待重发时间等等信息。
协议栈,就根据这些配置/套接字,来工作。
【换言之,就是存放了该怎样通信的信息】
协议栈把本地套接字与服务器套接字进行连接。
连接是什么?网线一直连着也一直有信号。
连接,就是双方交换控制信息。即能够完成收发操作的必要信息,比如ip地址和端口等。
刚创建套接字,是不知道通信对象是谁的。
应用程序把对方ip地址、端口号,告诉协议栈,写进控制信息里面
对面服务器端也不知道和谁连,于是客户端向服务器端发送消息,告诉自己的ip、端口等等信息
双方交换了控制信息,就完成了连接。
此外,还需要一块用来临时存放收发数据的内存空间,即缓冲区。也是在连接中分配的。
【连接服务器,也就是完成连接的准备】
可以分为两类:
客户端和服务器相互联络时,交换的控制信息。
被记录在互联网包的开头,即头部。
收发数据的缓存
协议栈的内存空间,中记录的信息。
服务器ip地址和端口号,传给协议栈中的tcp模块
客户端的tcp模块,创建tcp的控制信息头。表示开始数据收发(SYN=1) 里面包含客户端和服务器端的端口号
信息传给ip模块,专门来发送网络包
网络包到达服务器,服务器的ip模块接收,然后转给tcp模块
服务器tcp模块解析tcp头,找到客户端的端口号对应的套接字
然后服务器在自己端口中,找一个相同的套接字,就算是连上了。
服务器返回数据给客户端
服务器tcp模块设置SYN=1,ACK=1表示收到了网络包
服务器tcp给ip,ip传,客户端ip收,转给客户端tcp模块
客户端tcp拆开看连接是否成功,成功的话把服务器ip、端口号等写进自己的套接字
然后客户端再发条消息给服务器端,说明自己收到了内容,可以开始通信了
也是同理,tcp/ip -> ip/tcp
这样就建立了连接
协议栈会先把数据放在内存的,发送缓冲区中。类似于一个缓存,尽量每次发包都用尽包的长度。
MTU表示包最大长度,包括头;不包括头叫MSS
当然不能等太久发,还有个计时器,一定时间后也会发包。
【感觉有点像公交车,定时发车,人满也发车】
应用程序在发送的时候有可选项,即立刻发送。
每个包前面都要加头,后面跟着拆后的数据
tcp头里面会写上序号,收到后对方会拼起来。
ack会返回,某序号之前的数据都已经收到了。
不过初始值是随机的,为了防止别人攻击。
因此在简历连接的时候,还要告诉双方自己的初始值。【这时候拦截一下。。那不还是知道了吗】
返回确认信息,总是要发一下ack号。如果没收到ack号,就要重新发送。
因此网卡、集线器、路由器都没有错误补偿机制,一旦有错就丢弃包,对方也会重新发过来。
如果网断了,几次重新传都没有ack返回,就会强制结束通信,并向应用程序报错。
ack返回慢,就延长等待时间;反正缩短。
不然网络堵塞还疯狂传,就很麻烦。
发一次等一个ack,太浪费。可以一次发多个。
接收到数据,会先放在接收的缓冲区中。发太多就有可能超过对方处理数据的能力,缓冲区溢出。
连接准备时,要先和发送方说自己最多能接受多少数据,写在tcp头部当中
能接受最大数据量,叫窗口大小
每次处理完数据,要告诉下发送方已经处理了多少,对方可以算一下最多还能发多少。
也就是更新一下窗口大小
发送缓存
ack是告诉发送方,自己最后连续的数据到了哪个序号。因此多个ack可以合并
同理,多个剩余空间的窗口大小,也可以合并。
所以都会缓存一下在一起发出去。
处理数据
检查数据和tcp头部,没问题就发送返回ack号
协议栈从接受缓存区当中取出数据,给应用程序。
如果缓存区里面没有数据,就暂时挂起,协议栈去处理其他事情,有了再来拿。【协议栈是搬运工的样子】
所有数据发送完毕的一方会发起断开过程。具体而言就是把fin=1传给对方。对方收到就返回ack。
比如服务器发fin,意思是自己不会再发东西给客户端了,如果客户端发东西给服务器端,也会接受了
相当于这个连接半关闭了
如果对方接受缓冲区里面还有没处理的,就会全部给应用程序
套接字不会马上删除,而是会等待一段时间后再删除。等待可能重传的包全部结束后,再删除。
这是为了防止误操作。
比如,客户端返回的ack丢了,这样的话对方就会再发一次fin。而此时客户端的套接字如果已经删掉了,对应端口就空了。如果恰好被分配到了新的套接字,就会因为这个fin而被删掉。
1创建套接字
服务器是一直有,就等着客户端
客户端需要建立连接,就回创建一个套接字。
2 连接准备/三次握手
客户端发送tcp包
syn=1
初始序号
窗口大小
服务器端返回
ack=1
初始序号
窗口大小
客户端返回
ack=1
3 数据收发
tcp把消息切分,每一小块前面装上tcp头。
包含序号、上一个包的ack。
如果有清理接受缓冲区,那就加上新的窗口大小
4 断开操作/四次挥手
如果服务器先发送完,就发送fin=1给客户端
客户端返回ack。
此时通道半关闭,服务器不再发,但可以收
客户端不再发也发一个fin给客户端
然后客户端返回ack
套接字再各自协议栈内存中存一会,等到重发时间过了,再删掉
ip模块是如何收发数据的?
tcp模块把数据加上tcp头后,就委托ip模块发数据。需要指定对方的ip地址。
ip模块就是一个路口,具体的工作由集线器、路由器等网络设备来完成。
ip模块会再往前面加上两个头:ip头和mac头
ip头,用于ip协议。里面有对方的ip地址,换言之存了最终目的地。
路由器根据ip协议,查ip表/路由表,获得下一个路由器的ip。然后写入mac头当中。
集线器也查表,查以太网表,具体传输方向。根据以太网协议将包传输到下一个设备。
【感觉,ip头存终点,mac头存下一个中转路由】
【简言之路由器负责查下一个路由的ip,集线器负责查该怎么去】
这么分工是因为,不仅有以太网/mac地址,还肯努次无线局域网、adsl等等。【传输的方法有很多,但传输的工具人都是集线器】
硬件过程
ip模块加上了mac头和ip头,交给 网卡
网卡吧数字信息转换成电信号或者光信号,然后传给下一个集线器/路由器。
他们翻译成数字信号、查表,再转成电/光,然后转给下一个。
接受的时候也是类似
网卡转光/电为数字,传给ip模块,然后ip给tcp,然后tcp拆了头,把数据放到接受缓存区。
ip模块就是一个收发快递的,不管包裹内容(tcp头和数据)是什么,只管传
自己和对方的ip地址
ip模块不校验地址是不是正确,只负责发送和接受。
确定要用哪块网卡来发信息
协议号
确定包的内容来自哪个模块。如果http请求通过tcp传输,会写06表明是来自tcp
以太网不能用tcp/ip。以太网的地址是mac地址。
mac头就是给以太网使用的,要写好双方的mac地址
发送方的mac地址,在网卡里面
一般操作系统启动的时候,网卡驱动程序,会读取网卡mac地址,放在内存里面。
先查一下ARP缓存,没有的话,就在以太网的子网里面,对所有设备广播一下,问一下这个ip地址对应的mac地址是啥。
就会有人应答,就获取到了,放在ARP缓存当中。
【如果不在一个子网里面,就要靠路由器来转发,发到ip地址所在的子网里面,再广播一下】
当ip地址变化,arp缓存就会和实际内容有冲突,因此arp缓存会在几分钟左右后被删除
很有可能在ip地址刚改变的几分钟之内发生通信异常。
【ip地址可变,而mac地址不可变。ip更多用外网,而mac更多用内网/局域网】
以太网本质就是一根网线。一台计算机发送信号,会到达所有的设备。
因此要在信号开头加上接受者的信息,即mac头
里面要写双方mac地址和包类型和内容等
有了交换式集线器/交换机,信号的碰撞就不怎么会发生了。因为会根据mac地址精准发送了。
以太网/无线局域网性质:
接收方mac地址
发送方mac地址
以太类型,区分包内容
硬件都要有驱动程序。一般由厂商开发。
硬件也都需要初始化,在操作系统启动的时候会初始化
如错误检查、初始设置、获取网卡mac地址等等。
一块网卡一个mac地址,这是全球唯一的,在生产的时候写入网卡的rom
网卡驱动,从ip模块获取包,会将其复制到网卡内的缓冲区,然后告知网卡的mac模块,要开始发送包了。
mac模块会把包从缓冲区中取出,前面加上报头和起始帧分界符,后面加上帧校验序列
报头:用来同步时钟信号
一般是测量电压/电流变化,来确定0和1。如上边沿或下边沿触发。
如果是连续的1或0,就没法检测。而且距离远的话,传输会有时间差。
因此要把数据信号和时钟信号,叠加在一起发送出去。
对方根据报头,来同步时钟信号,再减出数据信号。
起始帧分界符
接收方会知道,从这个帧开始,提取网络包数据。
分界符会和之前有少许变化
fcs帧校验序列
类似于磁盘中使用的crc错误校验码,用来判断数据有没有错误。
会通过一个公式把包从头到尾所有内容进行计算而得出。
集线器,半双工模式
半双工,就是只能传输或只能接受。
交换机,全双工模式。
可以同时发送和接受,就没那么多幺蛾子
半双工模式:
如果线路中有信号,就等待;没信号了就开始传输
以太网不会处理信号有没有收到,只管发。
mac模块把数字信号转换成电信号,转换速率就是网络传输速率。
由PHY(也有的叫MAU)模块,发送出去。
PHY模块,是用来格式转换的。
以太网对不同网线类型,规定了对应的速率和信号格式。PHY就转换格式
此外PHY还要监控接受线路有没有信号进来。
信号碰撞
如果发送过程中,有别的设备也在发送,就会发生信号碰撞
两组信号叠加,无法区分彼此
此时发送终止,发送阻塞信号,通知其他设备有碰撞。
一般所有设备都会停止发送。
然后根据mac地址会生成随机数,尝试重新发送信号。
再冲突,就等待时间延长一倍。最多十次不行就报告通信错误。
半双工模式下,只要有人发了数据,你就会收到。
因此第一步就是把数据全部收进来。
网卡
PHY模块
根据报头,同步时钟
找到起始帧分界符,后面的信号转换成数字信息。
PHY模块工作,转换格式后交给MAC模块
mac模块
检查末尾的FCS,看看传输的内容对不对
如果不对,就丢弃这个包,假装没收到
检查mac头,这个包是不是给自己的
和网卡的mac地址比较一下,不一样就丢弃
一样的话放入缓冲区中
网卡通知计算机收到了一个包
中断
网卡向扩展总线的中断信号线发送信号,cpu收到中断,会暂时挂起正在处理的任务,切换到中断处理程序。
调用网卡驱动,执行接受。
网卡驱动绑定了网卡的中断号,因此网卡一发出中断请求,网卡驱动就自动调用了。
网卡驱动
网卡驱动从网卡缓冲区中取出包,通过mac头判断协议的以太类型,交给对应协议栈。
多数为tcp/ip协议,对应是0080。
不存在对应协议栈,就直接丢弃。
tcp/ip协议栈
ip模块
检查ip头
看包接收方的ip地址是不是自己(网卡的ip地址)。是就接收。
如果不是,客户端就将错误返回给对方;服务器会像路由器一样,将包转发给对应的ip地址。
分片重组
传输的都是小包,重组成原始包。
接受后暂存在内存空间,等待ip头对应id全部到达,再根据偏移量拼起来。
tcp模块
找到对应套接字
查ip头里面的ip地址、自己ip地址
理论上tcp模块不应该查ip头,但如果是由ip模块传参过来,那么就会抬高成本,因为这样互相查很频繁。所以就允许越界查询
双方端口号
如果是建立连接/断开链接的 控制包,就返回相应控制包,并通知对应应用程序操作状态。
如果是应用程序数据,返回确认接收的包,数据放入缓冲区,告知应用程序等待来取
tcp要确保 可靠。每次发送都要确认对方是否收到。但不是所有场景需要用。
如,视频/音频传输;在线游戏的数据;dns查ip地址等
数据很短,一个包就能装下
重发也就是重发整个包,也不需要ip模块来分块
传输缺了一些包,也是能接受的。
实时性要求比较高,重发也没意义
视频已经卡了之类的
不需要建立和断开连接
不需要分块,加上udp头就能发
接受只需要双方ip和端口号
udp经常被防火墙阻止,就不得不用tcp了
计算机发出的网络包,通过 集线器、路由器 等设备转发,最终到达目的地
转发设备,会根据 ip头 里面的控制信息,查表,发到对应目的地。剩下的tcp头以内的,都被视为数据
网卡PHY(MAU)模块发出电信号,传输过程会遇到,信号衰减、失真 和 噪声。
信号衰减:幅度变小
网线越长,能量损失越大,信号衰减越严重。
失真:拐角变圆
电信号本质是正负电压的变化,频率越高,正负电压变化越大,释放更多电磁波,损失更多能量。
拐角变化最大,损失最多,就会变圆
噪声
变化的磁场会生成电场,生成感应电流,可能与原来电信号不同,导致失真。
用 双绞线 来降噪
外源性:来自外界设备的电磁波
一根导线相邻两个圈,产生的电流方向相反,整体看可以抵消
内源性:相邻传输信号线上泄漏的电磁波,串扰
需要让 扭绞间距(节距)有一定差异,这样产生噪声的方向相反,可以抵消。
其他手段:隔板、金属屏蔽网等
集线器会把包,发送到以太网中的全部设备中。不管对错。
收发双方,用的接口都是RJ-45,接受的模块都是PHY
因此想要接收数据,就要 交叉接线。一方输出进入另一方的输入。
集线器的MDI/MDI-X开关,切换输入/输出
反接信号线
集线器,用中继电路,广播到所有端口,到达所有连接的设备。
原封不动的广播,有错也不管。
交换机里面相当于有网卡,不过没有对应的mac地址,因为不是计算机。
操作就是通过网卡导入数据,查表,转发到对应端口的网卡上,再发出去。
网卡进入的操作
RJ-45
PHY接收,转换通用格式
mac,转换数字信号、FCS校验错误
放到缓冲区(内存)中
网卡输出操作相反。
如果是半双工,就要检查一下有没有人在传输,不然就碰撞了。
mac地址,和交换机的端口,一一对应
这个表记录的对应情况,有时效,过期删除
每次有信号传进来,刷新对应记录
新连接的电脑,一开始的建立连接的请求,就会刷新对应记录
如果目标端口,和传入的端口,是一个端口,就丢弃
不然就形成永动了
如果表里找不到,就全局广播,除了输入信息的源端口。
把相应的包写入地址表
也有地址叫 广播地址,发过来直接广播。
交换机特有,同时进行发送和接收
双绞线的发送和接收信号是独立的;交换机端口+网卡,发送和接收也是独立的。
没有数据的时候,会填充连接脉冲
检测对方是否连接,是否正常工作(网卡等等)
网线旁边绿色的灯
自身状态:能支持的工作模式、传输速率
双方根据能支持的最高速率来匹配。
路由器也是查表,然后转发到下一个路由器。
路由器基于ip设计,交换机基于以太网设计的。
转发模块
负责判断包的转发目的地。类似于ip模块
查路由表。
端口模块
负责包的收发。类似于网卡
不同硬件端口可以支持收发不同的网络
计算机网卡主要支持:以太网、无线局域网
互联网还包括:ADSL, FTTH,宽带专线等等。
路由器端口,都具有mac地址和ip地址,身份相当于计算机。
目标ip地址
子网掩码
子网掩码为1的,对应ip地址是网络号,剩下的是主机号。
路由器只找网络号。【相当于只指路给大区,不具体到那个机器】
如果几个网络号归一个路由器管,那么还会把多条记录合并成一条。
网关
接口/端口
跃点计数
距离目标ip要跳转多少次,越小距离越近
mac表是每次连接的时候自动维护
路由表维护和转发是分开的
可以手动维护,也可以自行维护
只要是以太网,那么端口的硬件和收发操作都会和网卡是一样的。
丢弃mac头
因为其作用就是把包送到路由器
查表转发
子网掩码1的数越多,优先匹配 因为跳转后的主机数量就会越少
跃点计数,少的优先匹配
无法找到匹配记录,就发给 默认路由、默认网关
子网掩码0.0.0.0,换言之优先级最低
TTL -1
每个包都有有效期,记录在ip头里面,即TTL, time to Live。
一般64或128,每经过一个路由器就减1,变成0后就丢弃。
这是为了防止死循环
拆分数据
输出端口的最大长度,可能小于输入端口
如果ip头中记录,可以分片,就分片;不然丢弃,然后返回报错
tcp头+数据,对ip来说就是数据。
每一段前面都会加一个ip头
这就需要重新计算校验和,不过拍以太网通信线路本身错误校验很强大,一般没人管这个值。
发送
不同端口的发送方法不同
如果是以太网:
根据下一个ip,arp缓存/arp查对方mac
如果没有记录下一个ip,说明下一站就是目的地,就把ip头里面的目标ip当作下一个ip
mac地址、以太类型,写入ip头
转成电信号,发送
路由器负责指挥往哪传,交换机负责具体传输。
路由器的ip,负责找到下一个路由器在哪;交换机具体把包传到下一个路由器。
交换机不一定通过以太网传,也可以无线局域网等。
不同网络,执行传输方法不同,但都是靠ip来指挥。
路由器附加两个功能:地址转换、包过滤
本来互联网,是一台设备一个地址,但很快地址就不够用了。地址重复就会导致数据传输出错。
提出的解决方法,是构建内网和外网。
把一些设备聚在一起变成内网,然后他们相互连接,对外而言,他们就是一个ip节点。这样就能无限扩展了。
两个内网互不干涉,因此也就能取相同的ip地址,反正也访问不到。
在内网内,叫私有地址;内网外,叫公有地址
内网可以用的ip,就是当年分ip剩下的。。然后就专门给内网用了。
路由器的地址转换,就是把ip地址和端口号,改写成内网的ip地址和端口号。也是一个查表转换的过程
对外,就是同一个ip地址+不同端口号;
对内,就把不同端口号,转换成对应ip地址+端口号。这是为了增加内网的设备数量。
内网访问互联网,那么就可以直接把对应写进表里面
路由器会随机选一个空闲端口来匹配公有地址。
互联网访问内网,除非有连接,不然是找不到对应的设备。
只能向通信的端口发送网络包。
这样可以防止非法入侵。除非主动允许,不然无法进入。
也可以设置默认路由,即专门和外网访问的服务器,手动添加公私对应的ip
对包进行转发的时候,根据mac头、ip头、tcp头内容,根据规则决定是否转发还是丢弃。
这是 防火墙 的主要原理。
互联网基本结构,和家庭、公司网络,是相同的
不同点:
距离很远,以太网线无法连接;
路由表维护方式不同
通过 互联网接入路由器,就进入了互联网【类似于互联网入口】
接入网,是连接 互联网 与 家庭、公司网络 的通信线路
ADSL, FTTH等
不对称数字用户线。假设在电线杆上的金属电话线,上传/下载速率不同
互联网接入路由器,丢弃mac头,根据ip查表转发
以太网:加上mac头、PPPoE头、PPP头
简言之,不同通信线路用不同的头。电话线要用PPP头,转成电信号用PPPoE协议
发给ADSL Modem,即调制解调器
作用是拆分数据成很多小格子,成为信元。用ATM技术,用于电话线传输。
其实不用拆分,但很多运营商已经投入了很多钱在ATM上,所以就用了
转换成电信号
方波容易失真,因此采用正弦波。转换被叫做 调制
振幅调制。不同振幅代表0/1
四个振幅级别,可以表示四个数00/01/10/11
相位调制,不同相位表示0/1
相位也可以划分很多个
划分太细容易失真
两个联合起来,一个波就可以表达很多信息,相当于提高传输效率
多个频率的波叠加
合成后,可以用滤波器来分开
越高频越容易失真,因此可以动态调节一个波的信息量。噪声小就多加一点比特。
动态调节过程,叫训练/握手
上行/下行分配了不同的频段,导致不同的速度
分离器
adsl传输通过电话线,传出去,分离器合成两个信号;接收的时候,分离器再分开
adsl用高频信号,电话语音信息用低频
相当于阻隔两方信息的东西
电话电缆
电话局附近埋了很多连进来的电缆,被称为 电缆隧道
DSLAM
接收电信号,转换成数字信息的 信元。
相当于很多ADSL Modem整合在了一起。而且自带滤波的功能。
一般不用以太网接口,而是ATM接口。专门接受 信元
BAS
【就是加强版路由器,虽然叫服务器】
用atm接口,把信元转换成原始的包。
PPPoE头的作用就是送达BAS,因此到这后被丢弃。取出ppp头后面的数据。
在ppp头前加水到专用头,一般是L2TP
隧道专用路由器
然后被转发到互联网内部
光纤到户。光纤就两种状态,1和0,亮或暗
将数字变成电信号、再变成光信号。
接收也是如此,光变电变数字
单模,一根光纤传导一条光线,失真少,成本高,距离远。
多模,一根光纤传多条光线,失真多,越远越多,信号越来越宽。成本低。
一般是在建筑物内用多模,远距离用单模。
光纤原理
光传进光纤,只有很小一部分才能前进。
入射角较小才能全反射;
传输过程中相位要一致,不然会干涉抵消
单模,就是只有一个光
多模,有很多光线
直连
光纤直接连到最近电话局。
光纤收发器/终端盒
把以太网包的电信号直接转成光信号,没有信元。
多路光纤收发器(电话局内)
转成电信号
BAS接收,发送到互联网内部
上行下行用同一条光纤,通过光的不同相位,来分离信号。
分路
ONU,电信号转光信号,也是终端盒
分光器
类似于 集线器,光纤连到多个用户,然后一起传到电话局
还有一个避免上传时碰撞的作用
下行的数据也会到达每个用户手上,根据ONU头来识别
OLT,配合ONU来避免信号碰撞
BAS
网络包通过ADSL或FTTH到达BAS。这是接入网路由器。
输入用户名和密码,登陆后才能访问互联网。BAS就是登陆的窗口,用的是PPPoE协议实现。
原始的PPP拨号上网
拨打电话,通过广播来找BAS的mac地址
接通后,输入用户名和密码
加密传输:CHAP;不加密:PAP
如果是光纤传输,基本不可能在传输中被窃听,最多是路由器和ADSL Modem窃听。
用户名密码通过RADIUS协议从RAS发送
校验正确,返回配置信息,就可以连接了
配置:ip地址、dns服务器地址、默认网关ip地址等等
要给计算机分配一个公有地址
PPPoE传输ppp
ppp传输需要容器,要记载一下报头、fcs、信号格式等等信息。
PPPoE,就是以太网包重新设计的规格。用来装PPP数据
BAS收到网络包,去掉mac头和PPPoE头,取出数据扔进隧道。
隧道,另一头会原样把包吐出来。出口是 网络运营商的路由器
基于tcp
基于封装
不分配ip地址的无编号端口
一对一链接,不用判断转发地址,网关地址不用了写了
也可以不用给端口分配ip地址
bas下发的参数,配置在了路由器上面,转发包的时候要进行地址转换
换言之,公有地址是分配给路由器的,计算机会被分配一个私有地址
也可以直接让计算机接受来自BAS的PPPoE消息,计算机就有了公有地址。
但这可能导致计算机被攻击。
PPPoE,需要把PPP消息装进以太网包,再拆成信元
PPPoA,直接把PPP消息装入信元,这能增加MTU,即传更多数据
换言之,不能用以太网传输,BAS需要有收发PPP消息的对应设备。(接口更贵就没普及)
ADSL Modem和USB接口连接,和计算机成为一体。没有普及。
ADSL Modem和路由器整合,广泛普及。但有地址转换的问题
此外,也可以不用PPP协议来下发TCP/IP配置信息,比如能用DHCP协议
直接把以太网包变成ADSL型号
更加简单,没有用户名密码,无法切换运营商,但头小,传输效率高。
进入互联网内部,内部就是一堆路由器,由多个运营商网络管,他们之间相互连接。
互联网入口是POP,即接入点。
NOC可以当成更高性能的POP,也就是个高级路由。
先到达运营商pop的路由器。
不同接入网类型,有不同类型的路由器。
专线
不需要用户认证、配置下发,一般路由器就行
电话等拨号上网
RAS,需要对用户拨电话的动作进行应答,PPP协议进行身份认证和配置下发
PPPoE的ADSL/FTTH
BAS,负责和用户的身份认证和配置下发
pop路由器和bas相连,只负责包转发。即一般路由器即可
PPPoA的ADSL
DSLAM连ATM交换机(处理信元),连ADSL运营商的BAS,连运营商POP的路由
接入网路由器需要大量端口,需要连接很多数量的线路。传输速度可以比较低。
NOC和POP需要大量吞吐数据,因此线路效率和性能要高
NOC把收到的数据,转发到离目标更近的pop,或是转发到其他运营商
pop和noc往往在一幢建筑物中的机房里,还有一堆服务器。
如果近可以直连,或者用光纤连接
光纤可以复用,因此可以租借。有专门的通信线路服务公司。会把光纤一部分通行能力租借给客户。
到达pop路由,还是一样,各种转发直到目的地。
如果是同一个运营商,那么可以直接转发到web服务器所在的pop,再继续转发到web服务器
如果不是一个运营商,先发到运营商,再层层转发
路由器自动更新路由表,和周围路由器交换路由信息。
转接:全部告诉对方,对方可以绕过你和你身后的人连接
对等:只告诉双方相关的路由信息,因此只能相互发包
也可以通过IX,即运营商的路由器
公司中,路由器是寻找最短路由,因为不用收费,所有路由都是平等的节点。
运营商之间,为了区分谁交了钱,就需要阻止某些来源的网络包。
互联网中,可以指定路由交换对象。
路由交换是在特定路由器之间一对一进行的,交了钱才能给你路由信息。
判断路由,也要加上优先级权重,不仅仅看什么路子最短。
一个中心设备,减少线路数量。
IX所在大楼,有自主发电设备,抗震。往往NOC也在这里面
IX是具有大量高速以太网端口的二层交换机。就是更快更高级的交换机
网络包从互联网到达服务器。
服务器直接在公司网络上
pop、接入网、服务端路由器,直接进入服务器
ip地址不足
不安全。服务器相当于在裸奔
部署防火墙
防火墙,只允许发往指定服务器、指定应用程序的网络包通过,屏蔽其他包。
部署在运营商数据中心,直接租运营商提供的服务器
noc或ix直连,访问速度快
各种配套设施齐备,还会送防火墙和监控数据之类的。
阻止网络包流入流出,以及地址转换。
防火墙主要是用包过滤模式。
除非必需服务,不然一律不让过。
只允许访问服务器的数据通过
通过控制信息过滤,接收方地址为本地,且端口号是80,才能进入
发送方是本地ip,且端口号是80,才能出去
控制端口号,是为了不让其他服务连上互联网,只提供web服务。
禁止服务器主动连接互联网
这是避免服务器中恶意软件污染其他服务器。
发起连接请求的时候,tcp控制为syn=1, ack=0
禁止第一次连接请求,也就禁止了服务器主动连接外面的互联网。
udp协议,完全无法区分开
因为没有连接操作,所以无法限制。
或者可以用 包过滤 以外的过滤方法。
公司内网和互联网、公开区域之间,都要有包过滤
【感觉就是平行的几个地方,不过人为设置了流入流出的限制】
公司内网都是私有地址,外面就访问不到了,只能通过防火墙
如果被拦截,那么就会阻止,并记录丢弃。用来分析非法入侵。
这些事情路由器也能做到,只不过防火墙规则复杂且需要记录。
因此衍生出了专用的软硬件来维护。
规则简单且丢弃阻止记录的话,路由器也可以。
防火墙无法检查包内容,就算能也无法抵御未知的风险
因此只能尽可能发现bug,然后频繁更新
增加带宽,服务器性能跟不上怎么办?
多台服务器来分担负载
dns服务器来分配
每次通过dns查询服务器ip,就轮着给服务器的ip地址,即 轮询round-robin
平均分配访问
如果有故障,就无法跳过了
如果一个操作需要横跨多个页面,这么轮询就无法执行
负载均衡器
用负载均衡器的ip,代替web服务器的ip。
dns注册的ip就是负载均衡器的ip。就对外假装自己是服务器。【其实就是反向代理】
对服务器来说,负载均衡器就是客户端。负载均衡器会分配把请求分配给哪台服务器。
服务器负载情况
定时采集cpu、内存等
定时发送测试包,测试响应时间
设置性能指数,计算出服务器性能
如果要横跨多个页面,就必须把请求发送到同一台服务器上。
原本web服务器是用来放静态文件的,因此不需要判断请求的相关性。
可以通过cookie来判断
把整个系统,按功能划分为不同的服务器。web、数据库、缓存等等。
缓存类似于负载均衡器,对外为web服务器,对web服务器为客户端。把访问进行中转。
缓存服务器的ip注册到dns服务器上,这样客户端就会直接访问缓存服务器,连接套接字等等操作
缓存检查请求内容,查一下数据是否已经在缓存中了
如果不存在,就转发给web服务器。也是创建套接字等等操作 【应该是新建一个请求,或者修改一下请求,只把想要的数据问服务器要】
把响应消息保存到缓存中,并记录保存的时间。
如果存在。就在请求头里面加一行if-modified-since,询问用户数据是否已经变化了
服务器会根据最后更新时间来比较,有没有变化。没有就返回304
有的话,就返回最新的数据,保存在缓存中
最早是在客户端一侧缓存,尽可能压榨低速接入网的能力。
顺便也是防火墙,阻止互联网和公司内网、阻止上外网的包。
接受公司内网的包,查看内容,判断是否允许访问外网,然后转发到互联网。
正向代理,需要在浏览器设置“代理服务器”
浏览器把所有请求发送给代理服务器,根据URI里面填写的完整字段来访问
正向代理,设置麻烦,容易故障,因此把代理放在服务器端。
可以是dns服务器解析引导
URI中目录名与web服务器进行关联,能转发不包含完整网址的请求信息。
浏览器不需要设置代理也能使用。
客户端没感觉,请求随便发,但是在必经节点上,有代理给你转发。
比如互联网的接入口
更像是缓存
缓存放在哪?
web服务器前,可以管理,但流量不会少
客户端局域网,无法管理,流量会少
互联网接入口,可以通过运营商管理,流量也少
放在pop的缓存服务器,是公开的,任何人都能访问。而且必须在所有pop都部署,数量太大。
因此有专门从事部署缓存服务,并租借给web服务器的厂商,叫内容分发服务CDSP
客户端访问web服务器,其实是在访问缓存服务器。
dns服务器来分配,根据路由信息计算距离
重定向,计算距离
类似于路由器的转发,如web服务器没数据,转发到另一台服务器上。【找个服务器问一下】
客户端请求,先通过dns,发到重定向服务器。重定向服务器会收集各个路由信息,计算最近缓存服务器,再返回给客户端地址。(加一个location字段)
这样会增加http消息次数。但精度较高。
也可以根据网络包往返时间,来估算距离。
第一次访问,缓存是无效的
如果每次查询数据都要问web服务器有没有更新,其实也会拥堵。
因此,当web服务器数据更新,就要立刻通知缓存服务器。
如果是动态生成的页面,那么静态的元素能存就存
服务器启动后,要做各种准备工作,才能接受客户端访问。
服务器和客户端有什么区别?
硬件和操作系统不同,网络相关接口都是一样的。服务器还能同时和多台客户端通信。客户端也能当服务器。
程序分为, 等待连接模块 和 通信模块
服务器初始化后,等待连接模块运行,创建套接字。等待连接
客户端发起连接,启动通信模块,复制一个自己然后移交连接的套接字。
接下来就用已连接的套接字通信
通信模块和客户端的连接,是一一对应的。
可以实现启动几个通信模块,发起连接时挑一个连接。
数据收发层面,socket库不分客户端和服务器。不过只有一方等待连接,另一方才能发起连接。
因此一般发起连接,是客户端,等待连接,是服务器。
客户端
创建套接字
连接服务器端的套接字
收发数据
断开管道并删除套接字
服务器端
创建套接字,分配内存空间
把端口写入套接字中
listen等待连接
accept接受连接
给套接字创建一个副本,连接对象的控制信息写入套接字中。
每次都是用副本来连接,原来的套接字继续等
通过双方ip地址、端口号,来指定唯一的套接字。
描述符,在套接字刚创建好的情况下,在应用程序和协议栈之间,指代套接字的
从报头分离出时钟信号,进行同步,并延长时钟信号
每个时钟周期检测信号变化方向,还原成数字信息
根据包尾的 帧校验序列FCS 检验错误,错误就丢弃
检查mac头,是不是发给自己的,不是就丢弃
保存在网卡内的缓冲区中
通过中断,通知cpu参与
cpu暂停当前任务,运行网卡驱动,读取网卡缓冲区的包
cpu如果根据协议,调用不同协议栈
如ip协议,调用tcp/ip协议栈,转交包
检查ip头,是否规范,是否发给自己,不是就转发或丢弃
检查有没有分片
如果有分片,就暂存在内存中,等所有分片到达,再组装成原始包
查看ip头协议号,转交下一个模块
如06协议号,转交TCP模块;11转交UDP
发起连接的包,SYN=1
查看tcp头
检查接收方端口号,当前端口有没有等待连接的套接字,没有就返回错误包
如果有就创建套接字的副本,写入控制信息,分配收发缓存的内存空间
生成确认的ack号,交给ip发送
已经连接的包
根据四个信息,找到套接字。
对比套接字中保存的信息,看数据收发状态是否正常
来的包是不是在等待的下一个序号。
如果一致,就提取数据,放到接收缓冲区中,与上一个序号拼接(每次有包就会拼接,ip则是全到再拼)
生成应答tcp头,计算ack号,给ip发送(一般会等一段时间,合并发送)
在数据到之前,应用程序会一直用socket库的read,等待数据到达接收缓冲区。一旦完成接收就获取了数据。
断开连接
tcp生成fin=1的tcp头
客户端收到后,返回ack号,调用close,生成fin=1的tcp头给服务器
服务器返回ack号
断开操作完成
套接字过段时间就删除
不同的方法,根据uri,读取不同的文件
web服务器公开目录和实际目录不一样,是一个虚拟目录,实际目录映射成这个目录的
因此根据uri找目录,还要翻译一下,才能读取文件返回
不仅能翻译目录,也能按照规则翻译文件名
可能返回的不是静态文件,而是一个程序
浏览器会从请求消息中,取出数据,交给操作系统运行程序,然后返回结果给web服务器。web服务器获得相应,就会返回给客户端。不会过问内容。
如果是get,数据在uri后面;如果是post,数据在消息体中。
程序处理数据,可能需要查数据库等,运算出结果。
web服务器,根据请求信息的内容判断数据源,并从中获取数据返回给客户端
可以从URI中,根据规则允许或禁止访问
ip地址
域名
ip反过来向dns服务器查域名。一般还需要根据域名再查一次ip看看是否一致
因为可以再dns注册假域名来攻击,就要双重检查
问题是比较慢
用户名和密码
一般请求不包含用户名和密码,因此会发一条消息给客户端,要求提供用户名和密码。
如果是CGI认证,可能是需要用户填写表单
浏览器把用户名和密码,放入请求中,重新发送
web服务器,用write,把响应消息写给协议栈,给出套接字,对应哪条通信。
协议就会拆分网络包等等等
客户端接收数据
网卡还原成数字信息
协议栈组装网络,取出响应
消息转交给浏览器
需要根据数据类型,来调用不同的程序,来展示。
数据类型一般是写在了Content-Type里面
Content-Type内容,也是全球统一管理的,主类型/子类型
Content-Type: text/html
需要解码解压缩
压缩和编码技术,是写在了Content-Encoding
里面了。
但仅仅靠这俩是不够的,因为有可能写错。需要综合判断
如,文件扩展名,文件抬头等等
浏览器解释标签含义,实际的显示操作,由操作系统完成。浏览器只需要发出指令。
图片标签,需要向服务器请求文件。返回后会嵌入到标签所在位置。
接收方mac地址,需要根据对方ip地址来查询