文章目录
- 1.计算机网络
- 1.1计算机网络重点概述
- 1.2 物理层重点(没啥重点)
- 1.3 数据链路层重点
- 1.4 网络层重点
- 1.5 传输层重点
- 1.6 应用层重点
1.计算机网络
1.1计算机网络重点概述
1.1.1 计算机网络分层结构
为什么要分层,分层要做什么:
(1)发起通信的计算机必须将数据通信的通路进行激活。
(2)要告诉网络如何识别目的主机。
(3)发起通信的计算机要查明目的主机是否开机,并且与网络连接正常。
(4)发起通信的计算机要弄清楚,对方计算机中文件管理程序是否已经做好准备工作。
(5)确保差错和意外可以解决。
正式认识分层结构:

1.1.2 OSI七层参考模型
| 名称 | 英文 | 作用 |
|---|---|---|
| 应用层 | Application Layer | 直接为用户的应用进程(例如电子邮件、文件传输和终端仿真)提供服务。如HTTP、SMTP、FTP、DNS等 |
| 表示层 | Presentation Layer | 把数据转换为能与接收者的系统格式兼容并适合传输的格式,即让两个系统可以交换信息 |
| 会话层 | Session Layer | 负责在数据传输中设置和维护计算机网络中两台计算机之间的通信连接 |
| 传输层 | Transport Layer | 负责端到端通讯,可靠传输,不可靠传输 ,流量控制,复用分用 |
| 网络层 | Network Layer | 负责选择路由最佳路径,规划IP地址(ipv4和ipv6变化只会影响网络层),拥塞控制 |
| 数据链路层 | Data Link Layer | 帧的开始和结束,还有透明传输,差错校验(纠错由传输层解决) |
| 物理层 | Physical Layer | 定义网络设备接口标准,电气标准(电压),如何在物理链路上传输的更快 |
OSI七层参考模型通信过程:
- 网络层及以上,每一层都要对上一层发送的数据进行处理(加个头部)
- 数据链路层不仅需要加头部,还需要加尾部
- 物理层什么都不加,只管发送数据(比特流)

1.1.3 TCP/IP四层参考模型

1.1.4 五层参考模型

五层参考模型通信过程:

1.2 物理层重点(没啥重点)
1.3 数据链路层重点
1.3.1 数据链路层的流量控制和可靠传输
流量控制是为了让传输过程中的发送速度和接受速度匹配,减少传输出错与资源浪费
可靠传输是发送端发送什么,接收端就要受到什么
1.3.1.1 停止等待协议(Stop-and-Wait)

停止等待协议的无差错情况:
注释:因为一次就一个,所以用0和1标记ACK(确认序号)就行

停止等待协议的有差错情况:
使用一个超时计时器,每发一帧就开始计时,设置时间略长于一个RTT(往返时延)。
发送端发送数据开始,到发送端收到来自接收端的确认(接收端收到数据后便立即发送确认),总共经历的时延
RTT=传播时延x2+处理时间(有时可能直接忽略)



停止等待协议的特点
1.简单
2.信道利用率低。大部分时间数据都在路上,发送方很长时间闲置,资源浪费

1.3.1.2 后退N帧协议(GBN)
因为停止等待协议太浪费时间了,所以尝试采用GBN,发送连续多个数据帧,以增大信道利用率
注释:
累计确认:就是收到一个确认帧,那么它和它之前的所有帧都默认已收到,反之,如果某个确认帧没收到,那么它和它之后的所有帧都默认丢失(即使收到了也丢掉),进行重传

下图是一个实例:
注释:此图发送2帧时丢失,所以接收方几首收到后面的帧也是直接丢弃并且发送最晚收到的有效帧1的ACK,直至2帧的超时重传机制被触发进行重传并得到ACK之后,接收方才会接受2帧以及后面的帧
如果所示,GBN的形式就像排队,接收端为所有帧“预定”了接收位置,如果接收端发送的数据因为某些原因没有接收到,即使收到了这一帧后面所有的帧,这些“排在后面的”帧也要被丢弃

发送窗口不能无限大,与使用的编号的比特数有关,二进制表示:
- 很简单,就是1比特编号0和1,
- 同理2比特编号0-3,二进制表示就是00,01,10,11。
- 如果用1比特编号,却要4个窗口长度,那么窗口内数据编号都编不过来,直接乱套了
- GBN的优缺点也显而易见,优点是相对于上面的停止等待协议,明显提高了信道利用率,缺点是因为重传机制的原因,导致已经收到数据却需要强行丢弃,进而造成浪费
1.3.1.3 选择重传协议(SR)
吸取了GBN协议的教训,我们打算尝试只重传错误的帧,这样的话就不用浪费资源把已经收到的帧再重传一次了。
在GBN中,仅有接收端有一个窗口来存放数据帧,在SR中,两者都有窗口了。
和GBN的区别其实就是做了一个数据缓存,已经收到的帧不用扔了,等待之前因意外丢失的帧收到的时候确认即可,但是只能缓存窗口尺寸内的包含的帧(注释:缓存不可能无限大)
SR运行过程:
注释:2帧丢失之后仍然在发送,但是2帧丢失之后只是缓存,并没有移动窗口;它可以继续接受窗口范围内排在2帧后面的数据帧,直至最后2帧收到后一次性确认窗口内的所有已经收到的帧,再移动窗口。

