内容来及王道计算机考研,纯手敲。因为不考研2333,因此忽略计算部分,保留个人认为重要的计网知识点。
前言
基本概念
- 集线器:多个节点连起来,组成计算机网络。但是最多只能有一个发送数据,不然会导致数据冲突。
- 交换机:也可以连起来多个节点,组成计算机网络。不同的是不会发生数据冲突
- 路由器:把多个计算机网络连接起来。形成更大的网络
- 注意和家用的路由器不同,家用的相当于“路由器+交换机+AP(接入点)”。
- 比如你手机,电脑连接相当于交换机。而连接到外部网络相当于路由器。
- ISP(Internet Service Provider):互联网服务提供商,让你们家路由器与整个相连,可以上网。
- 互联网:各大ISP和国际机构组建起来,覆盖全球的互联的网络。
- 必须使用TCP/IP通信。自己构建小范围内无所谓
计算机网络组成和功能
从组成看
- 硬件
- 主机(端系统):手机,电脑,互联网设备
- 内部需要有网络适配器(网卡),用户
- 通信设备:交换器,交换机,路由器
- 通信链路:网线光纤
- 主机(端系统):手机,电脑,互联网设备
- 软件:方便用户使用,实现资源共享。
- 协议:规定通信规则。由软硬件共同组成(比如插了网卡才能用网,这个硬件和固件共同完成)
从工作方式
- 核心部分
- 为边缘部分提供服务(连通性,交换服务)
- 由大量网络和路由器组成
- 边缘部分
- 直接为用户服务
- 你的手机,电脑这些直接联网的部分和其软件
从逻辑功能看
- 资源子网
- 主机+软件(主机上应用程序)
- 通信子网
- 负责信息传输的部分总称。
- 由 通信链路+通信设备+协议 构成(包括主机内部网络适配器/底层协议)
计算机网络功能
数据通信,资源共享,分布式处理,提高可靠性,负载均衡
电路交换,报文交换,分组交换
原理分析
电路交换:即直接物理连接进行通信,通信前需要建立链接,通信期间需要一直占据链路,速率很快。
缺点:建立连接上花费大(适合低频次大量传输,不适合互联网),线路利用率低,灵活性差(改一次很麻烦),不支持“差错控制”(无法发现传输过程中错误)
电报网络:存储转发思想。先把传输数据存储在中间结点,再根据地址转发给下一节点。和送信很像。
优点:通信前无需建立连接,线路灵活多变,不存在独占线路(利用率高),支持校验(存储时候奇偶校验之类,检查有没有问题)
缺点:长度不固定(不方便存储),长度较长时存储开销大,错误率高
分组交换:不定长数据->定长数据(解决电报网络两个缺点)
优点:电报网络全部+便于存储+开销小+错误时重传代价小
缺点:相对于报文,增加控制信息开销;相对于电路交换增加了延迟。同时传输时部分失序丢失需要去处理。
虚电路交换:先建立虚拟的连接,再按照规定好的路线发送,最后断开连接。
最终现代互联网仍然采用电路交换技术,因为虚电路交换会增加核心部分处理压力。
性能分析
电路交换性能
需要先建立连接,完成后一直传输,最后释放
报文交换性能
把一个报文完全发送给传输点后断开。一层一层往后传(寄快递)
分组交换性能
把大数据变成小数据,有一个发一个
总结
电路交换 | 报文交换 | 分组交换 | |
传输总时间 | |||
存储转发延迟 | |||
是否需要提前建立链接 | |||
缓存开销 | |||
差错控制 | |||
是否有序 | |||
是否需要额外控制信息 | |||
灵活性 | |||
线路利用率 |
答案
电路交换 | 报文交换 | 分组交换 | |
传输总时间 | 低 | 高 | 中 |
存储转发延迟 | 无 | 高 | 中 |
是否需要提前建立链接 | 是 | 否 | 否 |
缓存开销 | 无 | 高 | 中 |
差错控制 | 无 | 支持 | 支持 |
是否有序 | 是 | 是 | 否 |
是否需要额外控制信息 | 是 | 是(少) | 是(多) |
灵活性 | 低 | 中 | 高 |
线路利用率 | 低 | 中 | 高(多个分组不同线路发) |
计算机网络分类
按照范围
- 广域网(WAN)/城域网(MAN)/局域网(LAN)/个域网(PAN)
- 城域网用得少,因为和局域网都用以太网技术通信。
- 家庭路由器背后[下图],一个连广域网WAN(路由器),四个局域网LAN(以太网交换机)
- 个域网:个域网是指围绕某个人而搭建的计算机网络,如手机热点,智能网关(智能网关连接家庭的设备,最后又连接到了局域网上)
- 加W表示Wireless(WLAN,WPAN)
按照技术类型
- 广播式网络/点对点网络
- 广播:群里@某人,所有人都会接收到,最后检查分组目标地址看自己接不接收
- 点对点:私发。只有对方接收到
按拓扑结构(逻辑结构)
- 总线形结构/ 环形结构/星形结构/网状结构
- 总线形结构:广播式传输,存在总线争用(只能由一个设备发数据,其它不可以发)。
- 代表:集线器
- 环形结构:广播式传输,用数字令牌(有令牌才可以发,按顺序用)解决总线征争用
- 代表:令牌环网
- 星形结构:点对点传播,中央设备根据需求转发,因此不存在总线争用。
- 代表:以太网交换机组成的局域网
- 网状结构:点对点传播,区别是现在中间变成了一堆节点。
- 代表:众多路由器的广域网
使用者:专用/公用
传输介质:有线无线
性能指标
速率 | 节点在信道上传输数据的速率。也称为数据率,比特率,数据传输速率 单位:bit/s,b/s,bps(三种等价)B/s(1B/s = 8b/ s) |
带宽 | 某信道最高的速率(数据传输速率) |
吞吐量 | 某个网络实际的数据量 |
时延(Delay) | 数据从一端传输到另一端时间 总时延 = 发送时延 + 传播时延 + 处理时延 + 排队 发送(传输)时延:节点传输到信道时间 传播时延:在信道传播时间 处理时延:路由器处理信息(转发/分析)时间 排队时延:多信息时候排队时间 |
往返时延(RTT) | 从发送数据到接收确认总时长。游戏延迟就是这个 |
信道利用率 | 数据/(带宽*t)。过高堵塞过低浪费 |
网络利用率 | 各个信道之和 |
分层结构
基本内容
OSI(Open System Interconnection)七层模型
TCP/IP模型
但实际上,教学一般用五层模型,结合二者模型出了一个五层。这样便于理解。
实体:分层结构中,实现第n层的活动元素(软件+硬件)组合,为第n层实体。
服务:下层为上层提供的功能调用,这是垂直的。通过调用接口实现。
协议三要素:语法(数据与控制信息格式),语义(干什么),同步(执行条件?时序关系)是水平的
OSI模型
应用层(第七层) | 实现特定的网络应用(Http) |
表示层(第六层) | 解决信息表示不一致问题(GBK和UTF-8),实现数据转换 |
会话层(第五层) | 管理进程间通信,当通信失效可以恢复(类似断点续传) |
传输层(第四层) | 实现端到端通信(即进程之间的通信,端:端口) 复用和分用 |
网络层(第三层) | 保证转发到目的地(1.路由与转发 2.拥塞控制(最佳路径)3.异构网络互连) |
数据链路层(第二层) | 保证传输结果正确(1.封装成帧(定界) 2.差错控制(发现数据错)3.可靠传输(保证相对位置正确)4.流量控制 5.介质访问控制(节点什么时候可以发消息)) |
物理层(第一层) | 实现相邻节点bit传输(比如电路参数,传输含义等) |
TCP/IP模型
和OSI区别
- 有时候不一定需要格式转换和会话管理,因此TCP/IP去掉这个
- 物理层和数据链路层不应该限制太多,因此TCP/IP去掉这个
- 网络层不再负责保证数据可靠,顺序,流量管理,可靠运输等,而是把这部分内容交给传输层去控制。这样好处是极大的减小了路由器的负担,压力给到边缘的主机。
应用层(第四层) | 实现特定网络应用 |
传输层(第三层) | 实现端到端(进程间通信)通信 ,需要差速控制,流量管理等。 可提供:有连接可靠(TCP),无连接不可靠(UDP)服务 |
网络层(第二层) | 保证转发到目的地,但此时分组可能出错或者丢失。 |
物理层(第一层) | 实现节点之间数据传输 |
具体内容可以见下图。最底下数据链路层&物理层协议可以加一个PPP,这三个都是局域网的协议
物理层
不重要。通信可以有线无线,通道可以分频分时复用,信号弱了中继器。
会在数据链路层的数据前增加前导码,尾部加入校验码
前导码表示开始(开始前同步码发送1010循环表示节奏,后面11正式开始)
数据链路层
总览
当你学完之后对这里应该有很清晰底层原理
- 封装成帧
- 帧定界:确定每一帧界限
- 透明传输:让网络层感受不到被封装了
- 差错控制:发现并解决位错
- 方案一:丢弃,等发送方重传帧
- 方案二:海明编码之类纠错
- 可靠传输:发现并解决
- 帧丢失,帧重复,帧时序
- 流量控制:控制发送帧频率,让接收方来得及接收
- 介质访问控制:
- 局域网。广播信道需要,因为多个节点抢介质,用CSMA/CD或者信道复用技术。MAC层
- LLC(Logic Link Control)子层:与访问介质无关的部分,事实上被802.3和802.11垄断(便于向网络层提供接口)
- MAC(Medium Access Control)子层:与访问介质有关的部分(组帧,差错检测,透明传输,介质访问控制)
- 广域网。点对点信道不需要,因为有专属的介质。用PPP协议控制。PPP层
- 局域网。广播信道需要,因为多个节点抢介质,用CSMA/CD或者信道复用技术。MAC层
组帧
问题
- 如何帧定界?让接收方确定每一帧界限
- 如何透明传输?去除帧定界附加的信息
解决
- 字符计数法
- 每个帧开头,用一个定长计数表示长度
- 问题:错一位全错了,不好用
- 字节填充法
- 用特殊字符表示开头和结尾
- 问题:数据部分可能包含这个特殊字符
- 解决:增加转译字符,在特殊字符前面加上转译字符
- 问题:可能数据包含转译字符
- 解决:对于转译字符也添加转译字符
- 零比特填充法(最常用)
- 开头部分连续六个1。对于内部每遇到连续5个1就加一个0
- 违规编码法
- 每一次必须跳变。而首尾不跳变,区分首尾。
差错控制
发现并解决位错
- 检错编码
- 奇偶校验:让这一串的“1”的个数为奇/偶
- 循环冗余校验码(CRC):双方约定一个除数(由多项式确定),K位信息位+R哥校验位作为被除数,添加校验位后保证除法的余数为0;
- 可检测奇数个错误,所有双比特错误。检测所有小于检验位长度的连续错误,一定概率纠错
- 纠错编码
- 海明编码(2k≥n+k+1)
- 本质是分组偶校验,多个校验位可以反应出错位置
- 纠1检2偶尔检3
- 海明编码(2k≥n+k+1)
可靠传输,流量控制
由多种机制协调统一共同配合
核心逻辑
滑动窗口机制
WT:允许发送的帧 ,不在范围内不许发
WR:允许接收的帧,不在范围内直接丢弃
接收方通过确认机制,控制发送发窗口向前面滑动
确认机制
确认帧:收到i帧,没检测出错误,就返回ACK_i
否定帧:收到i帧,检测出问题,就返回NAK_i
重传机制
超时重传:超过一定时间,请求方没收到ACK_i,就要重传
请求重传:收到NAK_i,才重传
帧编号
对n bit帧编号,要求WT+WR≤2n ,以此保证唯一性。
不同协议对比
停止等待协议:就是发一个收一个,有错误就停止等待,等超时了没收到确认帧重发
后退N帧协议:就是一次发一堆,但只返回最后一个按顺序收到的确认帧,表示之前的没问题。要重发就重发这收到ACK_i和它之后的,没收到确认帧就把这个窗口都再传。
选择重传协议:就是一次发一堆,需要返回每一个帧的确认帧或否定帧,然后客户端根据超时或者否定帧重发特定的。
滑动窗口机制 | 确认机制 | 重传机制 | 帧编号 | |
停止等待协议(S-W) | WT=1 WR=1(其实没有用滑动窗口,但便于理解) | 确认帧 | 超时重传 | 1bit WT+WR≤2n |
后退N帧协议(GBN) | WT>1 WR=1 | 确认帧(累计确认,仅返回最后一个按顺序收到的ACK_i) | 超时重传(重传之前i帧和它之后的帧) | WT+WR≤2n |
选择重传协议(SR) | WT>1 WR>1 且 WR≤WT | 确认帧,否定帧 | 超时重传,请求重传 | WT+WR≤2n |
S-W停止等待协议时延
GBN和SR协议时延
介质访问控制
信道划分,随机访问(ALOHA , CMSA , CMCS/CD ,CMCS/CA),轮询访问
- ALOHA:不听就说,无监听无碰撞检测。每次发一个帧,目的地收到就继续发
- 纯ALOHA:有就发,冲突等等发
- 时隙ALOHA(S-ALOHA):只能在时间槽开始时候发,避免中间冲突。
- CSMA:先听再说,无碰撞检测。先听下没有其他通信量再传输数据。
- CS: Carrier Sense载波监听 MA:Multiple Access, 多点接入
- 非坚持。听到外面忙,就等等
- 1-坚持。一直监听,直到不忙
- p-坚持。若空闲以P概率发数据,(1-P)概率等个单位时间再发数据。单位时间是最大传输时延2倍。可以认为是非坚持和1-坚持折中,可以动态调整应对不同情况。
- CSMA/CD:先听再说,碰撞检测。用于总线型局域网中,传输介质是线。
- CD:Collision detection,碰撞检测
- 当多个主机同时发数据,会导致碰撞。
- 因此这个在发出信号后进行冲突检测,发现碰撞(波形看出来)后退避一段时间,并发出干扰波形,让其他站点知道碰撞了等一等。
- 很显然无线网用不了,因为没办法碰撞检测。同时,你没有办法感受到其它所有站点存在(因为信号范围有限),即“隐藏站”,那先听都用不了。
- CSMA/CA:先听再说,尽量避免冲突。无线局域网(WiFi) 用于802.11无线局域网
- CA:Collision Avoidance,碰撞避免
- 在信道空闲时候,如果要发数据,就预约信道,通过AP告诉其他站点要传输数据和传输时间,让他们在这期间别发消息。
局域网
覆盖小,错误延迟低,各个节点之间数据传输是帧
支持单播(一对一发帧),广播(一对全部),多播(一对一部分)
令牌环网(已解散)
环形,同轴电缆,令牌协议(只有有token的节点才可以发送帧,发送完给下一个节点)
以太网(802.3)
集线器:CSMA/CD(存在信道争用)
交换机:对于交换机内部链接的网,要么半双工(CSMA/CD),全双工(双向工作,不需要争信道)
无线局域网WIFI(802.11)
CSMA/CA协议
理论所有wifi覆盖范围内的设备都可以收到信息,只是一般网卡看到最前面的MAC地址发现不是自己就忽视掉。所以咖啡馆饭店wifi别随便连。
硬件架构
RAM:缓冲进来出去的帧
MAC:物理地址,对于每台以太网适配器是唯一的。存在ROM芯片里面
以太网网适配器:负责接收/发送帧(看类型),实现链路层物理层功能,帧缓冲
MAC
注意和MAC地址不一样。这里IP层直接到MAC层到物理层,是因为数据链路层中的LLM层基本写死了,所以直接用MAC代替(之前提到过数据链路层可以分为LLM和MAC)
这个层会把网络层的数据加头加尾,前面加MAC地址,后面加CRC(循环冗余校验)码
最后在物理层,前面加入前导码表示开始(开始前同步码发送1010循环表示节奏,后面11正式开始),后面采用违规编码法(没有跳变就表示结束)结束。
单播帧,广播帧
交换机:数据传过来,有脑转发
集线器:数据过来,无脑转发
VLAN
如果交换机多了,连接设备多。那么广播一次传播的太多了,因此划分一些,让这个广播帧不能传出去,或者只传到指定的分组。
一个VLAN就是一个广播域,有一个VID。
分组可以按照接口,MAC号或者IP。校园网隔离就是(AP隔离),同一WIFI设备之间无法互相连接
PPP
点对点的协议,两点直连的专线网络。必须要全双工协议(不然别人一直发你回不了消息)
特点:此时相当于两台路由器互联,你就不需要寻址(MAC)和解决信道冲突问题,直接建立了联系。但是也不能谁都可以连,因此加入了身份认证。既然两个都互联了,我这边(cn)你那边(us),我把我的访问给你,你访问完给我,这样就可以当VPN用。
过程是,先建立连接,确定一些基本的数据(直到是啥,怎么验证),然后验证身份(有些有,比如VPN验证),然后网络层协议(分配IP地址什么的),接着就可以传输数据,最后可以终止。
数据格式,可以按照MAC对比着记。
网络层
网络内每个设备都有ip地址,这一层实现主机到主机转发。主要作用是把网络层前面加上自己和目的地ip地址,便于转发。
功能
- 异构网络互连
- 比如说前面PPP协议的,和MAC里的比如CSMA/CD协议的设备连接。这样就忽视了底层。
- 在这里,路由器可以被称为网关(gateway)
- 路由与转发
- 路由:多台路由器,通过路由协议,生成路由表。
- 转发:根据路由表,指定转发表,选择最好的路径转发出去。
- 拥塞控制
- 作用:防止负荷过高过低
- 方法:开环控制(提前设计好防堵塞策略),闭环控制(动态检测变化,改变策略)
整体的传输过程
只有网络号
166.1.0.1(H1)->200.1.1.2(H7) 跨路由器 | 166.1.0.1(H1)->166.1.4.4(H6) 同路由器 |
1. 发现网络号不是内部的,交给网关处理。注意:局域网内部MAC协议传输,所以你需要知道默认网关MAC号 2.通过ARP协议,通过ip查出网关MAC地址,加上路由器MAC形成MAC帧,传输给路由器166.1.0.5 3.通过转发表,检查目的网络ip地址。查表查到有,从B0转发出去,MAC目的地址修改为C0的(这里估计是不同路由器之间仍然用的以太网协议,所以需要MAC地址,PPP不需要) 4.200.1.1.1检查,发现网络号一致。那么查表,封装MAC帧(MAC地址通过ARP获得),下行。 5.最后到了最下面,是个交换机。那么通过查出来MAC地址后,只会给H7发。 注意:全程原地址和目的地址的IP不变,因为封装好了。 | 1. 开始发送时候,检查出同属于一个网络号(前面的部分一样),因此不需要给网关转发。 2. 通过ARP,查询出H6的MAC地址,直接封装H6的MAC地址,给交换机。 3.交换机最后转发,到了集线器。理论都会收到,但是每个主机都对MAC检查,只有H6匹配,那么H5忽视这个帧,H6接收成功。 注意:内部传输数据,不需要经过网关。 |
新增子网掩码
此时转发表需要多一列子网掩码
H1->H3 | H1->H7 |
1. H3地址用子网掩码后,比较自己网络号。发现不是同一个子网。向上转发到交换机,在往上到学校服务器 2. 学校服务器用子网掩码比较后,确认是自己的网路号,于是ARP根据规则,找出要转发到的交换机的MAC地址,转发数据。 3.接着交换机子网掩码比较,是自己手下的,于是ARP找到MAC号,传给H3。 | 注意,H7是没有子网划分网络,但过程依旧可以走,因为新协议会兼容旧协议。因此,在有子网掩码路由器就用子网掩码,没有就不用。 |
如果不在范围内,有一个默认路由,就会转发到互联网中去了。
NAT转换
手机1->手机2 |
1. 传输层封装端口,自己端口9855和目标对外暴露端口4096。这里是要看外网展示出来的端口 2. 网络层封装ip地址,自己的为192.168.3.48/24,远程的为66.211.88.55(远程不可能内网ip不然找不到了) 3.接着下面就是传输层,根据默认网关IP对应出来MAC地址,找到默认网关,再一层层传输过去 4.NAT路由器收到后,完成内外网端口号之间的转换。接着修改ip变成外网ip,端口也改(因为修改ip,所以NAT路由器深入到了传输层) 5.经过互联网中间转发,最后到达左侧NAT路由器,通过NAT表,解析出ip,端口,写回去 6.再通过ip与MAC转换,找到目标的设备。 |
IPV4
基本格式
版本:IPV4/IPV6
首部长度:字面意思
总长度:数据和头全部长度
标识,标志,片偏移:用来完成分片。标识表示是哪个块,标志告诉后面还有没有快,片偏移告诉在当前块头往后多少位置。
TTL:告诉最多可以经过几个路由器,经过一个就-1
协议:TCP/UDP
首部校验和:校验头部
分类方案
被分为ABCD类,网络号是分配的,后面的主机号可以在自己的网络内分配。
比如说分配了166.1.x.x 路由器是166.0.1,那其他连路由器设备可能是166.1.0.2
为了保证发送到路由器,要设置默认网关,直到发到哪里是路由器
特殊IP
网络号 | 主机号 | 举例 | 作为源地址? | 作为目的地地址? | 代表含义 |
Y(随意) | 全0 | 166.1.0.0 | × | × | 表示整个网络本身,只能用于路由表,转发表 |
Y | 全1 | 166.1.255.255 | × | √ | 广播给这个整个Y网络数据包 |
全0 | Y | 0.0.0.1 | √ | × | 表示来自同一个网络的,因此只用告诉主机号 |
全0 | 全0 | 0.0.0.0 | √ | × | 自己,全0访问地址和全1请求地址组合使用,告诉同网自己没ip,求分配 |
1 | 全1 | 255.255.255.255 | × | √ | 给同一个网络全部的节点广播 |
127 | 非全0全1 | 127.0.0.1 | √ | √ | 表示主机自己 |
学会了?检测一下
子网划分/子网掩码
- 原因:实际上一个子网没这么多设备,比如166.1.x.x,后面6w多设备用不完,因此把主机号前k位作为子网号,剩下的n-k作为主机号。这样划分了2k个子网。
- 结构:子网划分后,ip三级结构为<网络号,子网号,主机号>。
- 表示方式:那此时怎么快速得到网络号呢?子网掩码 & 运算下就行。比如166.1.x.x的2位为子网号,那子网掩码就是166.1.196.0。也可以用/表示,比如/18就是前18个1,后面全0.
- 此时,属于同一个网络只有网络前缀(网络号+子网号)相同。
- 默认路由:0.0.0.0。查表的保底,总能找到的。
- 默认子网掩码:ABC类的默认子网掩码就出来了。
- 入口与转发处相同:不转发,扔了
学会了?检测一下
CIDR(无分类编码)
- 原因:不同ip需求不同,根据需求精确划分长度。
- 特点:
- 网络前缀可变长,用例如128.14.32.0/21表示,此时后11尾主机就可以自己用了
- 子网划分方式:
- 定长子网划分:每个子网IP地址块大小相等。(子网掩码一样)
- 变长子网划分:IP块大小可以不同(子网掩码不同)
- 路由聚合:
- 很多个网都要从一个接口出,就可以聚合成一个,比如:
- 128.14.32.128/28,128.14.32.128/29,128.14.32.128/30发过来的数据都要从G1出,那可以聚合成128.14.32.128/27,这样检查快多了。
- 最长匹配:都能匹配那肯定去匹配的多的,因为更细分。
- 可能问题:引入无效地址,不过影响不大
此时CIDR块就很像哈夫曼树,因为前缀一样
NAT(网络地址转换)
- 原因:ip又不够了
- 端口号:
- 本来用在传输层,一般是一个进程暴露出来的。
- 现在在局域网内,与外界沟通都是路由器的ip。此时用路由器的ip+一个端口表示你局域网内一个设备的端口(NAT转换)
- 私有ip:
- 只允许内部使用:10.0.0.0~10.255.255.255 172.16.0.0~172.31.25.255 192.168.0.0~192.168.255.255
- 私有ip局域网内部自己看着分配
- 私有ip在局域网内唯一
- 全球Ip(外网ip)
- ISP提供,全球唯一
- 一个局域网内,与外部通信使用的统一IP地址
ARP(地址解析协议)
Address Resolution Rrotocol
- 作用:局域网内部,完成ip地址与mac地址的转换
- ARP表:记录这种转换的表
- 每个主机,路由器都有自己的ARP表
- 需要定期更新
- 过程:
- ARP请求分组(在ip层完成):
- 内容:我是谁(ip,mac),我要找谁(ip/mac)
- 请求格式:广播帧(数据链路层最终完成)。(帧ip中,目的MAC地址全1,ip也全1表示问所有人,源地址Y,表示就是要找所有人,当然也可以问指定ip)
- 结果:局域网内所有人收到后,记录下来他的信息(ip,mac),并准备回复
- ARP回复请求(在ip层完成):
- 内容:自己的ip和mac地址
- 回复格式:单播帧(数据链路层最终完成)。(记录自己ip和地址ip,只回复给刚问的)
- 结果:收到信息,记录下来他人的信息(ip,mac)
- ARP请求分组(在ip层完成):
DHCP(动态主机配置协议)
- 基本概念
- 作用:给刚接入的主机动态分配ip地址,默认网关,子网掩码
- 客户端/服务器(C/S)模型
- 客户:谁需要配置
- 服务器:谁提供配置信息。家用路由器可以提供;也可以有多台。
- 分层:应用层,会用到传输层UDP
- 作用范围:自己的子网
- 过程:
- DISCOVER
- DHCP包装自己的MAC,UDP包端口(这个服务一般默认端口,本机68目的地67),网络层目的IP全1,源IP全0(表示询问,也确实不知道自己是啥),MAC帧全1表示问别人和自己MAC
- 非DHCP服务器:到传输层UDP看到67端口就知道不是找自己的,扔了
- DHCP服务器:收到了,准备回复
- OFFER
- DHCP返回给提供的ip,租用期,子网掩码,默认网关。剩下看着回,注意只需要单播帧回去就行。
- REQUEST
- DHCP内包装自己的MAC和接受的ip。注意数据在链路层还是广播帧形式,因为可能有多个DHCP服务器,在你DISCOVER时候,多个人给你发消息,你回复所有人,你最后只接受的哪一个ip。
- ACKNOWLEDGE
- DHCP服务器回复确认信息,就是再确认一遍ip,租用期,子网掩码,默认网关。这里还是单播帧回去。
- DISCOVER
路由算法与路由协议
相互配合,让路由器之间生成路由器转发表
- 路由算法
- 静态路由,手动配置不变
- 动态路由:距离-向量路由算法(用于RIP协议),链路状态路由算法(用于OSPF协议),层次路由
- RIP:用跳数衡量距离,超过一定跳数认为不可达。没过一段时间或者有断开,立即更新。好处是配置简单,坏处是收敛慢(定期更新),扩展差(跳数),不智能(真的只看跳数可以?)
- OSPF:收集其它的路由器链路状态信息,通过djs算法计算最小路径。
- 路由协议
- 协议:RIP,OSPF,BGP
- RIP,OSPF用于自治系统内部网关,BGP用于边界网关。
IP 多播
就是前面提到的,单播(一对一),广播(一对全部),多播(一对多),可以节省网络带宽
之前提到的D类地址就是多播地址,范围224.0.0.0~239.255.255.255
一个主机可以同时有单播地址(固定ip)和多播地址(群号,可动态调整)
假设要看直播,多播路线
- 加入多播组(IGMP)
- 电脑设备向上告诉路由器,需要加入这个多播组,路由器就会记录你的电脑加入了这个多播组,并向上通知
- 数据投递
- 现在直播数据回来,就根据之前记录的,把这个数据给需要的路由器。到达局域网后,找到那个设备转回去(多播mac)
移动IP
问题:你在视频电话,先用的流量后用的热点,要求通信不可以断。
- 初始状态:运营商给你一个ip
- 切换WIFI时:
- 切换后,获得一个新的ip,作为转交地址。
- 向上汇报,我之前的ip地址是,我现在的新ip是
- 然后又建立好了链接
网络层设备
冲突域:可能发生数据碰撞
冲突域 | 广播域 | |
集线器 | x | x |
交换机 | √ | x |
路由器 | √ | √ |
传输层
只有TCP和UDP协议
- 端口的作用
- 完成进程间通信,标识进程
- 需要表明:协议(TCP/UDP),自身端口,目标ip:端口
- TCP和UDP协议的端口号是相互独立的
- 套接字(socket):封装一下
- 客户端:socket() -> bind()//绑定接听端口和ip -> listen() -> accept() -> recv()/send() ->close()
- 客户端:socket() -> conntct() -> send()/recv() ->close()
- 需要表明:协议(TCP/UDP),自身端口,目标ip:端口
- 端口分类
- 服务器端口:
- 0~1023:被用了,只能用于熟知的重要应用
- 服务器端口:
- 完成进程间通信,标识进程
- 功能
- 实现端到端通信(进程之间通信)
- 复用和分用
- 多个进程都用传输层的TCP/UDP协议
- TCP/UDP根据端口,分给进程
- 差错控制
- TCP:检测出错误就丢弃,通知重传
- 面向有连接传输服务,保证数据完整,但是开销大,实时性差
- 有连接:传输前通知别人要连接了,结束也告诉
- 可靠的:接收方返回确认消息,确认哪些数据被接受了
- 用于:传文件
- 面向有连接传输服务,保证数据完整,但是开销大,实时性差
- UCP:检测出错误就丢弃,不通知重传
- 面向无连接传输服务,可能出错,但是速度快
- 无连接:直接发,啥也不问
- 不可靠的:不知道有没有接受
- 用于:直播,视频通话
- 面向无连接传输服务,可能出错,但是速度快
- TCP:检测出错误就丢弃,通知重传
TCP | UDP | |
核心逻辑 | 检测出错误就丢弃,通知重传 | 检测出错误就丢弃,不通知重传 |
连接性 | 有连接 | 无连接 |
可靠性 | 可靠传输 | 不可靠 |
有序性 | 有的,中间有确认序号的方式 | 没有,乱的 |
传输速度 | 慢 | 块 |
连接对象 | 一对一 | 一对一,一对多 |
首部开销 | 20-60 | 8 |
传输方式 | 字节流,多个tcp请求可以拼接成一个大的 | 面向报文,一大块(超过最大就报错) |
使用场景 | 文件,邮件等需要可靠传输的地方 | 需要实时的应用(IP电话,会议,直播) |
携带大小 | MSS(最大段长)1000B | 0-65535B(实际考虑到网络层限制只能到65515) |
UDP
- UDP头小,只有8字节
- 每次都传输一个整的报文,不支持拆分(过大就不要了)
- 无连接不可靠,不支持拥塞控制(因为看不出来2333)
- 支持一对一传输(借助单播),一对多(借助广播255.255.255.255多播)
UDP检验:检测全部数据。方法:加入伪头部,计算校验和(假发结果全1),去除头部
TCP
数据格式
序号(seq):开始的“序号”是自己设置的,不一定从0开始。后续的就按照字节顺序加。
确认号(ack):返回确认,在该序号之前的全部字节已经正确收到。(有点像退后n步那种感觉。)
ACK:表示确认号(ack)是否有效,1有效,0无效。
首部长度:表示TCP首部长度,单位是4B,因此必须是4B整数倍
紧急位(URG):本地优先发送
推送为(PSH):服务器优先返回
复位位(RST):表示差错
同部位(SYN):表示正在请求连接或者接受请求连接(只在第一二次握手)
终止位(FIN):表示自己要单方面结束链接了(只在发起挥手的时候)
接收窗口:接收方表示自己还可以接收多少字符(用于流量控制)
校验和:和UDP几乎一样,伪头部不一样长
选项:指定最大段长(MSS),方便服务器方便设置缓冲区。
建立连接(三次握手)
- 第一次
- SYN=1(同步过程中),seq = x(表示随便取一个开始),ACK = 0 (表示自己的ack无效)
- 第二次
- 听到后,SYN=1(同步过程中),ACK = 1(现在开始ack有效), ack = x + 1(之前的seq收到,从后一个开始),seq = y是服务器进程给自己的其实序号(自己编一个)
- 第三次
- SYN= 0(同步完了),ACK = 1(有效) ,seq = x + 1(得到确认接收),ack = y+1服务器接受了
注意,第一二次握手,不可以携带数据,第三次可以携带数据。同时,第一二次固定消耗一个seq序号,而第三次,如果不携带数据,不消耗序号
所以客户端一次往返就可以发数据,而客户端要1.5次往返才可以发数据
注意这里,有哪些状态,很好记。
数据传输
全双工,互相传输
即告诉自己接收到哪了,又传输数据。一个tcp干了好多事
释放连接(四次挥手)
为什么有四次呢?比如说有一个人先传完了,说不传了,那另一边就表示确认。之后变成单向传输。单向传输完后,也要再来一次,所以一共是四次。
FIN=1表示要结束一段关系。挥手13也要消耗一个数据
一堆问题
- 为什么前两次握手不带数据?
- 确保连接可靠性,初期还不清楚是否可靠
- 放置SYN攻击,为了维护这些数据浪费大量资源。
- 第三次握手可以带数据原因?
- 已经确认了基本收发能力没有问题,已经比较可靠了。减少开销,提高效率。虽然实际上也不会有很多数据,基本都是之后再带大量数据
- 为什么要三次握手?
- 前两次握手保证基本的收发能力都是正常的。
- 防止第一次请求时候报文抵达过慢,第二次发的一次握手都到了之后才到。导致服务器认为开起了新对话,白白的浪费资源。
- 如果有了第三次握手,再遇到上面情况。那么返回第二次握手信息给客户端后,客户端就知道这有问题,不回复。因此,过一段时间,服务器没收到第三次握手就认为请求无效了,避免了建立连接(建立连接要维护很多东西浪费空间)
- 第一次握手断网了怎么办?
- 完全没事,过一段时间客户端重发就好了
- 第二次握手断网了怎么办?
- 客户端就会重试,重新发第一次握手的syn包。指数退避,防止太频繁的。如果很多次没有收到,客户端就放弃连接。
- 服务器重试,一直尝试重发第二次握手的包,同样指数退避。太多次就把这个丢了,反正没建立连接。服务器可以判断出是否是重试的包,如果是就很快重发第二次握手包。
- 第三次握手断网了怎么办?
- 此时,客户端认为自己发送成功,就正常发消息。
- 服务器可能认为自己二次握手的消息没到,一直尝试重发,如果一段时间没收到就关闭SYN-RCID状态。
- 客户端多次没收到,发一个探测包之类的,如果亖了那就知道断了。
- 为什么四次挥手
- 允许半关闭状态,允许单方面去发数据,如果一方没发完的话。这样保证双方数据都可完整发送
- TCP怎么保证传输可靠性?
- 确认应答机制(ACK),超时重发,流量控制(接收窗口大小),拥塞控制机制(逐渐启动,MSS逐渐变大),校验机制
- QUIC是啥
- 基于UDP的可靠传输协议。
- 比如说TCP丢包会把后面都阻塞了,他就去找丢的那一个。
- TCP粘包
- 原因:数据流时候,几个消息放一块,边界没区分好成一坨了。
- 解决方法:
- 每个消息固定长,不足补充。(浪费)
- 用特殊字符表示边界。(HTTP,Redis在用,好处适合文本,坏处不适合二进制文本)[最好用]
- 每一段前告诉多长(适用于二进制,但要提前规定字符格式)
- 消息不要用流了,封装成一帧一帧(复杂)
应用层
实现特定的网络应用,如FTP,SMTP,POP3,HTTP(S)
模型
C/S模型:C(client),S(server)
P2P模型:每个主机即提供服务,又请求服务。所有主机平等
DNS
首先会在本地域名服务器查询(本地服务器可以在主机,也可能是学校企业提供的,这就是为什么校园网可以Ban你半夜打游戏),如果查询不到会向上去问。查询到后缓存在服务器里面
递归查询:服务器会帮你去问,问到之后返回给你ip
递归迭代结合查询:问服务器,返回的是下一级dns服务器地址,再去问那个服务器
对于域名服务商来说,它的作用实在最后一步卡你。举个例子 haruhi.fans ,你会先到/根解析,然后告诉你fans在哪里,接着去fans解析。fans就会去找haruhi.fans对应的是哪个厂商的解析,返回解析的解析服务器。最后问厂商就会给你答案。
那为什么有时候慢呢?因为厂商解析会慢(不优先处理你的),或者fans服务器连不到厂商(最近的厂商解析服务器可能很远),这样就很慢。如果你多花钱,解锁更多厂商服务器,提高你域名处理优先级,那么路途近了,处理快了,解析自然就快了……
FTP(文件传输协议)
让不同主机之间传输文件。
用了两个端口,一个控制连接(21端口),一个数据连接(20端口)
- 为啥要俩,为什么不一个?
- 理论可行,但是要区分控制,数据之类麻烦。且如果要取消中断不及时,因为大文件会堵塞那条线路。
过程:撰写提交—>DNS查询(@后面那一堆就是域名)-> 连接到服务器的25端口,传输内容(不可达重试) -> 服务器投递到找的人邮箱服务器里 -> 用户定期主动去拉取
万维网和http
万维网:一个信息系统,存储的是一个网站网页的集合。每一个基本单位是网页,存储各种文字图片之类的东西
工作原理:请求URL后,会向目标地址请求资源。收到资源后,返回资源。然后解析出html,css,js这些,最后把网页呈现给用户。
- URL:统一资源访问路径
- 超链接:相互关联的方式
- http:超文本传输协议(定义请求资源方式)
- 特点:无状态
- 请求格式:
- 请求行:GET(幂等),POST(不幂等),DELETE,PUT
- 请求头:比如说User-Agent,
- 请求体:post里面提交的数据
- html:标记语言
重定向码
2xx | 成功了 |
200 | 正常 |
201 | 成功创建资源。比如你post上传一个博客后,返回给你一个201 |
204 | 成功但返回值为空。比如你delete后,服务器返回。 |
3xx | 重定向了 |
301 | 目标被永久的重定向了 |
302 | 暂时重定向了 |
304 | 资源没被修改,意思是你客户端有了。这样避免重复去问 |
4xx | 你的问题 |
401 | 没登录 |
403 | 被墙了 |
404 | 找不到 |
5xx | 服务器问题 |
501 | 服务器炸了 |
502 | 服务器作为网关,反向代理时候,后面该相应的服务器都炸了不说话 |
503 | 处理不了,稍后再试 |