网络基础篇

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了网络基础篇相关的知识,希望对你有一定的参考价值。

OSI模型的七层结构

1、物理层:
二进传输
为启动、维护以及关闭物理链路定义了电气规范、机械规范、过程规范、和功能规范。
2、数据链路层:
访问介质:
定义如何格式化数据以便进行传输以及如何控制对网络的访问。
支持错误检测
3、网络层:
路由数据包
选择传递数据的最佳路径
支持逻辑寻址和路径选择
4、传输层:
确保数据传输的可靠性
建立、维护和终止虚拟电路
信息留空制来保障可靠性
5、会话层:
主机间通信
建立、管理和终止在应用程序之间的会话
6、表示层:
数据表示:
确保接受系统可以读出该数据
格式化数据
构建数据
协商用于应用层的数据传输语法
提供加密
7、应用层:
网络进程访问应用层:
为应用程序进程(例如,电子邮件、文件传输和终端仿真)提供网络服务
提供用户身份验证

PDU:

PDU:Prtocol Data Unit,协议数据单元是指对等层次之间的数据单位
物理层的PDU是数据位bit
数据链路层的PDU是数据帧frame
网络层的PDU是数据包packet
传输层的PDU是数据段segment
其他更高层次的PDU是消息message

三种通讯方式:

单播:unicast
广播:broadcast
主播:multicast

UTP交叉线T568A和T568B的线序

T568A:
绿白、绿、橙白、蓝、蓝白、橙、棕白、棕

T568B:
橙白、橙、绿白、 蓝、蓝白、绿、棕白、棕

Hub集线器

Hub:多端口中继器
Hub并不记忆该信息包是由哪个MAC地址发出,哪个MAC地址在Hub的哪个端口
Hub的特点:
共享带宽
半双工

以太网桥

交换式以太网的优势
扩展了网络带宽
分割了网络冲突域,使网络冲突被限制在最小的范围内
交换机作为更加智能的交换设备,能够提供更多用户所要求的功能:优先级、虚拟网7远程检测......

Hub和交换机

集线器属于OSI的第一层物理层设备,而网桥属于OSI的第二层数据链路层设备
从工作方式来看,集线器是一种广播模式,所有端口在一个冲突域里面。网桥的可以通过端口隔离冲突
Hub是所有共享总线和共享带宽。网桥每个端口占一个带宽

路由器

为了实现路由,路由器需要做下列事情:
分隔广播域
选择路由表中到达目标最好的路径
维护和检查路由信息
连接广域网

路由

路由:把一个数据包从一个设备发送到不同网路里的另一个设备上去。这些工作依靠路由器来玩成。路由器只关心网络的状态和决定网络中的最佳路径。路由的实现依靠路由器中的路由表来完成。

VLAN

分隔广播域
安全
灵活管理
VLAN=广播域=逻辑网络(Subnet)

分层的网络架构

核心层Core Layer
企业级应用快速转发
分布层Distribution Layer
广播域,路由,安全,远程接入,访问层汇聚
访问层AccessLayer
终端输入

TCP/IP协议栈

TCP/IP 协议栈是一系列网络协议的总和,是构成网络通信的核心骨架,它定义了电子设备如何连入因特网,以及数据如何在它们之间进行传输。TCP/IP 协议采用4层结构,分别是应用层、传输层、网络层和链路层,每一层都呼叫它的下一层所提供的协议来完成自己的需求。由于我们大部分时间都工作在应用层,下层的事情不用我们操心;其次网络协议体系本身就很复杂庞大,入门门槛高,因此很难搞清楚TCP/IP的工作原理,通俗一点讲就是,一个主机的数据要经过哪些过程才能发送到对方的主机上。

应用层常见的网络协议及端口号

http80  https 443 ftp21 dnstcp53 udp53 tftp69 smtp25 pop3 110 imap143 telnet23 ssh22 mysql 3306
oracle 1521
sql server 1433
redis 6379

TCP特性

工作在传输层
面向连接协议
全双工协议
半关闭
错误检查
将数据打包成段,排序
确认机制
数据恢复,重传
流量控制,滑动窗口
拥塞控制,慢启动和拥塞避免算法

有限状态机FSM:Finite State Machine

CLOSED 没有任何连接状态
LISTEN侦听状态,等待来自远方TCP端口的连接请求
SYN-SENT 在发送链接请求后,等待对方确认
SYN-RECEIVED在收到和发送一个连接请求后,等待对方确认
ESTABLISHED代表传输连接建立,双方进入数据传送状态
FIN-WAIT-1主动关闭,主机已发送关闭连接请求,等待对方确认
FIN-WAIT-2主动关闭,主机已收到对方关闭传输连接确认,等待对方发送关闭连接请求
TIME-WAIT完成双向传输连接关闭,等待所有分组消失
CLOSE-WAIT被动关闭,收到对方发来的关闭连接请求,并以确认
LAST-ACK被动关闭,等待最后一个关闭传输连接确认,并等待所有分组消失
CLOSING双方同时尝试关闭传输连接,等待对方确认