同样的,因为编号的问题,发送窗口不能无限大
当发送窗口最后和接受窗口大小相同时,利用率比较高
1.3.2 介质访问控制技术
就是让节点之间的通信不会进行相互干扰

1.3.2.1 静态划分信道–信道划分协议
1.3.2.1.1 频分多路复用FDM

1.3.2.1.2 时分多路复用TDM

1.3.2.1.3 统计时分复用STDM
TDM的缺点就是利用率低,所以又衍生出了STDM
STDM的原则是先到先走,满了就发,相对于TDM提高了利用率

1.3.2.1.3 码分多路复用CDM
每个节点分配一种不同的编码,每个节点使用其唯一的编码来对发送的数据进行编码(如果精心选择编码,不同节点能同时传输)

1.3.2.2 动态分配信道–随机访问协议
所有用户都可以随机发送信息,发送时可以占用全部带宽,理论上个人使用时比静态分配信道的速度更快
1.3.2.2 .1 ALOHA协议
帧到达节点时,立刻传输。如果发生碰撞,节点将立即(在完全传输碰撞帧后)以概率p重传。否则,等待一个帧传输时间,再以概率p重传。信道有效传输速率实际不是R bps,而是时隙ALOHA的一半

时隙ALOHA协议:
时间被划分为时隙,每个节点的时间同步,帧的传输只在时隙的开始时进行。如果发生碰撞,在下一个时隙开始时以概率p重传,否则等待一个时隙再以概率p重传…(信道有效传输速率实际不是R bps,而是0.37R bps)

1.3.2.2.2 CSMA协议(载波侦听多路访问)

| 名称 | 描述 | 优点 | 缺点 |
|---|---|---|---|
| 1-坚持CSMA | 发送信息时监听信道,一空闲下来就立即传输,信道忙也一直监听,如果发送时冲突就等待随机时长之后再监听 | 立即发送,利用率高 | 如果多台设备同时监听,那么会发生冲突 |
| 非坚持CSMA | 发送信息时监听信道,如果空闲就立即传输,信道忙就随机等待一段时间后再监听 | 冲突发生的几率减少 | 因为需要等待,所以利用率不高 |
| p-坚持CSMA | 发送信息时监听信道,空闲时以概率p进行传输,概率1-p不传输。信道忙就随机等待一段时间后再监听 | 冲突减少的同时效率也比较高 | 即使发生冲突也要坚持发送数据,资源被浪费 |
1.3.2.2.3 CSMA/CD协议
因为链路实际有长短,发送数据需要时间,这个时间内可能就被其他节点当成空闲状态导致发生碰撞。
先侦听信道,如果没有其它节点在使用信道,则传输数据。但是有碰撞检测,如果发生碰撞,会停止传输剩下的数据,等待一个随机时间(通常比传输一帧短)后,再进行尝试。
知道自己发生碰撞的最长时间是2τ(两倍的传播时延),就是一去一回

图示传播时延对载波监听的影响:



由此我们可以想到最小帧长的问题,因为如果帧太短,帧都发送完了才检测到碰撞导致停止,导致无法停止碰撞

1.3.2.2.4 CSMA/CA协议


1.3.2.2.5 CSMA/CD 与 CSMA/CA的区别

1.3.2.3 动态分配信道–轮询访问协议
主要包括两大类,一个是轮询协议,另一个是令牌传递协议
1.3.2.3.1 轮询协议
就是选出一个代表,让他控制所有的传输
注释:
轮询开销在随着服务的节点越多,需要用于查询是否发送数据发送的数据帧也就越多,会造成一定开销
等待延迟就是因为这是轮流“邀请”,所以难免某个节点需要发送数据,但是主节点还在较远的需要里有需求的节点那边,导致需求得不到立即响应
单点故障很好理解,就是代表挂了

1.3.2.3.2 令牌传递协议
注释:在节点之间没有收发数据的需求时,令牌在节点之间循环。
发送数据的流程
- 当一个节点需要时就可以获得这个令牌。然后修改这个令牌的状态(空闲->占用)
- 再将令牌与数据帧结合,让其在节点构成的环之间流动
- 不是目的地的节点收到令牌也不接受,直接略过,目标节点收到信息并复制一份到本地(传输完成),因为是个闭环,所以发送节点最后得到令牌
- 最后,发送令牌的节点对令牌的内容进行检查,如果发现数据出错还要重新发一遍
问题基本和轮询协议相同

1.3.3 广域网

1.3.3.1 广域网使用的链路层协议
1.3.3.1.1 PPP协议(Point-to-Point Protocol)
PPP协议是目前使用最广泛的数据链路层协议,拨号基本都是PPP协议
PPP协议仅支持全双工链路
PPP协议需要满足的要求:

