参考文献

协议三要素

  • 语法, 是解释控制信息每个部分的意义.就是这一段内容要符合一定的规则和格式.例如,括号要成对,结束要使用分号等.
  • 语义,是用户数据与控制信息的结构与格式.就是这一段内容要代表某种意义.例如数字减去数字是有意义的,数字减去文本一般来说就没有意义.
  • 顺序(时序),是对事件发生顺序的详细说明,就是先干啥,后干啥.例如,可以先加上某个数值,然后再减去某个数值.

OSI七层模型

  • OSI: “开放式系统互联通信参考模型”(Open System Interconnection Reference Model)OSI参考模型从下往上依次是:(物联网叔会试用)
    • 物理层(Physical Layer):物理层复制传送比特(Bit),涉及到接口和传输媒体的机械,电气等特性. 比特 第七层
    • 数据链路层(Data Link Layer): 数据链路层负责传送帧(Frame). 第六层 Ethernet,Token Ring,FDDI,AppleTalk
      • 以太网数据帧的物理特性是其长度必须在 46~1500字节之间
    • 网络层(Network Layer): 网络层负责路由,传送分组(Packet). 数据包 第五层 IP,IPX
    • 传输层(Transport Layer): 传输层负责传送完整的报文(Message),并进行浏览控制和差错控制. 数据段 第四层 TCP,UDP,SPX
    • 会话层(Session Layer): 会话层负责建立,维护,终止会话连接,提供会话管理服务等. 数据 第三层 NetBIOS,SAP,SDP,NWlink
    • 表示层(Presentation Layer): 表示层复制数据格式的转换. 数据 第二层 ASCII,MPEG,JPEG,MIDI
    • 应用层(Application Layer): 应用层应用程序提供了接口,使应用程序接入到网络. 数据 第一层 HTTP,SMTP,FTP,Telnet
  • 七层模型的主要目的是为了解决异种网络互联所遇到的兼容性问题.
  • 最大的优点就是将服务,接口,协议这三个概念明确的区分开来.
    • 服务说明某一层为上一层提供一些什么功能;
    • 接口说明上一层如何使用下层的服务;
    • 协议涉及如何实现本层的服务

TCP/IP协议族分层

  • TCP/IP协议族是有一个四层协议组成的系统,这四层分别为应用层,传输层,网络层数据链路层;
应用层
  • 一般是我们编写的应用程序,决定了想用户提供应用服务.应用层可以通过系统调用传输层进行通信.如FTP,DNS,HTTP等;
  • 应用层只需要专注与为用户提供应用功能,不用关心数据如何传递的.
  • 应用层是在操作系统中的用户态,传输层及以下则在内核态
  • HTTP(超文本传输协议),FTP(文件传输协议),TFTP,SMTP(简单邮件传输协议),SNMP,DNS(域名系统)
传输层
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
+------+ +-----+ +-----+       +-----+                    
|Telnet| | FTP | |Voice| ... | | Application Level
+------+ +-----+ +-----+ +-----+
| | | |
+-----+ +-----+ +-----+
| TCP | | RTP | ... | | Host Level
+-----+ +-----+ +-----+
| | |
+-------------------------------+
| Internet Protocol & ICMP | Gateway Level
+-------------------------------+
|
+---------------------------+
| Local Network Protocol | Network Level
+---------------------------+

Protocol Relationships
  • 传输层通过系统调用向应用层提供处于网络连接中的两台计算机之间的数据传输功能;
  • 在传输层有两个性质不同的协议:TCPUDP;
  • TCP(传输控制协议 全双工),UDP(用户数据包协议),TCP相比UDP多了很多特性,比如流量控制,超时重传,拥塞控制等,这些都是为保证数据包能可靠地传输给对方.
  • UDP就相对很简单,简单到只负责发送数据包,不保证数据包是否能抵达对方,但它实时性相对更好,传输效率也高.
  • 应用层需要传输的数据可能会非常大,如果直接传输就不好控制,因此当传输层的数据包大小超过MSS(TCP最大报文段长度),就要将数据包分块,这样即使中途有一个分块丢失了或损坏了,只需要重新将发送这个分块,而不用重新发送整个数据包.
  • 在TCP协议中,每个分块称为一个TCP段(TCP Segment)
