计算机网络简述
基础概念
什么是网络(Network)
网络是指“三网”,即电信网络、有线电视网络和计算机网络
英特网(Internet)概述
- 由若干结点(node)和连接这些结点的链路(link)组成
- 互联网是“网络的网络”(network of networks)
- 连接在因特网上的计算机都称为主机(host)
网络与因特网关联
- 网络把许多计算机连接在一起
- 因特网则把许多网络连接在一起
计算机网络
分类
- 作用范围维度
- 广域网 WAN (Wide Area Network)
- 局域网 LAN (Local Area Network)
- 城域网 MAN (Metropolitan Area Network)
- 个人区域网 PAN (Personal Area Network)
- 使用者维度
- 公用网 (public network)
- 专用网 (private network)
性能
- 速率
- 速率即数据率(data rate)或比特率(bit rate)。是计算机网络中最重要的一个性能指标
- 速率往往是指额定速率或标称速率
- 带宽
- 带宽是数字信道所能传送的“最高数据率”的同义语
- 单位是“比特每秒”,或 b/s (bit/s),在时间轴上信号的宽度随带宽的增大而变窄
- 吞吐量
- 吞吐量(throughput)表示在单位时间内通过某个网络(或信道、接口)的数据量
- 吞吐量受网络的带宽或网络的额定速率的限制
- 时延
- 传输时延
- 传播时延
- 处理时延
- 排队时延
- 时延带宽积
- 时延带宽积=传播时延*带宽
- 链路的时延带宽积也称为是以bit为单位的链路长度
- 利用率
- 信道利用率指出某信道有百分之几的时间是被利用的(有数据通过)。完全空闲的信道的利用率是零
域名
分类
- 匿名根(.)
- 顶级域名
- 通用域名
- 国家域名
- 二级域名
域名解析服务器
- 根域名服务器
- 全球共有13个不同IP地址的根域名服务器,它们的名称用一个英文字母命名,从a一直到m
- 顶级域名服务器
- 负责管理在该顶级域名服务器下注册的二级域名
- 权限域名服务器
- 负责一个区的域名解析工作
- 本地域名服务器
- 当一个主机发出DNS查询请求的时候,这个查询请求首先就是发给本地域名服务器的
网络模型
OSI 七层模型
- 物理层(PhysicalLayer)
- 数据链路层(DataLinkLayer)
- 数据链路层在不可靠的物理介质上提供可靠的传输
- 该层的作用包括:物理地址寻址、数据的成帧、流量控制、数据的检错、重发等
- 网络层(Network)
- 网络层的任务就是选择合适的网间路由和交换结点, 确保数据及时传送
- 网络层协议的代表包括:IP、IPX、RIP、OSPF等
- 有关路由的一切事情都在这第3层处理。地址解析和路由是3层的重要目的
- 传输层(Transport)
- 为上层提供端到端(最终用户到最终用户)的透明的、可靠的数据传输服务
- 传输层协议的代表包括:TCP、UDP、SPX等
- 会话层(Session)
- 会话层不参与具体的传输,它提供包括访问验证和会话管理在内的建立和维护应用之间通信的机制
- 如服务器验证用户登录便是由会话层完成的
- 表示层(Presentation)
- 数据的压缩和解压缩, 加密和解密等工作都由表示层负责
- 应用层(Application)
- 应用层为操作系统或网络应用程序提供访问网络服务的接口
- 应用层协议的代表包括:Telnet、FTP、HTTP、SNMP等
TCP/IP 四层模型
- 网络接口层
- 网际层 IP
- 运输层(TCP、UDP)
- 应用层(各种应用层协议,如FTP、SMTP、Telnet等)
网络 五层模型
- 物理层
- 数据链路层
- 网络层
- 运输层
- 应用层
常见协议
IP协议
使用 IP 协议,可以把异构的物理网络连接起来,使得在网络层看起来好像是一个统一的网络
- IP协议相关的三个协议
- 地址解析协议 ARP(Address Resolution Protocol)
- 网际控制报文协议 ICMP(Internet Control Message Protocol)
- 网际组管理协议 IGMP(Internet Group Management Protocol)
HTTP协议
DNS协议
DNS的核心工作就是将域名翻译成计算机IP地址, 它是基于UDP协议实现的
DNS解析流程
- 本地客户机提出域名解析请求,查找本地HOST文件后将该请求发送给本地的域名服务器
- 将请求发送给本地的域名服务器
- 当本地的域名服务器收到请求后,就先查询本地的缓存
- 如果有该纪录项,则本地的域名服务器就直接把查询的结果返回浏览器
- 如果本地DNS缓存中没有该纪录,则本地域名服务器就直接把请求发给根域名服务器
- 然后根域名服务器再返回给本地域名服务器一个所查询域(根的子域)的主域名服务器的地址
- 本地服务器再向上一步返回的域名服务器发送请求,然后接受请求的服务器查询自己的缓存,如果没有该纪录,则返回相关的下级的域名服务器的地址
- 重复第7步,直到找到正确的纪录
- 本地域名服务器把返回的结果保存到缓存,以备下一次使用,同时还将结果返回给客户机
相关命令
- dig命令。可以查看域名解析整个过程
- host命令
- nslookup命令
- whois命令
- 在线查询工具:www.nslookuptool.com/chs/
DNS调度系统
大部分应用和业务都采用域名作为服务的入口,使用 DNS 来负载均衡和区域调度是非常普遍的做法
设计方案
- 传统的DNS区域调度方案
- 在使用了公共DNS的情况下,会存在地理位置调度部准确的问题
- edns-client-subnet (以下简称 ECS)
- 该方案是通过在 DNS 请求报文里加入原始请求的 IP(即 client 的 IP),使得权威能根据该信息返回正确的结果
- 至少需要 cache 和权威都支持,才能完成完整的 ECS 解析
- ECS 给 cache 增加了很大的缓存压力,因为理论上可能需要为每个IP段分配空间去缓存解析结果
- DNS 的缓存机制在大多数情况下缩短了客户端的记录解析时间,但缓存也意味着生效同步的延迟
安全相关
- DNS劫持
- DNS劫持就是通过劫持了DNS服务器,通过某些手段取得某域名的解析记录控制权,进而修改此域名的解析结果,导致对该域名的访问由原IP地址转入到修改后的指定IP,其结果就是对特定的网址不能访问或访问的是假网址,从而实现窃取资料或者破坏原有正常服务的目的。DNS劫持通过篡改DNS服务器上的数据返回给用户一个错误的查询结果来实现的
- 什么是DNS污染
- DNS污染是一种让一般用户由于得到虚假目标主机IP而不能与其通信的方法,是一种DNS缓存投毒攻击(DNS cache poisoning)
- 由于通常的DNS查询没有任何认证机制,而且DNS查询通常基于的UDP是无连接不可靠的协议,因此DNS的查询非常容易被篡改,通过对UDP端口53上的DNS查询进行入侵检测,一经发现与关键词相匹配的请求则立即伪装成目标域名的解析服务器(NS,Name Server)给查询者返回虚假结果
- DNS污染症状
- 目前一些被禁止访问的网站很多就是通过DNS污染来实现的,例如YouTube、Facebook等网站
- DNS异常解决方法
- DNS劫持。可以采用使用国外免费公用的DNS服务器解决。例如OpenDNS(208.67.222.222)或GoogleDNS(8.8.8.8)
- DNS污染。可以说,个人用户很难单单靠设置解决,通常可以使用VPN或者域名远程解析的方法解决,但这大多需要购买付费的VPN或SSH等,也可以通过修改Hosts的方法,手动设置域名正确的IP地址
DNS流量监控
异常特征
- 来自伪造源地址的 DNS 查询、或未授权使用且无出口过滤地址的 DNS 查询,若同时观察到异常大的 DNS 查询量或使用 TCP 而非 UDP 进行 DNS 查询,这可能表明网络内存在被感染的主机,受到了 DDoS 攻击
- 异常 DNS 查询可能是针对域名服务器或解析器(根据目标 IP 地址确定)的漏洞攻击的标志。与此同时,这些查询也可能表明网络中有不正常运行的设备。原因可能是恶意软件或未能成功清除恶意软件
- 在很多情况下,DNS 查询要求解析的域名如果是已知的恶意域名,或具有域名生成算法( DGA )(与非法僵尸网络有关)常见特征的域名,或者向未授权使用的解析器发送的查询,都是证明网络中存在被感染主机的有力证据
- DNS 响应也能显露可疑或恶意数据在网络主机间传播的迹象。例如,DNS 响应的长度或组合特征可以暴露恶意或非法行为。例如,响应消息异常巨大(放大攻击),或响应消息的 Answer Section 或 Additional Section 非常可疑(缓存污染,隐蔽通道)
- 针对自身域名组合的 DNS 响应,如果解析至不同于你发布在授权区域中的 IP 地址,或来自未授权区域主机的域名服务器的响应,或解析为名称错误( NXDOMAIN )的对区域主机名的肯定响应,均表明域名或注册账号可能被劫持或 DNS 响应被篡改
- 来自可疑 IP 地址的 DNS 响应,例如来自分配给宽带接入网络 IP 段的地址、非标准端口上出现的 DNS 流量,异常大量的解析至短生存时间( TTL )域名的响应消息,或异常大量的包含“ name error ”( NXDOMAIN )的响应消息,往往是主机被僵尸网络控制、运行恶意软件或被感染的表现
处理方式
- 防火墙
- 入侵检测系统
- 流浪分析工具
- DNS被动复制
- 解析日志记录
- DNS服务器监控
UDP协议
分析
- 服务的相关操作
- s = socket()。创建套接字
- bind(s, ip:port)。绑定套接字、地址、端口
- recvFrom()。开启监听,等待接收来自客户端的数据
- sendTo()。发送数据
- 客户端相关操作
- s = socket()。创建套接字
- SendTo()。发送数据
- recvFrom()。开启监听,等待接收来自服务端的数据
- close(s)。关闭套接字
TCP协议
分析
-
服务端相关操作
- s = socket()。创建套接字
- bind(s, ip:port)。绑定套接字、地址、端口
- listen(s)。开启监听
- r = accept()。接收连接请求
- send(r)。发送数据到客户端
- recv(r)。接收来自客户端的数据
- close(s)。关闭套接字
-
客户端相关操作
- s = socket()。创建套接字
- connect(s)。发起连接请求
- send(r)。发送数据到服务端
- recv(r)。接收来自服务端的数据
- close(s)。关闭套接字
-
函数说明
- send()。不论是客户还是服务器应用程序都用send函数来向TCP连接的另一端发送数据
- recv()。不论是客户还是服务器应用程序都用recv函数从TCP连接的另一端接收数据
Socket编程
简述
- socket编程即计算机网络编程,目的是使两台主机内的应用能够通过网络三元组进行远程连接,既然要使两者产生联系,那么就要有至少一个信息发送端和一个信息接收端,因此形成了现在绝大多数 socket 编程都会用到的 C/S 架构(Client[客户端]/Server[服务端]),最典型的应用就是 web服务器/客户端
- 在TCP/IP 协议簇中,在网络层IP地址用于网络中主机的唯一标识,传输层的"协议+端口"用于主机应用的唯一标识
- Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口
- 在设计模式中,Socket是一个门面模式。它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,一组简单的接口就是全部,让Socket去组织数据,以符合指定的协议
补充说明
- 网络三元组
- 网络三元组是IP地址、协议、端口。在互联网中,三元组用于网络应用的唯一标识,通过它来与其他应用进行交互
Web网页加载全流程
地址栏输入URL
URL (Uniform / Universal Resource Locator) , 即统一资源定位符。它实际上就是网站网址。浏览器就是靠URL来查找资源位置
- 传输协议
- URL包含协议部分,是浏览器和www万维网之间的沟通方式,它会告诉浏览器正确在网路上找到资源位置。例如http、https、ftp、file、mailto、git、tencent等,不同协议有不同的通讯内容格式。例如:http
- 网络地址
- 指示该连接网络上哪一台计算机,可以是域名或者IP地址,可以包括端口号。例如:www.jd.com
- 资源路径
- 指示从服务器上获取哪一项资源。例如:/index
DNS域名解析IP
- 查找域名对应的IP地址
- 浏览器缓存 -> 系统缓存 -> 本地DNS服务器缓存
请求和响应数据
- 建立TCP连接(3次握手)
- 发送HTTP请求
- 服务器处理请求
- 返回HTTP响应结果
- 关闭TCP连接(4次挥手)
浏览器加载,解析和渲染
- 浏览器加载资源文件(自上而下)
- 浏览器解析和渲染
- 解析html,生成dom树
- 解析css,生成cssom树
- 将dom树和cssom树合并,生成渲染树
- 遍历渲染树,开始布局和计算
- 绘制渲染树,显示到屏幕