PPP协议不需要满足的要求:

PPP协议组成成分以及功能:

PPP协议的帧格式:

1.3.3.1.2 HDLC协议(High-Level Data Link Control)

HDLC的三种站:

HDLC的帧格式:

1.3.3.1.3 PPP协议和HDLC协议对比
为什么HDLC协议更可靠,但是我们使用PPP协议?
因为现在网络要求高,数据链路层本来就是不可靠的尽力传输,差错控制这些复杂的交给了TCP等

1.3.4 链路层设备的冲突域和广播域

1.4 网络层重点
1.4.1 数据交换方式
为什么要进行数据交换?因为每个节点之间都拉网线太麻烦了也不实际,所以通过大量交换设备互联进行数据交换

1.4.1.1 电路交换
常见的例子:打电话
注释:
链路支持多路复用(可参考数据链路层的TDM等)
特点是独占资源,因为两者建立了连接

1.4.1.2 报文交换
**注释:**报文发送的过程
1.源先根据报文加上ip地址,物理地址等,通过物理层发送
2.交换机收到报文之后,先进行存储,等待链路空闲之后进行转发,但是转发的路径不是固定的,是比较随机的
3.最后通过许多交换机最终到达目的地

1.4.1.3 分组交换
分组交换和报文交换基本相同,就是将报文切割之后再进行发送

1.4.1.3.1 分组传输的两种传输方式-数据报与虚电路

数据报:

虚电路:

数据报与虚电路的区别:

1.4.2 路由算法和路由选择协议
路由算法就是让路由知道收到报文之后下一步怎么走

AS就是多个路由器之间构成的单独的小圈子,圈子内使用自己的协议,圈子和圈子之间用的是BGP协议

1.4.2.1 内部网关协议IGP–RIP协议和距离向量算法
1.4.2.1.1 RIP协议概述
通过交换信息构建路由表

1.4.2.1.2 如何建立路由表

1.4.2.1.3 RIP协议报文格式

1.4.2.1.4 RIP协议特点
就是来回更新路由表,错误信息被覆盖,导致直至达到距离上限强制错误时才可以得知出错




1.4.2.1.5 距离向量算法
注释:
为什么改地址?因为图中是从x得到的信息
为什么距离固定+1?因为路由器只从相邻路由器之间获取RIP报文,举例只会是1
为什么下一跳是x就要替换?因为网络环境不断变化,可能这次某个节点挂掉,所以保持最新的
为什么下一跳不是x时有更新和不处理两种手段?因为这样可以提高效率,比原来快就换,比原来慢就保留原来的,也可以理解


1.4.2.2 内部网关协议IGP–OSPF协议和链路状态算法
1.4.2.2.1 OSPF协议概述

1.4.2.2.2 OSPF区域

1.4.2.2.3 OSPF分组

1.4.2.2.4 OSPF的其他特点
为什么OSPF收敛速度快?因为它只是刷新一下链路状态,得知其是否连通,不需要和RIP一样进行对照,而是直接通过Dijilstra算法来自己算出路径

1.4.2.2.5 链路状态路由算法

1.4.2.3 外部网关协议EGP–BGP协议
1.4.2.3.1 BGP协议简介

1.4.2.3.2 BGP协议交换信息的过程
了解即可,只需要知道BGP交换协议里面交换的是一组路径向量


1.4.2.3.3 BGP协议报文格式
BGP是应用层协议

1.4.2.3.4 BGP协议特点

1.4.2.3.5 BGP的四种报文

1.4.2.4 三种路由协议的比较


1.4.3 IP数据报
IP数据报格式:
| 名称 | 注释 | 大小 |
|---|---|---|
| 版本 Version | ipv4或者ipv6 | 4位 |
| 首部长度 IHL | 此处数值再乘以4才是真正大小,同时因为IP数据报固定长度为20字节,所以此处最小值为5,即二进制的0101 | 4位 |
| 区分服务 DSCP + ECN | 希望获得哪种服务,用的比较少 | 8位 |
| 总长度 Total Length | 首部+数据的长度,最大为2^16-1=65535 | 16位 |
| 标识 Identification | 用来表示是哪一个数据报的分片,不同的分片标识各不相同 | 8位 |
| 标志 Flags | 用来表示是否分片和分片是否结束 | 3位,但实际有用的只有后两位 |
| 片偏移 Fragment Offset | 用来标记分片之后,该分片在原来的数据报的位置,以8字节为单位 | 13位 |
| 生存时间 Time To Live | 即TTL,没经过一个路由器TTL-1,0时自动放弃,根据系统不同默认的TTL不同 | 8位 |
| 协议 Protocol | 用来标记协议名的字段值,如TCP,UDP,ICMP等等 | 8位 |
| 首部检验和 Header Checksum | 检验首部的字段是否出错,出错就丢弃此数据报 | |
| 源地址 Source IP Address | 发送方ip地址 | 32位 |
| 目的地址 Destination IP Address | 接收方ip地址 | 32位 |
| 可选字段 Options | 用来排错等安全检测 | 未知,可在0-40位之间 |
| 填充 | 将数据报对齐成4字节的整数倍,数值全部为0 | 未知,根据可选字段来定 |