有限状态机

客户端先发送一个FIN给服务端,自己进入了FIN_WAIT_1状态,这时等待接受服务端的报文,该报文会有三种可能:
只有服务端的ACK
只有度无端的FIN
基于服务端的ACK,又有FIN
1、只收到服务器的ACK,客户端对进入FIN_WAIT_2状态,后续当收到服务端的FIN时,回应发送一个ACK,会进入到TIME_WAIT状态,这个状态会持续2MSL(TCP报文段在网络中的最大生存时间,RFC 1122标准的建议值是2min)。客户端等待2MSL,是为了当最后一个ACK丢失时,可以再发送一次。因为服务端在等待超时后会再发送一个FIN给客户端,进入客户端知道ACK已丢失
2、只有服务端的FIN时,回应一个ACK给服务端,进入CLOSING状态,然后接受到服务端的ACK时,进入TIME_WAIT状态
3、同时收到服务端的ACK和FIN,直接进入TIME_WAIT状态

客户端的典型状态转移

客户端通过connect系统调用主动与服务器建立连接connect系统调用首先给服务器发送一个同步报文段,使连接转移到SYN_SENT状态
此后connect系统调用可能因为如下两个原因失败返回:
1、如果connect连接的目标端口不存在(未被任何进程监听),或者该端口仍被处于TIME_WAIT状态的连接所占用(见后文),则服务器将给客户端发送一个复位报文段,connect调用失败。
2、如果目标端口存在,但connect在超时时间内未收到服务器的确认报文段,则connect调用失败。
connect调用失败将使连接立刻返回初始的CLOSED状态。如果客户端成功收到服务器的同步报文段和确认,则connect调用成功返回,连接转移至ESTABLISHED状态。
处于FIN_WAIT_2状态的客户端需要等待服务器发送结束报文段,才能转移至TIME_WAIT状态,否则它将一直停留在这个状态。如果不是为了在半关闭状态下继续接收数据,连接长时间地停留在FIN_WAIT_2状态并无益处。连接停留在FIN_WAIT_2状态的情况可能发生在:客户端执行半关闭后未等服务器关闭连接就强行退出了。此时客户端连接由内核来接管,可称之为孤儿连接(和孤儿进程类似)
Linux为了防止孤儿连接长时间存留在内核中,定义了两个内核参数:
/proc/sys/net/ipv4/tcp_max_orphans指定内核能接管的孤儿连接数目
/proc/sys/net/ipv4/tcp_fin_timeout指定孤儿连接在内核中生存的时间

TCP超时重传

异常网络状况下(开始出现超时或丢包),TCP控制数据传输以保证其承诺的可靠服务
TCP服务必须能够重传超时时间内未收到确认的TCP报文段。为此,TCP模块为每个TCP报文段都维护一个重传定时器,该定时器在TCP报文段第一次被发送时启动。如果超时时间内未收到接受方的应答,TCP模块将重传TCP报文段并重置定时器。至于下次重传的超时时间如何选择,以及最多执行多少次重传,就是TCP的重传策略
与TCP超时重传相关的两个内核参数:
/proc/sys/net/ipv4/tcp_retries1,指定在底层IP接管之前TCP最少执行的重传次数,默认值是3
/proc/sys/net/ipv4/tcp_retries2,指定连接放弃前TCP最多可以执行的重传次数,默认值15(一般对应13~30Min)

拥塞控制

网络中的带宽、交换节点中的缓存和处理机等,都是网络的资源。在,某个时间,若对网络中某一资源的需求超过了该资源所能提供的可承受的能力,网络的性能就会变坏。这种情况就叫做拥塞
TCP为了提供=高网络利用率,降低丢包率啊,并保证网络资源对每条数据流的公平性。即所谓的拥塞控制
TCP拥塞控制的标准文档是RFC 5681,其中详细介绍了拥塞控制的四个部分:
慢启动(slow start)、拥塞避免(congestin avoidance)、快速重传(fastretransmit)和快速恢复(fast recovery).拥塞控制算法在linux下有多种实现,比如reno算法、vegas算法和cubic算法等。它们或者部分或者全部实现了上述四个部分
当前所使用的拥塞控制算法
/proc/sys/net/ipv4/tcp_congestion_control

UDP特性

工作在传输层
提供不可靠的网络访问
非面向连接协议
有限的错误检查
传输性能高
无数据恢复特性

以上是关于网络基础篇的主要内容,如果未能解决你的问题,请参考以下文章

Python小白到老司机,快跟我上车!基础篇(十三)

Python代码阅读(第19篇):合并多个字典

VSCode自定义代码片段14——Vue的axios网络请求封装

VSCode自定义代码片段14——Vue的axios网络请求封装

VSCode自定义代码片段14——Vue的axios网络请求封装

Python代码阅读(第26篇):将列表映射成字典