网络原理

news/2024/5/18 14:09:07 标签: 网络原理, tcp/ip, 三次握手四次挥手, http, udp
http://www.w3.org/2000/svg" style="display: none;">

文章目录

  • 网络原理
    • 本文简介
    • TCP/IP五层模型
    • 物理层
      • 波形失真
      • 信号带宽
      • 码间串扰
      • 奈奎斯特准则
      • 香农定理
    • 数据链路层
      • 组帧
        • 字符计数法
        • 字符填充法
        • 零比特填充法
        • 违规编码法
      • 差错控制
        • 奇偶校验码
        • CRC
        • 海明码
      • 流量控制与可靠传输
    • 网络层
      • ip数据报
      • ipv4
        • 分类的ip地址
        • 子网划分
      • ipv6
      • 路由算法
    • 传输层
      • TCP
        • 三次握手
        • 四次挥手
        • 拥塞控制
      • UDP
    • 应用层
      • HTTP
    • 参考资料
    • 总结

网络原理

本文简介

先列个大纲,以后慢慢写,主要写重要的协议。

TCP/IP五层模型

五层模型如下,下层为上层服务,数据也从应用层一层层包装最终丢给物理层传输,接收端再一层层解包装
https://img-blog.csdnimg.cn/20190813161945268.png" alt="在这里插入图片描述" />

物理层

波形失真

波形失真有两种,一种是失真小接收端可识别高低位,另一种失真大接受端不可识别高低位
影响失真的因素:码元传输速率,信号传输距离,噪声,传输介质质量

信号带宽

信道带宽是指信道可以通过的最高频率与最低频率之差
例如某个信道可以通过的最高频率为4000HZ,最低为1000HZ
那么信道带宽就是3000HZ
低频信号不能通过信道是因为频率低信号极易衰减,到接收端无法识别高低位
高频信号不能通过是因为频率太高,导致接收端接收不过来,就像我们10倍速看电影一样,什么也看不到

码间串扰

接收端收到的信号失去了码元之间清晰界限的现象

奈奎斯特准则

在理想低通(无噪声,带宽受限)条件下,为了避免码间串扰,极限码元传输速率为2W Baud(波特),W是信道带宽,单位是HZ

波特是码元传输速率的单位,每秒钟通过信道传输的码元数称为码元传输速率,简称波特率

理想低通信道的极限数据传输率=2W l o g 2 V {log_2{V}} log2V(b/s),V是指有几种码元

香农定理

信噪比=信号的平均功率/噪声的平均功率,记为S/N,并用分贝(dB)作为度量单位,有信噪比(dB) = 10 l g ( S / N ) {lg{(S/N)}} lg(S/N)(底数为10)
例:S/N=1000,信噪比(dB)=10*3=30dB
香农定理:在带宽受限且有噪声的信道中,为了不产生误差,信号的极限数据传输速率=W l o g 2 ( 1 + S / N ) {log_2{(1+S/N)}} log2(1+S/N)(b/s)

数据链路层

组帧

字符计数法

帧首部使用一个计数字段来标明帧内的字符数,如下图
https://img-blog.csdnimg.cn/20190813170915964.png" alt="在这里插入图片描述" />

缺点:错一个地方就全错

字符填充法

https://img-blog.csdnimg.cn/20190813171519788.png" alt="在这里插入图片描述" />
添加首部填充和尾部填充,如果数据部分有SOH和EOT,那么采取给数据添加转译字符的办法实现透明传输

零比特填充法

这种办法很巧妙,首部和尾部采取特殊的8位比特位01111110,然后数据部分采取逢5个1添加一个0的操作,如下图
https://img-blog.csdnimg.cn/20190813172041261.png" alt="在这里插入图片描述" />
如果数据部分出现了01111110这样的数据,采取逢5个1添加一个0的操作后数据变成011111010,这样就不会误以为已经到了尾部了

违规编码法

曼彻斯特编码:曼彻斯特编码采取高-低表示高电位1,采取低-高表示低电位0,我们可以采取曼彻斯特编码不会出现的编码高-高或低-低作为帧的起始和终止

差错控制

差错有位错和帧错,位错是指0变成1,1变成0,帧错有丢失,重复,失序三种

位错检错编码:奇偶校验码,CRC码

位错纠错编码:海明码

奇偶校验码