计算偏移量时记住是以0开始的就行,以每一篇最开始的除以8得到的数值就是偏移量
MF和DF的定义见上图

1.4.4 IPV4
1.4.4.1 ipv4地址
全球唯一的表示某一个主机或者路由器接口的编码
ipv4地址分类:

解释一下
为什么A类最大是126.xxx.xxx.xxx?
因为网络号最开始第一位是0,一共八位,所以二进制表示位0xxxxxxx,最大就是2^7-1=127,但是因为127.xxx.xxx.xxx是特殊ip地址,所以将其去掉
为什么B类最大是191.255.xxx.xxx?
因为网络号最开始第一位是10,一共八位,所以二进制表示位10xxxxxx,最大就是10111111=191,最小就是10000000=128,无特殊ip地址
为什么C类最大是223.255.xxx.xxx?
因为网络号最开始第一位是110,一共八位,所以二进制表示位110xxxxx,最大就是11011111=223,最小就是10000000=192,无特殊ip地址
特殊ip地址:

私有ip地址:

1.4.4.2 子网划分和子网掩码
1.4.4.2.1 子网划分和子网掩码
总结一下,就是ip利用率太低造成对ip资源的浪费,所以需要子网划分提高ip利用率

注释:
为什么子网好能全0或者全1:因为CIDR编址(可见下一段)
为什么主机号不能全0或者全1:因为全0代表本网络,全1代表广播分组

1.4.4.2.2 子网掩码
子网掩码就是用来和ip地址一起计算子网的地址的
方法就是讲子网掩码逐位写成二进制然后而原来ip地址进行与运算,就可以得到子网ip地址
因为255是11111111,所以如果写着255的话,ip地址和子网ip地址对应的地方的数值就相同


这道题可以看出来,即使子网掩码不同,相同ip地址对应的子网ip地址也可能相同
但是子网掩码不同,划分的子网数目不同
为什么划分的子网数目不同?或者说怎么算划分的子网位数目?
以255.255.192.0为例,255是11111111即八个1,192是11000000即2个1,一共是82+2=18个1,一共有32位地址,所以剩余有32-18=14位
以255.255.224.0为例,255是11111111即八个1,224是11100000即3个1,一共是82+3=19个1,一共有32位地址,所以剩余有32-19=13位
1.4.4.2.3 使用子网时的分组转发

注释:
1.这里特定主机路由就是指找特定的处理这里这个ip地址的路由
2.默认路由会将这个数据报发给另一个路由,直至找到对应的路由,或者TTL耗尽被丢弃
1.4.4.3 无分类编制CIDR

使用CIDR可以聚合网络
如图,通过缩短前缀,R1和R2就可以合并在206.1.0.0/16的子网下
但是这样转发表之中就会有多个匹配结果,所以我们使用最长前缀匹配
构成超网:

1.4.4.4 ARP协议


1.4.4.5 DHCP协议

1.4.4.6 ICMP协议
1.4.4.6.1 ICMP协议概述
ICMP,IGMP处于网络层和传输层之间,就是为了更好地转发ip数据报和提高交互成功的几率

1.4.4.6.2 ICMP差错报告报文
ICMP差错报告报文如何与IP数据报结合:

五种ICMP差错报文:
其中源点抑制已废弃不用

四种不发送ICMP差错报文的情况:
**注释:**组播是指由一点到多点,但不是无脑发到所有点,无脑发到所有点的是广播,组播有筛选条件

1.4.4.6.3 ICMP询问报文
四种ICMP询问报文:
后两种是掩码地址请求和回答报文,路由器询问和通告报文,这两个已经废弃不再使用

1.4.4.6.4 ICMP的应用
1.ping命令:测试两个主机之间连通性,使用了ICMP回送请求和回答报文
2.traceroute命令:跟踪一个分组从原点到终点的路径,使用了ICMP时间超过差错报告报文
traceroute命令讲解
1.4.5 IPV6
1.4.5.1 为什么会有IPV6
就是IPV4地址用完了,从根本上增加ip地址数目,之前讲的NAT和CIDR也只是在IPV4的基础上扩展了IPV4地址数目,治标不治本

1.4.5.2 IPV6地址表示形式

1.4.5.3 IPV6数据报格式
| 名称 | 作用 | 位数 |
|---|---|---|
| 版本 Version | 知名协议版本,此处因为是ipv6所以总是6 | 4位 |
| 优先级 Traffic Class | 又来区分数据报的类型和优先级 | 8位 |
| 流标签 Flow Label | 和ipv4标识某个数据报分片不同,这是对于一整个数据报流的标记 | 19位 |
| 有效载荷长度 Payload Length | 指的是扩展首部+数据部分的大小,和ipv4的总长度和首部长度都不同,ipv6的首部长度是固定的40字节 | 16位 |
| 下一个首部 Next Header | 基本首部的下一个首部指的是有效载荷里标记的的扩展首部,有效载荷里的扩展首部再指向有效载荷里标记的的扩展首部,直至最后指向数据 | 8位 |
| 跳数限制 Hop Limit | 基本相当于ipv4当中的TTL,每到一个路由器-1.减到0时丢弃 | 7位 |
| 源地址 Source Address | 发送方ipv6地址 | 128位 |
| 目标地址 Destination Address | 接收方ipv6地址 | 128位 |

