1. OSI七层模型 #

Open System Interconnection适用于所有的网络

1.1 分层模型 #

分层模型

1.2 封装过程 #

connect

2. TCP/IP参考模型 #

tcpip

2.1 协议的概念和作用 #

2.2 常用协议 #

分层模型

层级 名称 含义
应用层 HTTP 超文本传输协议(HTTP,HyperText Transfer Protocol)是互联网上应用最为广泛的一种网络协议
应用层 FTP 文件传输协议(英文:File Transfer Protocol,缩写:FTP)是用于在网络上进行文件传输的一套标准协议,使用客户/服务器模式
应用层 TFTP (Trivial File Transfer Protocol,简单文件传输协议)是TCP/IP协议族中的一个用来在客户机与服务器之间进行简单文件传输的协议
应用层 SMTP 简单邮件传输协议 (Simple Mail Transfer Protocol, SMTP) 是在Internet传输Email的事实标准
应用层 SNMP 简单网络管理协议(SNMP,Simple Network Management Protocol),由一组网络管理的标准组成,包含一个应用层协议(application layer protocol)、数据库模型(database schema)和一组资源对象,该协议能够支持网络管理系统,用以监测连接到网络上的设备是否有任何引起管理上关注的情况。
应用层 DNS 域名系统(英文:Domain Name System,缩写:DNS)是互联网的一项服务。它作为将域名和IP地址相互映射的一个分布式数据库,能够使人更方便地访问互联网。
TCP TCP(Transmission Control Protocol 传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议
传输层 UDP UDP 是User Datagram Protocol的简称, 中文名是用户数据报协议,是OSI(Open System Interconnection,开放式系统互联) 参考模型中一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务
传输层 ICMP ICMP(Internet Control Message Protocol)Internet控制报文协议。它是TCP/IP协议簇的一个子协议,用于在IP主机、路由器之间传递控制消息。控制消息是指网络通不通、主机是否可达、路由是否可用等网络本身的消息
网络层 IGMP Internet 组管理协议称为IGMP协议(Internet Group Management Protocol),是因特网协议家族中的一个组播协议。该协议运行在主机和组播路由器之间
网络层 IP 互联网协议地址(英语:Internet Protocol Address,又译为网际协议地址),缩写为IP地址(英语:IP Address),是分配给用户上网使用的网际协议(英语:Internet Protocol, IP)的设备的数字标签
网络层 ARP 地址解析协议,即ARP(Address Resolution Protocol),是根据IP地址获取物理地址的一个TCP/IP协议
网络层 RARP 反向地址转换协议(RARP:Reverse Address Resolution Protocol) 反向地址转换协议(RARP)允许局域网的物理机器从网关服务器的 ARP 表或者缓存上请求其 IP 地址

3. 网络接口层 #

3.1 物理层 #

物理层

3.1.1 数字信号的编码 #

3.1.1.1 非归零编码 #

phisical

phisical

3.2 数据链路层 #

3.2.1 以太网 #

3.2.2 总线型拓扑 #

totalline

3.2.2.1 载波监听多路访问 #
3.2.2.2 冲突检测 #

3.2.3 MAC地址 #

mac

3.2.4 以太网帧格式 #

internetframe

字段 说明
前导符(Preamble) 由1和0交互构成(10101010…..),共占7个字节,用于使PLS子层电路与收到的帧达成时钟同步
帧起始(Start-of-Frame Delimiter, SFD) 为10101011,共占1个字节,表示一个帧的开始。它和前导符共同使接收方能根据1、0交替来迅速实现比特同步,当检测到连续的两位1时,将后续信息交给MAC子层。通常来说,Pre和SFD这两个字段只用于提醒接收端新帧到达,并不计入MAC帧大小,也不算作是MAC帧头的组成部分
目的MAC(Destination Address, DA)/源MAC(Source Address, SA) 分别用于标识目的MAC地址和源MAC地址,两个字段各占6个字节。它们可以是单播地址也可以是广播地址。当地址的最高位为0时表示单播,最高位为1时为组播,全为1时为广播
长度(Length)/类型(Type) 这是一个二选一的字段,共占2个字节,对于不同的网络协议,它有不同的含义。但是,作为类型使用时,如上表所示,最小值也总是大于1536(十六进制0x600);所以不会产生冲突。另外,在IEEE 802.3中,数据字段的长度为38~1500个字节
数据(Data) 该字段对于不同的以太网帧包含的内容不一,对于较老的以太网标准,它是网络层来的数据报;而较新的标准,则是一个LLC帧的全部内容
帧校验序列(FCS) 它是一个包含32位CRC校验值的字段,一共占4个字节。由发送端对MAC帧的DA字段到Data字段间(不包含前导符和帧起始)的二进制序列进行计算

3.2.5 ARP协议 #

3.2.5.1 ARP协议报文 #

arppackage

字段 说明
硬件类型 表示硬件地址的类型,值为1表示以太网地址
协议类型 表示要映射的协议地址类型。它的值为0x0800表示IP地址类型
硬件地址长度和协议长度 以字节为单位,对于以太网上的IP地址的ARP请求或应答来说,他们的值分别为6和4
操作类型 用来表示这个报文的类型,ARP请求为1,ARP响应为2,RARP请求为3,RARP响应为4
发送端MAC地址 发送方设备的硬件地址
发送端IP地址 发送方设备的IP地址
目标MAC地址 接收方设备的硬件地址
目标IP地址 接收方设备的IP地址

arpwireshark

3.2.5.2 ARP地址解析过程 #

arpflow

主机A和B在同一个网段,主机A要向主机B发送信息

4. 互联网层(网络层) #

网络层

4.1 选址 #

交换机是靠MAC来寻址的,而因为MAC地址是无层次的,所以要靠IP地址来确认计算机的位置,这就是选址

网络层

信封

4.2 路由 #

在能够选择的多条道路之间选择一条最短的路径就是路由的工作

网络层

4.3 IP #

在网络中,每台计算机都有一个唯一的地址,方便别人找到它,这个地址称为IP地址。

4.3.1 IP头部 #

ipheader

字段 说明
版本 Version)字段:占4比特。用来表明IP协议实现的版本号,当前一般为IPv4,即0100
首部长部 报头长度(Internet Header Length,IHL)字段:占4比特。是头部占32比特的数字,包括可选项。普通IP数据报(没有任何选项),该字段的值是5,即160比特=20字节。此字段最大值为60字节
优先级与服务类型 占8比特。其中前3比特为优先权子字段(Precedence,现已被忽略)。第8比特保留未用。第4至第7比特分别代表延迟、吞吐量、可靠性和花费。当它们取值为1时分别代表要求最小时延、最大吞吐量、最高可靠性和最小费用。这4比特的服务类型中只能置其中1比特为1。可以全为0,若全为0则表示一般服务。服务类型字段声明了数据报被网络系统传输时可以被怎样处理。例如:TELNET协议可能要求有最小的延迟,FTP协议(数据)可能要求有最大吞吐量,SNMP协议可能要求有最高可靠性,NNTP(Network News Transfer Protocol,网络新闻传输协议)可能要求最小费用,而ICMP协议可能无特殊要求(4比特全为0
总长度 占16比特。指明整个数据报的长度(以字节为单位)。最大长度为65535字节
标识符 占16比特。用来唯一地标识主机发送的每一份数据报。通常每发一份报文,它的值会加1
标志 分为3个字段,依次为保留位、不分片位和更多片位
标志 保留位:一般被置为0
标志 不分片位:表示该数据报是否被分片,如果被置为1,则不能对数据报进行分片,如果要对其进行分片处理,就应将其置为0
标志 更多片位:除了最后一个分片,其他每个组成数据报的片都要将该位置设置为1.
段偏移量 占13比特。如果一份数据报要求分段的话,此字段指明该段偏移距原始数据报开始的位置
TTL(Time to Live生存时间) 该字段用于表示IP数据包的生命周期,可以防止一个数据包在网络中无限循环地发下去。TTL的意思是一个数据包在被丢弃之前在网络中的最大周转时间。该数据包经过的每一个路由器都会检查该字段中的值,当TTL的值为0时此数据包会被丢弃。TTL对应于一个数据包通过路由器的数目,一个数据包每经过一个路由器,TTL将减去1
协议号 占8比特。指明IP层所封装的上层协议类型,如ICMP(1)、IGMP(2) 、TCP(6)、UDP(17)等
首部校验和 检验和是16位的错误检测字段。目的主机和网络中的每个网关都要重新计算报头的校验和,一样表示没有改动过,计算方法是:对头部中每个16比特进行二进制反码求和
源IP地址 该字段用于表示数据包的源地址,指的是发送该数据包的设备的网络地址
目标IP地址 该字段用于表示数据包的目标的地址,指的是接收节点的网络地址

ipwireshark

4.3.2 IP地址格式 #

IP地址

4.3.3 IP地址组成 #

compose

4.3.4 IP地址表示 #

compose

4.3.5 IP地址的分类 #

compose

4.3.6 公有地址和私有地址 #

分类 范围
A类私有IP 10.0.0.0 ~ 10.255.255.255
B类私有IP 172.16.0.0 ~ 172.31.255.255
C类私有IP 192.168.0.0 ~ 192.168.255.255

其他范围的IP均为公有IP地址

4.3.7 子网掩码 #

dividesubnet

transfer

let ip1 = '192.168.0.1';
let ip2 = '192.168.0.4';
let mask = '255.255.255.0';
let ip1s = ip1.split('.').map(item=>(+item).toString(2).padStart(8,'0')).join('');
let ip2s = ip2.split('.').map(item=>(+item).toString(2).padStart(8,'0')).join('');;
let masks = mask.split('.').map(item=>(+item).toString(2).padStart(8,'0')).join('');

console.log(ip1s,parseInt(ip1s,2),parseInt(masks,2),parseInt(ip1s,2)&parseInt(masks,2));
console.log(ip2s,parseInt(ip2s,2),parseInt(masks,2),parseInt(ip2s,2)&parseInt(masks,2));
console.log((parseInt(ip1s,2)&parseInt(masks,2)) === (parseInt(ip2s,2)&parseInt(masks,2)));

5. 传输层 #

transfer

5.1 传输层的功能 #

connect

5.2 协议分类 #

5.3 TCP协议 #

5.3.1 TCP数据包封装 #

5.3.1.1 格式 #

connect

5.3.1.2 32位序列号 #

connect

5.3.1.3 确认应答号 #

connect

5.3.1.4 首部长度 #

connect

5.3.1.5 控制位 #
5.3.1.5.1 SYN #

tcpsyn

5.3.1.5.2 ACK #

tcpack

5.3.1.5.3 FIN #

tcpfin

5.3.1.6 窗口值 #

tcpwindow

5.3.1.7 差错控制 #

connect

5.3.2 握手和断开 #

sequencenumber

tcpflow.png

5.3.2.1 tcp服务器 #
5.3.2.1.1 tcp_server.js #
var net = require("net");
var server = new net.Server();
server.on("connection", function (socket) {
    console.log("connected");
    socket.on('data',function(data){
        console.log(data.toString());
        socket.write("server:"+data);
    })
    socket.on('end',function(data){
        console.log('end');
    })
    socket.on('error',function(error){
        console.log(error);
    })
});
server.listen(8000);
server.on("listening", function () {
    console.log("Created server on http://127.0.0.1:8000/");

})
server.on("close", function () {
    console.log("server closed!");
})
server.on("error", function (err) {
    console.log(err);
})
5.3.2.1.2 tcp_client.js #
var net = require("net");
var socket = net.Socket();
socket.connect(8000, '127.0.0.1', function () {
    console.log("connect the server");
    socket.write("hello");
})
socket.on("data", function (data) {
    console.log(data.toString());
    socket.destroy();
})
socket.on("error", function (err) {
    console.log(err);
})
socket.on("end", function () {
    console.log("data end");
})
5.3.2.1 三次握手 #

handshake1 handshake2 handshake3

5.3.2.2 收发数据 #

sendhello ackhello serverhello ackserverhello

5.3.2.3 四次断开 #

goodbye1 goodbye2 goodbye3 goodbye4

5.3.3 滑动窗口 #

5.3.3.1 窗口机制 #

slidewindow

5.3.3.2 拥塞控制 #

traffic

5.4 UDP #

5.4.1 UDP的封装格式 #

5.4.1.1 数据包 #

connect

5.4.1.2 数据长度 #

connect

5.4.1.3 差错控制 #

connect

5.4.2 UDP的应用 #

5.4.3 UDP服务器 #

5.4.3.1 点对点 #
5.4.3.1.1 udp_server.js #
var dgram = require('dgram');
var socket = dgram.createSocket('udp4');
socket.on('message',function(msg,rinfo){
  console.log(msg.toString());
  console.log(rinfo);
   socket.send(msg,0,msg.length,rinfo.port,rinfo.address);
});
socket.bind(41234,'localhost');
5.4.3.1.2 udp_client.js #
var dgram = require('dgram');
var socket = dgram.createSocket('udp4');
socket.on('message',function(msg,rinfo){
    console.log(msg.toString());
    console.log(rinfo);
});
socket.send(new Buffer('helloworld'),0,5,41234,'localhost',function(err,bytes){
    console.log('发送了个%d字节',bytes);
});
socket.on('error',function(err){
    console.error(err);
});

sendudp

receiveudp

5.4.3.2 广播 #

5.4.3 DNS服务器 #

3.4.3.1 域名 #

域名

3.4.3.2 DNS服务器 #

DNS是Domain Name Service的缩写,DNS服务器进行域名和与之对应的IP地址转换的服务器

3.4.3.3 查找过程 #

dns

5.4.4 DHCP服务器 #

5.4.4.1 工作流程 #

dhcpserver

5.4.4.2 抓包 #

dhcprequest

dhcpack

6. 应用层 #

6.1 协议 #

connect

6.2 应用层常见协议 #

6.3 案例 #

数据->传输层(包)->网络层(段Segment)->数据链路层(帧)

6.3.1 发送方是从高层到低层封装数据 #

connect

6.3.2 接收方是从低层到高层解封装 #

connect

6.3.3 真实网络环境 #

分层模型

7. 附录 #

7.1 不同层中的称谓: #

7.2 IP头服务类型 #