n-1位信息元,一位校验元,奇校验码1的个数为奇数,偶校验码1的个数为偶数
例:如果一个字符的编码从低到高依次为1100101,采用奇校验,在下列收到的数据中,那种错误不能检测?
A:11000011
B:11001010
C:11001100
D:11010011
解析:n-1位信息元是1100101,采用奇校验,就得添加一个校验元1后得到11100101(奇数个1),如果收到的数据1的个数不是奇数说明就发生了错误(所以ABC都在传输过程发生了错误,只有D不能确定错了还是没错,选D)
结论:奇偶校验码只能检查出奇数位的bit错,检错能力为50%
结论理解:
1100101采用奇校验后11100101
1:假设传输过程只错了一位,最低位1变成了0即11100100,他发现1的个数由奇数变成了偶数,由此断定出错了
2:假设传输过程只错了两位,最低两位变了,即11100110,他发现1的个数一直都是奇数,他不能确定到底出错了没有
3:假设传输过程只错了三位,最低三位变了,即11100010,他发现1的个数由奇数变成了偶数,由此断定出错了
所以说只有出错的bit一共有奇数个才可以检测出来,检错能力为50%

CRC

CRC循环冗余码十进制的演示过程如下
发送端要发送的数据为5,生成多项式为2,
5/2 = 2…1(1是余数,也叫冗余码)
最终发送的数据是5+1=6
接收端接受到6
6/2=3…0
接收端余数为0就判定没有出错
例:发送端要发送的数据是1101011011,采取CRC校验,生成多项式是10011,那么发送端最终要发送的数据是?
1101011011/10011=1100001…1110
最终要发送的数据 = 1101011011+冗余码=11010110111110

海明码

海明不等式: 为了确定校验码的位数r,先介绍海明不等式
2 r 2^r 2r ≥ \geq k+r+1
r为校验码的位数或者叫做冗余信息位,k为信息位

举个栗子: 例如要发送的数据是101101,即k=6,根据海明不等式推出r最小为4,所以海明码一共有k+r位,即10位

下面我们将从一个例子中学习如何确定数据的位置和校验码的位置
D=101101,k=6,r=4
假设6位信息元依次是D1,D2,D3,D4,D5,D6,四位校验元依次是P1,P2,P3,P4
P1,P2,P3,P4分别放在2的0,1,2,3次方的位置处,D1~D6依次填充并把D1到D6的信息元依次填入,我们现在要做的就是求出P1到P4

二进制表示0001001000110100010101100111100010011010
数据位12345678910
代码P1P2D1P3D2D3D4P4D5D6
实际值??1?011?01

求P1?
注意P1的二进制表示为0001,那么我们找出P1到P4,D1到D6中所有最低位为1的代码有P1,D1,D2,D4,D5,令这5个代码异或结果=0,求出P1
P1⊕D1⊕D2⊕D4⊕D5=0,即P1⊕1⊕0⊕1⊕0=0推出P1=0
求P2?
注意P2的二进制表示为0010,那么我们找出第二位为1的代码有P2,D1,D3,D4,D6
P2⊕D1⊕D3⊕D4⊕D6=0推出P2=0
求P3?
注意P3的二进制表示为0100,那么我们找出第三位为1的代码有P3,D2,D3,D4
P3⊕D2⊕D3⊕D4=0推出P3=0
求P4?
注意P4的二进制表示为1000,那么我们找出第四位为1的代码有P4,D5,D6
P4⊕D5⊕D6=0推出P4=1

更新表格为

二进制表示0001001000110100010101100111100010011010
数据位12345678910
代码P1P2D1P3D2D3D4P4D5D6
实际值0010011101

最后得到的海明码是 0010011101
纠正单比特错
假设传输过程中第5位出错了,由0变成1,接收到的数据是0010111101,那么接收端的表格如下

二进制表示0001001000110100010101100111100010011010
数据位12345678910
代码P1P2D1P3D2D3D4P4D5D6
实际值0010111101

下面演示如何利用海明进行纠错
再次执行求海明码过程中求P1到P4的操作
第一步:P1 ⊕ D1 ⊕ D2 ⊕ D4 ⊕ D5 = 0 ⊕ 1 ⊕ 1 ⊕ 1 ⊕ 0 = 1
第二步:P2 ⊕ D1 ⊕ D3 ⊕ D4 ⊕ D6 = 0 ⊕ 1 ⊕ 1 ⊕ 1 ⊕ 1 = 0
第三步:P3 ⊕ D2 ⊕ D3 ⊕ D4 = 0 ⊕ 1 ⊕ 1 ⊕ 1 = 1
第四步:P4 ⊕ D5 ⊕ D6 = 1 ⊕ 0 ⊕ 1 = 0

从第四步异或的结果往第一步写得到的二进制数是0101,对应十进制数5,即第5位发生了差错