1.4.5.4 IPV6基本地址类型
| 名称 | 作用 | 要求 |
|---|---|---|
| 单播 | 一对一通信 | 可做源地址,目的地址 |
| 多播 | 一对多通信,以前的广播地址当做覆盖所有主机的多播 | 可做目的地址 |
| 任播 | 一对多当中的一个通信,看似一对多,实则一对一 | 可做目的地址 |
1.4.5.5 IPV6向IPV4过渡的政策
如果是ipv6的数据报到了ipv4,就用ipv4重新封装,把ipv6数据报前面加上ipv4伪装成ipv4数据报继续传输,直至到了ipv6路由再解开ipv4伪装

1.4.6 IPV4和IPV6的区别

1.4.7 IP组播(多播)
1.4.7.1 IP数据报的三种传输方式
单播只能一对一,广播必须一对全部,组播就可以是一对全部中的一部分

辅助理解:单播所占资源多

组播明显减轻了压力

1.4.7.2 IP组播地址

1.4.7.3 硬件组播
就像全F的mac地址代表广播一样,00-10-5E打头的MAC地址就代表组播
为什么最大是00-10-5E-7F-FF-FF?因为只有最后23位决定

1.4.7.4 IGMP协议
**注释:**IGMP只能知道有没有组播组成员,对有几个组播组成员,成员在哪个地方都不知道


1.4.7.5 组播路由选择协议
有了这个,成员可以自行找到转发组,自行决定参加哪个组播(就像电视机选台一样)


1.4.8 集线器,网桥,路由表几层设备比较

1.5 传输层重点

1.5.1 传输层的寻址和端口
端口号只用于计算机分辨本地进程,总共有2^16=65536种端口号,端口号有很多种,不能随便使用

1.5.2 常见的应用程序端口号

1.5.3 传输层的两个协议

1.5.4 UDP协议
1.5.4.1 UDP概述
注释:
因为UDP一次发送一个完整报文不会分片,所以需要应用层传输过来的数据不要太大,否则网络层分片任务就很重,但是也不能太小,不然效率较低
UDP适合一些实时应用,因为实时应用延迟要求高,需要立即响应

1.5.4.2 UDP首部格式

1.5.4.3 UDP的校验位构成
这里的伪首部只是用来计算检验和的,计算完了就丢弃,可以见下UDP的校验方式

1.5.4.4 UDP校验方式
总结一下步骤:
在发送端的时候:
1.就是将每一行(4字节)拆成两部分,左右平均2字节大小,将这两字节数据写成二进制,那么2字节一共就需要2*8=16位。此时检验和没有计算,默认填充0,同时如果数据字段不整齐,则用0补齐,这样就可以写出几十行二进制数,如图中方所示
2.计算着几十行二进制数按二进制反码运算求和,二进制反码运算可以参考
二进制反码求和运算
得到的最后简介再反码,之后将反码之后的放入原来的检验和字段
在接收端的时候:
与发送端的时候不同的是,此时检验和字段不是0了
按照发送端的步骤再将所有数据写成二进制进行二进制反码运算求和
如果最后得到结果全1就是没问题,否则丢弃
1.5.5 TCP协议
1.5.5.1 TCP协议的特点
TCP必须要建立连接之后才可以进行数据交换,所以TCP是面向连接的

TCP传输数据是随机切割数据的

1.5.5.2 TCP报文段的首部
注释:
见上图,可以看到TCP是将数据随机分割后加上TCP头传输的,所以
序号就是为了标记这些随机分割之后的数据,这里把第一个字节的编号当成序号
确认号就是收到之后做一下标记,代表这之前的都收到了,希望收到的下一个编号的数据就是确认号打头的那个数据
偏移量就是为了标记一下距离TCP开始多少字节是数据,这里的单位是4B,这个偏移量就是TCP首部长度

窗口就是接收方告诉发送方,还有多少地方(缓存)可以放数据
紧急指针就是告诉TCP从哪里到哪里是紧急数据

1.5.5.3 TCP的六个控制位
1.5.5.3.1 紧急位URG
URG的特点就是让数据插队,URG=1的就会在缓存中被提前到第一个传输


1.5.5.3.2 确认位ACK

1.5.5.3.3 推送位PSH
就是接收端的URG,将PSH=1的数据尽快接收
注意一下,如果没有PSH,一般都是接收方缓存满了之后再将数据发送到主机

1.5.5.3.4 复位RST

1.5.5.3.5 同步位SYN
A和B主机要建立连接,就A先发一个报文,其中SYN=1
B收到之后也回复一个SYN=1的报文,代表接受连接

1.5.5.3.6 终止位FIN