网络层
  • 网络层用来处理在网络上流动的数据包,数据是网络传输的最小数据单位.该层规定了通过怎样的路径(传输路线)到达对方计算机,并把数据包传输给对方;
  • ICMP(网际控制报文协议),IGMP(网际组管理协议),IP(网际协议)
  • IPv4协议,IP地址共32位,分成了四段,每段8位.主要提供寻址和路由的功能.
  • IP地址分为两个部分:
    • 网络号:负责标识该IP地址是属于哪个子网的;
    • 主机号:负责标识同一子网下不同主机;
  • 需要配合使用子网掩码才能算出IP地址的网络号和主机号,在寻址的过程中,先匹配到相同的网络号,才会去找对应的主机.
  • IP协议的寻址作用告诉我们去往下一个目的地该朝哪个方向走,路由则是根据下一个目的地选择路径,寻址更像在导航,路由更像在操作方向盘.
  • 三层路由:设备工作在ip层,报文经过有路由功能的设备时,设备分析报文中的头部信息,拿到ip地址,根据网段范围,进行本地转发或选择下一个网关
数据链路层
  • 链路层用来处理连接网络的硬件部分,包括控制操作系统,硬件设备驱动,NIC(Network Interface Card 网络适配器)以及光纤等物理可见部分.硬件上的范畴均在链路层的作用范围之内.
  • 一旦数据需要跨网络传输,就需要有一个设备同时在两个网络当中,这个设备一般是路由器,路由器可以通过路由表计算出下一个要去的IP地址.
  • 每一台设备的网卡都会有一个MAC地址,它就是用来唯一标识设备的.路由器计算出了下一个目的地IP地址,在通过ARP协议找到目的地的MAC地址,这样就知道这个IP地址是哪个设备的了.
  • 二层转发:设备工作在链路层,帧在经过交换机设备时,检查帧的头部信息,拿到目标MAC地址,进行本地转发和广播
  • ARP(地址解析协议),RARP(逆地址解析协议)

OSI七层模型与TCP/IP四层模型对比

OSI七层模型 TCP/IP四层模型 功能 TCP/IP协议族 传输单位
应用层 应用层 文件传输,电子邮件,文件服务,虚拟终端 TFTP,HTTP,SNMP,FTP,DNS,Telnet 消息/报文(message)
表示层 应用层 数据格式化,代码转换,数据加密 没有协议
会话层 应用层 解除或建立与别的节点的联系 没有协议
传输层 传输层 提供端对端的接口 TCP,UDP 段(segment)
网络层 网络层 为数据包选择路由 IP,ICMP,RIP,OSPF,BGP,IGMP 包(packet)
数据链路层 数据链路层 传输有地址的帧以及错误检测功能 ARP,RARP,MTU,SLIP,CSLIP,PPP 帧(frame)
物理层 以二进制的数据形式在物理媒体上传输数据 ISO2110,IEEE802,IEEE802.2

层与层之间的关系

  • 只要是在网络上跑的包,都是完整的.可以有下层没有上层,绝对不可能有上层没有下层.
  • 对于TCP协议来说,三次握手也好,重试也好,只要想发出去包,就要有IP层和MAC层,不然是发不出去的.
二层设备与三层设备
  • 二层设备:
    • 二层设备工作在OSI模型的数据链路层.主要以MAC地址为基础进行数据包的转发和交换.它的主要功能是根据目标MAC地址将数据包从一个接口转发到另一个接口.实现局域网内的快速数据传输.二层设备通常用于构建局域网.提供高速、低延迟的数据传输和广播域隔离
    • 就是只把MAC头摘下来.看看到底是丢弃、转发.还是自己留着
  • 三层设备:
    • 三层设备工作在OSI模型的网络层.能够处理IP数据包.具备路由功能.它除了具备二层设备的交换功能外.还能根据IP地址对数据包进行路由选择.实现不同网络之间的数据转发.三层设备通过维护路由表来确定最佳路径.并使用路由协议进行路由信息的交换和更新.它可以连接多个局域网或广域网.并实现互联网接入.
    • 就是把MAC头摘下来之后.再把IP头摘下来.看看到底是丢弃、转发.还是自己留着

网络硬件