流量控制与可靠传输

流量控制:发送方和接收方速度不匹配,需要控制发送方的速度
可靠传输:发送方发送了什么,接收方必须一字不落的接收到
流量控制的方法:滑动窗口(后退N帧协议,选择重传协议,停止-等待协议)
停止-等待协议:每发送完一个帧就停止发送,等待对方确认,收到确认后再发送下一帧
滑动窗口:指发送方和接收方都维持一个滑动窗口,他只能接收小于等于该窗口值的数据,该协议允许发送方在停止并等待确认前发送多个数据分组。由于发送方不必每发一个分组就停下来等待确认,因此该协议可以加速数据的传输,提高网络吞吐量。

停止-等待协议 发送窗口大小=1 接收窗口大小=1
后退N帧协议 发送窗口大小>1 接收窗口大小=1
选择重传协议 发送窗口大小>1 接收窗口大小>1
滑动窗口百度词条

网络层

ip数据报

MTU
首先介绍MTU,MTU是指链路层数据帧可封装数据的上限,以太网的MTU=1500字节
如果ip分组大于MTU,就要对这个ip分组进行分片
ip数据报格式
https://img-blog.csdnimg.cn/20190814103521825.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0xpdVJlbnlvdQ==,size_16,color_FFFFFF,t_70" alt="在这里插入图片描述" />
下面来分析这些字段的含义
版本: ipv4
首部长度: 首部长度占4bit,最小为5,单位为4B,我们知道4位二进制最大可表示15,也就是首部长度最大为154B=60B,最小是54B=20B,即固定首部长度
区分服务: 期望获得那种类型服务????? 不懂这个
总长度: 首部长度+数据部分长度,单位为1B
标识: 标识同一数据报的分片,也就是说同一数据报的不同分片需要使用同一标识
标志:标志占三位二进制,最高位无意义,暂时不用
中间位DF(do not fragment)
DF=1表示禁止分片
DF=0允许分片
最低位MF(more fragment)
MF=1 表示后面还有分片
MF=0 表示后面无分片,本片是最后一片
片偏移: 片偏移占13位
指ip分组分片后,该片再原分组的相对位置,以8B为单位
假如片偏移=0000000000011,即十进制的3,该片再原分组的相对位置是3*8B=24B
生存时间(TTL): ip分组的保质期,经过一个路由器减1,变成0则丢弃该ip分组
协议: 数据部分使用的协议,tcp=6,udp=17
首部检验和: 检验首部????? 不懂这个
源地址: ipv4 32bit
目的地址: ipv4 32bit
可选字段: 0-40B,支持排错 测量 安全控制等
填充: 把首部补成4B的整数倍,这个和java对象头一样
数据部分: 传输层使用的协议封装成的数据

ipv4

ip地址:全世界唯一的32位标识符,根据该标识符可以找到该主机,路由器。。。
ip地址=网络号+主机号
11011111 00000001 00000001 00000001 = 223.1.1.1

分类的ip地址

https://img-blog.csdnimg.cn/20190814113046358.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0xpdVJlbnlvdQ==,size_16,color_FFFFFF,t_70" alt="在这里插入图片描述" />
如果你不知道自己的IP是多少,可以使用0.0.0.0
上图中没有127,因为127是本地环回测试使用

网络类别最大可用网络数第一个可用网络号最后一个可用网络号每个网络中最大主机数
A27-21126224-2
B214-1128.1191.255216-2
C221-1192.0.1223.255.25528-2

子网划分

两级的IP地址有时候不够灵活,需要子网划分

https://img-blog.csdnimg.cn/20190814115258237.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0xpdVJlbnlvdQ==,size_16,color_FFFFFF,t_70" alt="在这里插入图片描述" />
划分子网后,其他网络看不见该网络子网的划分

二级ip的子网掩码:
若 网络号16位+主机号16位,那么子网掩码=255.255.0.0
若 网络号24位+主机号8位,那么子网掩码=255.255.255.0

三级ip的子网掩码:
若 网络号16位+子网号8位+主机号8位,那么子网掩码=255.255.255.0

ipv6