1.5.5.4 TCP三次握手(建立连接)
| 名称 | 作用 |
|---|---|
| SYN | 同步序号,用于建立连接过程,在连接请求中,SYN=1和ACK=0表示该数据段没有使用捎带的确认域,而连接应答捎带一个确认,即SYN=1和ACK=1 |
| FIN | 用于释放连接,为1时表示发送方没有发送了 |
| ACK | 为1表示确认号有效,为0表示报文不含确认信息,忽略确认号字段,上面的确认号是否有效就是通过该标识控制的 |
| ack | 是期望收到对方下一个报文段的第一个数据字节的序号 |
| seq | TCP连接中传送的字节流中的每个字节都按顺序编号 |
注释:
第一段的意思是:
SYN同步序号=1:(A)要建立连接了!
seq序号=x(随机):因为还没有数据,所以写什么都无所谓
第二段的意思是:
SYN同步序号=1:我(B)同意你(A)建立连接!
ACK确认序号=1:连接建立了,之后的ACK必须都置为1
seq序号=y(随机):因为还没有数据,所以写什么都无所谓
ack确认号=x+1:之前发送方(A)说发送的是第x位数据(虽然发送方是瞎说的),所以我(B)要的是x+1位数据
第三段的意思是:
SYN=0:SYN只有在建立连接时才为1,其他时候均设为0
ACK=1:连接建立了,之后的ACK必须都置为1
seq=x+1:我(A)发送的报文段的第一个字节就是x+1
ack=y+1:之前接收方(B)说发送的是第y位数据(虽然接收方是瞎说的),所以我(A)要的是y+1位数据
注意一下,TCP是双向的,所以不存在绝对不变的发送方接收方,这里的两台主机都同时是发送方和接收方

TCP三次握手特定导致的SYN洪泛攻击:

1.5.5.5 TCP四次挥手(连接释放)
| 名称 | 作用 |
|---|---|
| SYN | 同步序号,用于建立连接过程,在连接请求中,SYN=1和ACK=0表示该数据段没有使用捎带的确认域,而连接应答捎带一个确认,即SYN=1和ACK=1 |
| FIN | 用于释放连接,为1时表示发送方没有发送了 |
| ACK | 为1表示确认号有效,为0表示报文不含确认信息,忽略确认号字段,上面的确认号是否有效就是通过该标识控制的 |
| ack | 是期望收到对方下一个报文段的第一个数据字节的序号 |
| seq | TCP连接中传送的字节流中的每个字节都按顺序编号 |
注释:
第一段的意思是:
FIN=1:(A)要释放连接了!
seq=u:发了好多数据,这里只是用u指代一下,这里u是有确定值的
第二段的意思是:
ACK=1:连接建立了,之后的ACK必须都置为1
seq=v:发了好多数据,这里只是用v指代一下,这里v是有确定值的
ack=u+1:之前发送方(A)说发送的是第u位数据,所以我(B)要的是u+1位数据(尽管此时A已经决定释放连接了)
第三段的意思是:
FIN=1:(B)要释放连接了!
ACK=1:连接建立了,之后的ACK必须都置为1
seq=w:发了好多数据,这里只是用w指代一下,这里w是有确定值的
ack=u+1:之前发送方(A)说发送的是第u位数据,所以我(B)要的是u+1位数据(因为A直接不发数据了,所以第二段第三段的ack都是u+1)
第四段的意思是:
ACK=1:连接建立了,之后的ACK必须都置为1
seq=u+1:之前发的数据时第u位数据,B也要第u+1位数据,所以我发第u+1位数据
ack=w+1:之前发送方(B)说发送的是第w位数据,所以我(A)要的是w+1位数据
为什么需要等待计时2MSL?
因为这样可以保证B可以收到A的终止报文段进而进入关闭状态
比如说如果A的第四段报文丢失,那么等待一个MSL之后B就会重传第三段报文,花费小于1MSL之后A就会再收到第三段报文,之后就可以再次向B发送第四段报文提示B关闭连接

1.5.6 TCP可靠传输
TCP是提供可靠传输,UDP这种本身还是不可靠传输的就再靠应用层解决了

1.5.6.1 序号
就是TCP根据下方数据链路层的MTU(最大传输单元)来随即将数据切割成好几端并且进行编号

1.5.6.2 确认
发送方每一次发送数据之后都需要接收方进行确认。
TCP使用的是累计确认机制,就是从第一个丢失的字节开始请求丢失的报文段。如图中456丢失,78到达,但仍然请求发送的数据序号是4

1.5.6.3 重传
为什么要使用自适应算法?网络环境太复杂,路径又长又短,RTT设置短了照顾不了距离远的,RTT设置长了又导致网络利用率降低,所以使用RTTs

1.5.7 TCP流量控制
简单来说就是接收方可以动态的发送信息告诉发送方发送窗口的大小。
接收方接受不过来了就让发送方发送窗口小点,这样发送方发送的速率就慢下来了,接收方就有时间处理它的数据了
接受方处理完了也可以发送请求让发送方发送窗口大点,这样发送方发送的速率就快起来了,接收方就可以处理更多数据而不是空闲等着收数据了