集线器
img
  • 集线器是工作在OSI参考模型物理层的转发设备.它从一个端口接收到数据包,然后将数据包传输(中继)到设备的每个端口上.
  • 例如,如果一台计算机连接到一个4端口集线器的1号端口上,需要发送数据到连接在2号端口的计算机,那么集线器将会把数据发送给端口2,3,4.连接到3号端口与4号端口上的客户端通过检查以太网帧头字段中目标媒体访问控制地址(MAC),判断出这些数据包并不是给它们的,便丢弃这些数据包.
  • 集线器会产生很多不必要的网络流量,并仅在半双工模式下运行(不能再同一时间发送和接收数据).在高密度的实际网络中,集线器最好的替代产品是交换机,它们是支持全双工的设备,可以同时发送和接收数据.
交换机
img
  • 与集线器相同,交换机也是用来转发数据包的,但与集线器不同的是,交换机并不是将数据广播到每一个端口,而是将数据发送到目的计算机所连接的端口上.
  • 为了能够直接与一些特定的设备进行通信,交换机必须能够通过MAC地址来唯一标识设备,这意味着它们必须工作在OSI参考模型的数据链路层.
  • 交换机将每个连接设备的2层地址都存储在一个CAM(Content Addressable Memory:内容寻址寄存器)表中,CAM表充当着一种类似交通警察的角色.
    • 当一个数据包被传输时,交换机读取数据包中的第二层协议头部信息,并使用CAM表作为参考,决定往哪个或者哪些端口发送数据包.交换机仅仅将数据包发送到特定的端口上,从而大大降低了网络流量.
路由器
img
  • 路由器是一种比交换机或集线器具有更高层次功能的先进网络设备.

  • 路由器工作在OSI参考模型的第3层,它们负责在两个或多个网络之间转发数据包.路由器在网络间引导数据包流向,这一过程被称为路由.路由器通常使用第3层地址(如IP地址)来唯一标识网络上的设备.

  • 路由器判断下一个转发目标的方法如下:

    • 如果路由表的网关列内容为IP地址,则该地址就是下一个转发目标.
    • 如果路由表的网关列内容为空,则IP头部中的接收方IP地址就是下一个转发目标
  • 路由器也会使用ARP查询下一个转发目标的MAC地址

路由器和交换机的关系
  • 路由器是基于IP设计的,而交换机是基于以太网设计的,因此IP与以太网的关系也就是路由器与交换机的关系,即路由器将包的传输工作委托给交换机来进行.(此关系只适用原原本本实现IP和以太网机制的纯粹的路由器和交换机)
  • IP(路由器)负责将包送达通信对象这一整体过程,而其中将包传输到下一个路由器的过程则是由以太网(交换机)来负责的.

流量分类

广播
  • 广播数据包会被发送到一个网段上的所有端口,而不管这些端口连接在集线器还是交换机上.但并非所有的广播流量都是通过相同方式构建的,而是包括第2层广播流量和第3层广播流量的两种主要形式.

    • 在第2层,MAC地址FF:FF:FF:FF:FF:FF是保留的广播地址,任何发送到这一地址的流量都将会被广播到整个网段.第3层也有着一些特定的广播地址.
  • 在通过多个集线器或交换机连接多种媒介的大型网络中,广播数据包将从一个交换机一直被中继到另一个交换机上,从而传输到网络连接的所有网段上.广播数据包能够到达的区域被称为"广播域",也就是任意计算机可以不用经过路由器即可和其他计算机进行直接传输的网段范围.

    • 广播数据包只能在它特定的广播域中流通.

    img

组播
  • 组播是一种将单一来源数据包同时传输给多个目标的通信方式.组播的目的是简化这个过程,并使用尽可能少的网络带宽.
  • 组播通过避免数据包的大量复制来达到优化效果,而对组播流量的处置方式则高度依赖于不同网络协议的实现细节.
  • 实施组播的主要方法是通过一种将数据包接收者加入组播组的编址方案来实现的,这也是IP组播的工作原理.这种编址方案确保数据包不会被传送到未预期的目的地.事实上IP协议将一整段的地址都用于组播,如224.0.0.0~239.255.255.255的IP地址可能就是组播流量.
单播
  • 单播数据包会从一台计算机知直接传输到另一台计算机.单播机制的具体实现方式取决于使用的协议.