https://img-blog.csdnimg.cn/20190814120934340.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0xpdVJlbnlvdQ==,size_16,color_FFFFFF,t_70" alt="在这里插入图片描述" />
https://img-blog.csdnimg.cn/20190814122314932.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0xpdVJlbnlvdQ==,size_16,color_FFFFFF,t_70" alt="在这里插入图片描述" />
版本: 协议版本,总是0110,即6
优先级: 区分数据报的类别和优先级
流标签: 所有属于同一个流的数据报都具有同样的流标签
有效载荷长度: 扩展首部+数据部分长度
下一个首部: 标识下一个扩展首部或上层协议首部
举个栗子:某ipv6数据报有扩展首部1,扩展首部2,那么本数据报的下一个首部就是扩展首部1,扩展首部的下一个首部就是扩展首部2,扩展首部2的下一个首部就是传输层封装的数据报的首部条
跳数限制: 相当于ipv4的TTL
地址: fe80:306f:306f:9efb:f73d:38d5:38d5:38d5 有一些简略写法,略

路由算法

RIP协议,距离向量算法
OSPF协议,链路状态路由算法

传输层

TCP

tcp协议特点:
tcp是面向连接的传输层协议
tcp连接是点对点的
tcp提供可靠的传输服务,无差错,不丢失,不重复,按序到达
tcp提供全双工通信
tcp面向字节流通信
发送缓存: 存放 准备发送的数据&&已发送但尚未收到确认的数据
接收缓存: 存放 按序到达但尚未被应用程序读取的数据&&不按序到达的数据
tcp报文段首部格式:
https://img-blog.csdnimg.cn/20190814152756392.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0xpdVJlbnlvdQ==,size_16,color_FFFFFF,t_70" alt="在这里插入图片描述" />
序号: 在一个tcp连接中传送的字节流的每一个字节都按顺序编号,序号表示本报文段发送数据的第一个字节的序号
确认号: 期望收到对方下一个报文段的第一个数据字节的序号,若确认号=N,则说明到序号N-1为止的数据都已正确收到
数据偏移/首部长度: 首部长度占4bit,最小为5,单位为4B,我们知道4位二进制最大可表示15,也就是首部长度最大为154B=60B,最小是54B=20B,即固定首部长度(看的眼熟?其实和ipv4的一样)
URG: 紧急位,URG=1时表明该数据报是紧急数据,不应在发送缓存中排队,直接插队发送数据,配合紧急指针使用
ACK: ACK = 1时确认号ack才有效,在连接建立后所有传送的报文段都应该把ACK置1
PSH: 推送位=1时,接收方应尽快交付应用程序,不应该等待接收缓存满再交付
RST: 复位RST=1时表明tcp连接出现严重差错,应该释放连接重新建立连接
SYN: 同步位=1时表明这是一个连接请求或者连接接受报文
FIN: 结束位=1表明这是发送方请求释放连接
窗口: 指发送本报文段的一方的接收窗口,即现在允许对方发送的数据量
举个栗子:A给B发数据,A的窗口值=5,B收到了A发过来的数据,并且解析出来A的接收窗口=5,B就知道了我不可以发送>5的数据给A
检验和: 检验首部+数据部分,检验时要加上12B的伪ip首部
紧急指针: URG=1时紧急指针才有意义,指出本报文段中紧急数据的字节数

三次握手

https://img-blog.csdnimg.cn/20190814160629135.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0xpdVJlbnlvdQ==,size_16,color_FFFFFF,t_70" alt="tcp三次握手" />
其实仔细理解了上面我对tcp每个字段的解释,再看这幅图,每一次握手为什么需要传这些数据就清楚了,这里不展开解释了

四次挥手

https://img-blog.csdnimg.cn/20190814163148523.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0xpdVJlbnlvdQ==,size_16,color_FFFFFF,t_70" alt="在这里插入图片描述" />

拥塞控制

慢开始 拥塞避免
这个图实在难画,借用王道一张图
https://img-blog.csdnimg.cn/20190814164108669.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0xpdVJlbnlvdQ==,size_16,color_FFFFFF,t_70" alt="在这里插入图片描述" />慢开始是指拥塞窗口刚开始几个回合以指数形式增长(1->2->4->8->16->直到ssthresh),由于刚开始斜率很小,所以是慢开始
到达门限值后线性增长直到出现网络拥塞,这个阶段就是拥塞避免
出现拥塞后ssthresh = 拥塞窗口/2,再进行慢开始-拥塞避免
快重传 快恢复
快恢复是指上图出现网络拥塞后,拥塞窗口不降为1,而是降为新门限制12,然后直接走拥塞避免线性增长
快重传是收到三个重复的确认执行快重传算法

UDP