计时器:
在本例子中,使用的累计确认机制(一次回复收到ack=201)和三次流量控制机制。
但是有一个情况就是,如果最后B不允许A再发送数据了,B在处理完数据之后想要恢复窗口大小时发送的有rwnd大小的数据报丢了怎么办?此时A有B的指令在前,发送窗口为0无法发送数据,B也在等待A回复,造成了类似死锁的现象
解决方法:使用计时器
1.5.8 TCP拥塞控制
流量控制是对单独一个来说的,拥塞控制是一群

1.5.8.1 拥塞控制四种算法:
这里虽然是四种算法,但是通常是两两结合进行使用

1.5.8.1.1 慢开始和拥塞避免
这里开始时以指数形式增长,ssthresh的意思是慢开始门限,代表从这个地方注入的报文段就比较多了,需要开始慢速增加了。
之后一段都是线性增长,每次增加1,直至达到网络拥塞状态
瞬间将cwnd设置为1,同时调整原来的ssthresh的值到之前达到网络拥塞状态的1/2,(这里是24降到12)
重复以上步骤,但是注意此时ssthresh变了之后线性增长的转折点也变了
1.5.8.1.2 快重传和快恢复
这里和上面的慢开始和拥塞避免的一开始步骤差不多,都是先指数增长再转变为线性增长。
不同的点是快重传和快恢复算法是在收到连续的ack确认之后执行,这里的ack就是冗余ack,冗余ack的特点是如果多次对某一段请求的数据没有被收到,达到一定数目之后就会立即执行重传。但是此时只是降到现在cwnd的一半,再重新线性增长。而不是像慢开始和拥塞避免的从头开始
1.6 应用层重点
因为不同的网络应用之间需要有一个确定的通信规则

1.6.1 两种常用的网络应用模型
1.6.1.1 客户/服务器模型(Client/Server)

1.6.1.2 P2P模型(Peer-to-Peer)
网络健壮性指的是P2P模型不容易坏掉,即使一个节点坏了也没问题,可以有其他节点代替

1.6.2 域名系统协议(DNS)
DNS就是将打在地址栏的域名转化为IP地址的东西

1.6.2.1 域名
域名就是www.xxx.com,当然这是最简单的一种
.com之后还可以有东西,称之为根
域名从左向右,级别逐渐增高

1.6.2.2 域名服务器(DNS服务器)
DNS服务器有很多台,根据层次结构分为三层,根域名服务器,顶级域名服务器,权限域名服务器
本地域名服务器不算层次结构,特点是里主机比较近,当主机和另一台比较近的主机通信时,就不用走哪些更高级的服务器了
根域名服务器并不是一个域名只有一台,而是一个域名对应多台域名服务器,全世界一共有13个这样的域名,分别是a.rootservers.net,b.rootservers.net,c.rootservers.net,~m.rootservers.net
在权限域名服务器中,虽然看似abc.com比y.abc.com少了一位,但是他们的地位仍是对等的,对应的两台权限域名服务器
1.6.2.3 域名解析过程


1.6.2.3.1 递归查询
在上图中
主机先是想本地域名服务器发送请求,如果查不到的话,
本地域名服务器向根域名服务器发送请求(找别人),如果还是查不到的话,
根域名域名服务器向顶级域名服务器发送请求(找别人),如果还是查不到的话,
顶级域名服务器向权限域名服务器发送请求(找别人)
可以看到每一次向下一个查询的服务器都变了,不是主机一个个去问,而是服务器自己一个个问下去
1.6.2.3.2 迭代查询
在上图中
主机先是向本地域名服务器发送请求,如果查不到的话,
本地域名服务器就去向根域名服务器发送请求(本地域名给服务器去找),如果还是查不到的话,
根域名域名服务器让本地域名服务器去向对应的顶级域名服务器发送请求(本地域名给服务器去找),如果还是查不到的话,
顶级域名服务器让本地域名服务器去向权限域名服务器发送请求(本地域名给服务器去找),找到后返回给主机
可以看到这里是本地域名服务器一个个挨个问的地址
1.6.2.3.3 高速缓存
为了减少多次查询同一个域名的资源浪费,本地域名服务器会存储最近使用的ip地址解析,下次再访问同一个域名就不需要这么多查询步骤了。同时这个高速缓存主机本身也有存储
同时本地域名服务器还可以对顶级域名服务器,权限域名服务器的地址进行缓存,下一次即使是不知道的ip地址,查询也可以更快
高速缓存为了保持正确性,需要定时更新
1.6.3 文件传输协议(FTP,TFTP)
TFTP是一个轻量的,比较容易实现的,面对小文件的,UDP的文件传输协议
这里我们重点是FTP协议

1.6.3.1 FTP的服务端和客户端

1.6.3.2 FTP的工作原理
为什么有匿名登陆:对于一些公共服务器来说,增加验证阶段就是增加资源开销,减少验证阶段就可以节省资源来更好地服务
主进程和从属进程的区别:主进程是打开端口,让外部发送的数据可以进来,并且将这些数据逐个分配各从属进程。从属进程则是单独为这些数据服务