DNS

  • 搭建集群内部 DNS 服务器

  • 域名系统(Domain Name System).在 DNS 中,“域名”(Domain Name)又称为“主机名”(Host)

  • 域名用“.”分隔成多个单词,级别从左到右逐级升高,最右边的被称为“顶级域名”.

  • 域名本质上还是个名字空间系统,使用多级域名就可以划分出不同的国家、地区、组织、公司、部门,每个域名都是独一无二的,可以作为一种身份的标识.

    • 而 XML 里使用 URI 作为名字空间,也是间接使用了域名.
  • 想要使用 TCP/IP 协议来通信仍然要使用 IP 地址,所以需要把域名做一个转换,“映射”到它的真实 IP,这就是所谓的“域名解析”.

  • DNS 的核心系统是一个三层的树状、分布式服务,基本对应域名的结构:

    • 根域名服务器(Root DNS Server):管理顶级域名服务器,返回“com”“net”“cn”等顶级域名服务器的 IP 地址;

      • 目前全世界共有 13 组根域名服务器.
    • 顶级域名服务器(Top-level DNS Server):管理各自域名下的权威域名服务器,比如 com 顶级域名服务器可以返回 apple.com 域名服务器的 IP 地址;

    • 权威域名服务器(Authoritative DNS Server):管理自己域名下主机的 IP 地址,比如 apple.com 权威域名服务器可以返回 www.apple.com的 IP 地址.

  • 任何一个域名都可以在这个树形结构里从顶至下进行查询,就好像是把域名从右到左顺序走了一遍,最终就获得了域名对应的 IP 地址.

  • 操作系统里也会对 DNS 解析结果做缓存,如果你之前访问过“www.apple.com”,那么下一次在浏览器里再输入这个网址的时候就不会再跑到 DNS 那里去问了,直接在操作系统里就可以拿到 IP 地址.

  • 另外,操作系统里还有一个特殊的“主机映射”文件,通常是一个可编辑的文本,在 Linux 里是“/etc/hosts”,在 Windows 里是“C:\WINDOWS\system32\drivers\etc\hosts”,如果操作系统在缓存里找不到 DNS 记录,就会找这个文件.

  • 在 Nginx 里有这么一条配置指令“resolver”,它就是用来配置 DNS 服务器的,如果没有它,那么 Nginx 就无法查询域名对应的 IP,也就无法反向代理到外部的网站.

    1
    resolver 8.8.8.8 valid=30s;  #指定Google的DNS,缓存30秒

DNS查询过程

比如你有一个网站要上线,你在域名注册商那里申请了abc.com,那么你的域名A记录就保存在这个域名注册商的DNS服务器上,该DNS服务器称为权威域名服务器.当客户端访问abc.com时,先查找浏览器DNS缓存,没有则查找操作系统DNS缓存,在这一阶段是操作系统dnscache clinet 服务进行DNS缓存的(你在任务管理器里面可以看到一个dns客户端进程,就是这玩意实现缓存的),如果还是没有则查找hosts文件中的域名记录.然后依然没有的话则访问电脑上设置的DNS服务器IP,比如三大营运商的dns服务器或者谷歌的8.8.8.8,此时这一层的DNS服务器称为“野生DNS缓存服务器”,也就是非权威域名服务器.如果还是没有则非权威域名服务器会去查找 根域名服务器-顶级域名服务器-二级域名服务器-权威域名服务器 ,这样客户端就在权威域名服务器上找到了abc.com对应的IP了,这个IP可以是多个,每次客户端请求的时候域名服务器会根据负载均衡算法分配一个IP给你.当DNS缓存失效了,则重新开始新一轮的域名请求.
总结如下:
浏览器缓存->操作系统dns cache ->hosts文件->非权威域名服务器->根域名服务器->顶级域名服务器->二级域名服务器->权威域名服务器.
其中非权威域名服务器还包括LDNS(企业内网DNS服务器),三大营运商DNS,谷歌公开的DNS,微软公开的DNS等.

img

DNS查询方式

  • DNS请求有两种方式:递归查询和迭代查询

域名的使用方式

  • 第一种,也是最简单的,“重定向”.因为域名代替了 IP 地址,所以可以让对外服务的域名不变,而主机的 IP 地址任意变动.当主机有情况需要下线、迁移时,可以更改 DNS 记录,让域名指向其他的机器.
  • 第二种,因为域名是一个名字空间,所以可以使用 bind9 等开源软件搭建一个在内部使用的 DNS,作为名字服务器.这样我们开发的各种内部服务就都用域名来标记,比如数据库服务都用域名“mysql.inner.app”,商品服务都用“goods.inner.app”,发起网络通信时也就不必再使用写死的 IP 地址了,可以直接用域名,而且这种方式也兼具了第一种的优势.
  • 第三种包含了前两种,也就是基于域名实现的负载均衡.这种也有两种方式,两种方式可以混用.
    • 第一种方式,因为域名解析可以返回多个 IP 地址,所以一个域名可以对应多台主机,客户端收到多个 IP 地址后,就可以自己使用轮询算法依次向服务器发起请求,实现负载均衡.
    • 第二种方式,域名解析可以配置内部的策略,返回离客户端最近的主机,或者返回当前服务质量最好的主机,这样在 DNS 端把请求分发到不同的服务器,实现负载均衡.
  • 恶意使用方式:
    • “域名屏蔽”,对域名直接不解析,返回错误,让你无法拿到 IP 地址,也就无法访问网站;
    • “域名劫持”,也叫“域名污染”,你要访问 A 网站,但 DNS 给了你 B 网站.