udp协议特点:
无连接
不保证可靠性
面向报文
适合一次性传输少量数据
udp无拥塞控制,适合实时应用,如视频会议
首部开销小,8B
如何理解udp适合一次性传输少量数据
应用层给udp多长的报文,udp添加首部后就照样发送,即不做切分,一次发一个完整的报文,设想如果报文过长,那么数据到网络层,肯定会被分片处理,就会加重网络层的负担,而且还可能导致数据丢失
udp报文段首部格式:
https://img-blog.csdnimg.cn/20190814154921964.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0xpdVJlbnlvdQ==,size_16,color_FFFFFF,t_70" alt="在这里插入图片描述" />
UDP长度:首部+数据的长度
UDP检验和:检验首部+数据是否错误

应用层

HTTP

HTTP是超文本传输协议,架构在tcp之上,tcp为其提供可靠传输
HTTP是无状态协议,即两次同一个客户请求,服务器不会发现是同一个客户连接的,可用cookie和session解决
HTTP虽然不是可靠的协议,但是他有TCP为其保驾护航
HTTP/1.1之前短连接,之后(包括1.1)长连接
短连接是指每次请求都要进行三次握手四次挥手
长连接是指一次三次握手四次挥手可以进行多次请求,利用keepalive 实现
请求体:

请求行:请求方法 请求路径 请求协议
请求头:
空行:
请求体:

示例如下
POST /private/index.html HTTP/1.0
Host: localhost
Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==

name=lry&pwd=123

响应体:

响应行:协议 状态 描述
响应头:
空行:
响应体:

示例如下
HTTP/1.0 200 OK
Server: HTTPd/1.0
Date: Sat, 27 Nov 2019 10:19:07 GMT
Content-Type: text/html
Content-Length: 10476

响应体

参考资料

王道考研书籍
王道考研视频
深入理解计算机网络

总结

辛辛苦苦写了几天,请不要盗图盗文,就算要用请注明出处,谢谢


http://www.niftyadmin.cn/n/1037710.html

相关文章

数据结构与算法学习---数据结构篇(图b)(默然回首,夯实基础)

一、有向图 在实际生活中,很多应用相关的图都是有方向性的,最直观的就是网络,可以从A页面通过链接跳转到B页面,那么a和b连接的方向是a->b,但不能说是b->a,此时我们就需要使用有向图来解决这一类问题,它和我们之…

手把手教你vue3引入vue-router路由

首先我们建一个文件夹 叫vue项目目录 然后用编辑器打开这个文件夹 在终端输入 : vue create catin 创建一个vue项目 然后我们用编辑器打开新生成的目录 vue项目目录下的catin 在终端中输入 : vue add vue-next 将vue2升级成vue3项目 在终端中输入 : npm install vue-router4 …

.net项目打开自己的第一个MVC应用

首先我们打开VS 然后点击新建项目 在三个选项框中输入我们需要的项目条件 然后我们找到 ASP.NET web应用程序(.NET Framework) 然后我们修改一下项目信息 特别是路径 别创建完自己就找不到了 之后点击右下角创建 之后这个弹出的选项 我们选择MVC 在点击创建 创建完毕后项…

C语言第一个socket案例

服务端 #include<stdio.h> #include<stdlib.h> #include<errno.h> #include<string.h> #include<sys/types.h> #include<netinet/in.h> #include<sys/socket.h> #include<sys/wait.h> #include <arpa/inet.h> #include…

Jvm ---类加载过程?

Java 类加载需要经历一下 7 个过程&#xff1a; 加载–>验证–>准备–>解析–>初始化–>使用—>卸载 1、加载 加载是类加载的第一个过程&#xff0c;在这个阶段&#xff0c;将完成一下三件事情&#xff1a; • 通过一个类的全限定名获取该类的二进制流。 …

.net新建控制器 视图 控制器向视图传值

在项目目录中找到Controllers 右键点击选择 添加 > 控制器 选择MVC 5 控制器 创建完控制器效果如下图 会自带一个index方法 用鼠标右击index 选择添加视图 新添加的控制器试图会出现在Views目录下 之后我们需要修改一下便于展示控制器向视图传值方法 控制器参考代码如…

c语言多进程并发服务器

文章目录c语言多进程并发服务器服务端客户端c语言多进程并发服务器 服务端 #include<stdio.h> #include<unistd.h> #include<sys/types.h> #include<sys/socket.h> #include<arpa/inet.h> #include<string.h> #include<strings.h>…

jvm--描述一下 JVM 加载 Class 文件的原理机制?

Java 语言是一种具有动态性的解释型语言&#xff0c;类&#xff08;Class&#xff09;只有被加载到 JVM 后才能运行。当运行指定程序时&#xff0c;JVM 会将编译生成的 .class 文件按照需求和一定的规则加载到内存中&#xff0c;并组织成为一个完整的 Java 应用程序。这个加载过…