先注释一下这里的主进程被忽略掉了,只是没标在上面,不是没有啊
这里客户端和服务器端先建立TCP连接,端口是21,称为控制连接
然后看情况是主动建立连接还是被动建立连接
主动建立连接是指服务器端主动发送请求和客户端进行连接,此时端口号固定是20
被动连接是指客户端发送请求和服务器端建立数据传送连接,此时端口号是不确定,有两者协商得到
数据传输完成之后,数据连接断开,控制连接继续保持,直至两边发送断开请求

FTP的两种传输模式了解即可:

1.6.4 电子邮件
1.6.4.1 电子邮件的格式

1.6.4.2 电子邮件系统的组成结构
注释:
用户代理的四个功能注释:
撰写就是给用户编辑信件的环境
显示就是可以看到自己写的和自己收的信件内容
处理就是对信件进行操作,包括删除,打印,转发等等
通信就是可以将邮件发送到邮件服务器当中,同时可以从邮件服务器当中读取邮件
邮件服务器的功能注释:
邮件服务器端的发送和接受是指从自己的用户代理处接收邮件,之后向对面的邮件服务器发送邮件
邮件服务器的报告邮件发送结果就是投递是否成功这种情况
邮件服务器既可以作为客户端又可以作为服务器端,使用的是C/S方式
协议的功能注释:
发邮件用的是SMTP
收邮件的是POP3或者IMAP


1.6.4.3 简单邮件传送协议SMTP
注意一下,这里STMP客户和服务器不是固定死的,可以也可以成为服务器,服务器也可以成为用户,由发送方和接收方决定,发送方就是客户,接收方就是服务器

注释:
可以看见这里比如
220 service ready
250 OK
421 service not available
550 xxx
354 xxx
都是应答信息
这里RCPT能有多条命令的原因是,电子邮件可以有多个收件人,就是群发,所以允许多个RCPT
再强调一下,这里服务器和客户端可以互换,视具体情况而定,发送方是客户端,接收方是服务器端

1.6.4.4 改进SMTP缺点的MIME协议
MIME改善SMTP发送数据的缺点,是SMTP的功能性扩展
MIME协议已经逐渐开始应用到浏览器当中,通过对不同文件类型用不同的标识符标识,来让浏览器读取通过MIME的相关文件

1.6.4.5 邮局协议POP3
这里接收方是客户端,邮件服务器是服务器端
POP3确实很简单,但是有不少缺点,比较难受的就是邮件一旦下载就自动删除了

1.6.4.6 比较复杂的读取邮件的协议——IMAP协议

1.6.4.7 基于万维网的电子邮件
与之前的不同的地方就是,基于万维网的电子邮件的邮件服务器端可以不同
同时,发送邮件使用的SMTP/MIME和收邮件时的POP3/IMAP协议都换成了HTTP协议

1.6.5 万维网和HTTP协议
1.6.5.1 万维网概述
URL用来标识整个互联网当中的某一个资源(文字,视屏,音频等)的位置
HTTP用来将这些资源传送给用户
HTML帮助设计者来设计页面,让不同设计者设计的页面都可以在界面上显示

1.6.5.2 HTTP协议
1.6.5.2.1 HTTP协议的过程
这张图里讲了HTTP的具体过程
服务器通过TCP 80端口来监听HTTP请求
注意HTTP可以不一次性下载完页面的所有资源,可以只下载文本部分,其他音频视频等待用户下一步请求之后再传输

1.6.5.2.2 HTTP协议的特点

1.6.5.2.3 HTTP的连接方式——持久连接和非持久连接
非持久连接在TCP三次握手的第三次握手时发生,将HTTP请求作为第三次握手的数据部分发给服务器,服务器收到请求之后将HTTP相应报文传输给客户。耗时就是RTT*2+文档传输时间。
缺点就是这样如果再想传输,那么就需要重新建立TCP连接从头开始
持久连接和非持久连接类似,都是在第三次握手时发生,将HTTP请求作为第三次握手的数据部分发给服务器,服务器收到请求之后将HTTP相应报文传输给客户。但是持久连接再需要请资源的时候就不需要建立新的TCP连接了

持久连接的两种方式——非流水线和流水线:
非流水线就是发一个,确认一个,才能再发下一个
流水线就是一个个连着发,然后多个确认
和之前的停止等待协议,后退N帧协议和选择重传协议很像
1.6.5.2.4 HTTP的报文结构
开始行用于区别请求报文和响应报文。可以明显的看到两者第一行的东西都不一样
请求报文的方法是指命令,就是对所请求的对象进行什么操作,如获取/删除等等
URL就是之间说的资源标识符
版本是指使用的是什么版本的HTTP协议
CRLF相当于我们程序里面的;,标识一行的结束。同时,在整个首部行结束时,为了区别首部行和实体主体还会有一行单独的CRLF

这里举了请求报文的例子,和一些常用的状态码