资源记录

  • DNS中的条目称为资源记录(resource record RR)
RR 说明
A A记录把一个主机名映射成一个32位的IPV4地址.
AAAA 称为"四A"(quad A)记录的AAAA记录把一个主机名映射为一个128位的IPV6地址.
PTR 称为"指针记录"(pointer record)的PTR记录把IP地址映射成主机名
MX MX记录把一个主机指定作为给定主机的"邮件交换器"(mail exchanger)
CNAME CNAME代表canonical name(规范名字),它的常见用法是为常用的服务(例如ftp和www)指派CNAME记录.如果人们使用这些服务器名而不是真实主机名,那么相应的服务挪到另一主机时他们也不必知道.

代理

  • 代理(Proxy)是 HTTP 协议中请求方和应答方中间的一个环节,作为“中转站”,既可以转发客户端的请求,也可以转发服务器的应答.
  • CDN,实际上就是一种代理,它代替源站服务器响应客户端的请求,通常扮演着透明代理和反向代理的角色.
  • 由于代理在传输过程中插入了一个“中间层”,所以可以在这个环节做很多有意思的事情,比如:
    • 负载均衡:把访问请求均匀分散到多台机器,实现访问集群化;
    • 内容缓存:暂存上下行的数据,减轻后端的压力;
    • 安全防护:隐匿 IP, 使用 WAF 等工具抵御网络攻击,保护被代理的机器;
    • 数据处理:提供压缩、加密等额外的功能.

代理的种类

  • 匿名代理:完全“隐匿”了被代理的机器,外界看到的只是代理服务器;
  • 透明代理:顾名思义,它在传输过程中是“透明开放”的,外界既知道代理,也知道客户端;
  • 正向代理:靠近客户端,代表客户端向服务器发送请求;
  • 反向代理:靠近服务器端,代表服务器响应客户端的请求;

MIME

  • 多用途互联网邮件扩展”(Multipurpose Internet Mail Extensions)
  • MIME 是一个很大的标准规范,但 HTTP 只“顺手牵羊”取了其中的一部分,用来标记 body 的数据类型,这就是我们平常总能听到的“MIME type”.
  • MIME 把数据分成了八大类,每个大类下再细分出多个子类,形式是“type/subtype”的字符串,巧得很,刚好也符合了 HTTP 明文的特点,所以能够很容易地纳入 HTTP 头字段里.
  • 但仅有 MIME type 还不够,因为 HTTP 在传输时为了节约带宽,有时候还会压缩数据,为了不要让浏览器继续“猜”,还需要有一个“Encoding type”,告诉数据是用的什么编码格式,这样对方才能正确解压缩,还原出原始的数据.
  • 比起 MIME type 来说,Encoding type 就少了很多,常用的只有下面三种:
    • gzip:GNU zip 压缩格式,也是互联网上最流行的压缩格式;
    • deflate:zlib(deflate)压缩格式,流行程度仅次于 gzip;
    • br:一种专门为 HTTP 优化的新压缩算法(Brotli).

常用类别

  • text:即文本格式的可读数据,我们最熟悉的应该就是 text/html 了,表示超文本文档,此外还有纯文本 text/plain、样式表 text/css 等.
  • image:即图像文件,有 image/gif、image/jpeg、image/png 等.
  • audio/video:音频和视频数据,例如 audio/mpeg、video/mp4 等.
  • application:数据格式不固定,可能是文本也可能是二进制,必须由上层应用程序来解释.常见的有
  • application/json,application/javascript、application/pdf 等,另外,如果实在是不知道数据是什么类型,像刚才说的“黑盒”,就会是 application/octet-stream,即不透明的二进制数据.