ISO/OSI七层模型
表示层:图像、视频编码解,数据加密。
会话层:建立会话,如session认证、断点续传。
网关:应用层、传输层(网关是在传输层完成网络互连 的,网关是互联网中最复杂的设备,仅用于两个高层协议不同的网络互连,网关的结构和路由器类似 ,不同在于互连层,网关即可用于广域网的互连,也可用于局域网的互连 )
路由器属于:网络层(路由选择,存储转发)
交换机:网络层、数据链路层(识别数据包中的MAC地址信息根据MAC地址进行转发,并将MAC地址和对应的端口号保存在内部的地址表中)
网桥:数据链路层(将两个LAN进行连接,根据MAC地址转发帧)
集线器(hub):物理层(纯硬件设备,主要用来连接计算机等终端设备)
中继器:物理层(以比特方式将网络信号进行再生和重定时,使其能够传输更长的距离)
一些比较散的额外知识:
光猫主要是把光纤里面的光信号翻译成上网所需要的网络信号。
路由器主要是将光猫转换后的网络信号传输派送到电脑、手机、智能摄像头等设备上。
网关是一个网络连接到另一个网络的"关口"。也就是网络关卡。目前很多路由器都有网关的功能。
端口号的数量是65535 个是因为在计算机网络中,端口号是用16位二进制表示的,所以可以有2的16次方(2^16)个不同的端口号,即65536个。其中,0被保留为无效端口,因此可用的端口号范围是从1-65535,共计65535个端口号。
需要注意的是,并非所有的端口号都是用于网络通信。一些端口号是预留给特定的协议或用途,例如80端口用于HTTP通信、443端口用于HTTPS通信 等。端口属于传输层。 用在TCP报文头部: 源端口号和目的端口号。
IP协议转发:
数据链路层接收到数据帧,把帧交给网络层,
在网络层查路由表,查到后把数据报交给链路层 ,并告知目的MAC地 址,
链路层填充源MAC地址和目的MAC地址,
链路层封装数据帧并通过物理层发送。
总结:查询路由表逐跳进行。 数据帧 每一跳的MAC地址都在变化 ; IP数据报 每一跳的IP地址始终不变
ARP协议与RARP协议:
- ARP协议
ARP(Address Resolution Protocol)地址解析协议:把网络层32位的IP地址转化为数据链路层48位的MAC地址
ARP缓存表:ARP缓存表缓存有IP地址和MAC地址的映射关系。ARP缓存表是ARP协议和RARP协议运行的关键;ARP缓存表中的记录并不是永久有效的,有一定的期限 - RARP协议
RARP(Reverse Address Resolution Protocol)逆地址解析协议
IP地址划分
(2)特殊的主机号
主机号全0表示当前网络段,不可分配为特定主机 1.0.0.0
主机号为全1表示广播地址,向当前网络段所有主机发消息 1.255.255.255
(3)特殊的网络号
A类地址 网络段全0(00000000) 表示特殊网络
A类地址 网络段后7位全1(01111111=127) 表示回环地址
B类地址 网络段(10000000.00000000=128.0) 是不可使用的
C类地址 网络段(192.0.0) 是不可使用的
127.0.0.1,通常被称为本地回环地址 (Loopback Address),不属于任何一个有类别地址类。【从127.0.0.0-127.255.255.255整个16777216个地址都是回环地址】
它代表设备的本地虚拟接口 ,所以默认被看作是永远不会宕掉的接口。在Windows操作系统中也有相似的定义,所以通常在 安装网卡前就可以ping通这个本地回环地址。一般都会用来检查本地网络协议、基本数据接口等是否正常的。
划分子网
子网划分这项技术用来把一个单一的IP网络地址划分成多个更小的子网 (subnet)。 这种技术可使一个较大的分类IP地址能够被进一步划分为几个子网。这样就可以让使用一个大的分类地址(classful address)的企业能给该企业中处于不同地理位置的分公司分配不同的子网 ,对外整个企业是一个网络地址,而在内部,不同分公司则有不同的子网地址,因而不需要为每个站点都分别申请一个网络地址。
子网划分通常是把IP地址中主机标识部分 划出一定的位数用作本网的各个子网,剩余的主机标识作为相应子网的主机标识部分。
划分多少位给子网,主要根据实际需要划分出的子网数而定。
这样IP地址就分为'网络-子网-主机'三部分。与传统的分类地址一样,地址中的网络部分(网络号+子网)与主机部分之间的边界是由子网掩码来定义的 。
划分子网后变成了三级结构 :当没有划分子网时,IP 地址是两级结构,地址的网络号字段也就是 IP 地址的"因特网部分",而主机号字段是 IP 地址的"本地部分"。划分子网后 IP 地址就变成了三级结构。划分子网只是将 IP 地址的本地部分进行再划分 ,而不改变 IP 地址的因特网部分。
如何划分子网
- 确定需要划分的子网数
- 根据子网数确定子网的位数
- 确定每个子网的IP地址范围
*用Huffman树划分子网
一家集团公司有4家子公司(A,B,C,D),上级给出一个172.16.100.0/24的网段,让给每家子公司以及子公司的部门分配网段。
要求:A公司需要120地址,B公司需要60个地址,C公司需要20个地址,D公司需要22个地址。
子网号可根据上图Huffman树得到
A的网络号为 172.16.100 , 子网号为0
172.16.100.0 000 0000
172.16.100.0 111 1111
所以A的可用地址范围为:【172.16.100.1/25~172.16.100.126/25】
子网掩码为:255.255.255.128
B的网络号为 172.16.100 , 子网号为10
172.16.100.10 00 0000
172.16.100.10 11 1111
所以B的可用地址范围为:【172.16.100.129/26~172.16.100.190/26】
子网掩码为:255.255.255.192
C的网络号为 172.16.100 , 子网号为110
172.16.100.110 0 0000
172.16.100.110 1 1111
所以C的可用地址范围为:【172.16.100.193/27~172.16.100.222/27】
子网掩码为:255.255.255.224
D的网络号为 172.16.100 , 子网号为111
172.16.100.111 0 0000
172.16.100.111 1 1111
所以D的可用地址范围为:【172.16.100.225/27~172.16.100.254/27】
子网掩码为:255.255.255.224
IP
(1)网络地址:由IP地址和子网掩码二进制相与得到
也可以直接网络位不变,主机号置0 ,由子网掩码知前12位为网络位
(2)主机号:网络位全0,主机位不变 :0.6.28.57
(3)直接广播地址:网络号不变,主机号全1
(4)受限广播地址:固定不变为 255.255.255.255
(5)子网内第一个/最后一个可用的IP地址
第一个由网络地址最后面+1 得到:126.144.0.1
最后一个由直接广播地址最后面-1得到:126.159.255.254
什么是路由器的IP地址?
路由器的IP地址,简单来说就是路由器在网络中的"门牌号",是用来标识路由器这个设备的地址。路由器作为家庭网络和外部网络(如互联网)之间的桥梁,必须要有一个IP地址,才能与其他设备进行通信。
在路由器的IP地址中,有两个重要的部分需要了解。
-
内部IP地址(LAN IP):这是路由器在局域网中使用的IP地址,用来连接家中的设备(如手机、电脑等)。通常在配置路由器时,我们会用这个IP地址来登录路由器的管理界面。常见的路由器IP地址是"192.168.1.1"或"192.168.0.1",用户可以在浏览器中输入这些地址,进入路由器的后台进行操作。
-
外部IP地址(WAN IP):这是路由器连接到互联网时使用的IP地址,由网络服务提供商(ISP)分配。外部IP地址是你访问外网时被网站和服务器识别的地址。路由器通过外部IP地址(WAN IP)将家中的局域网连接到互联网。路由器会**通过NAT(网络地址转换)技术,**将局域网内多个设备的请求合并到同一个外部IP地址中,然后转发到外部网络。当外部服务器返回数据时,路由器再根据设备的内部IP地址,将数据准确地传输到相应的设备。
(1)可以通过ipconfig查看计算机中网络适配器 的IP地址、子网掩码及默认网关 。默认网关:指的是子网与外网连接的设备 ,通常是一个路由器 ,而该路由器的IP地址即为网络配置参数的默认网关地址。
UDP、TCP区别
2.TCP
2.1 TCP协议
TCP 是一种面向连接的,可靠的 ,基于字节流传输层通信协议,TCP 能确保接收端接收的网络包无损坏,无间隔,非冗余(即同一数据包只接收一次),按序的:
- 面向连接:首先,面向连接是一对一的,面向连接在通信前,需要先建立链接才能传输数据;
- 可靠性:无论网络链路中出现什么变化, TCP 都可以保证报文到达接收端;
- 字节流:数据以字节流形式进行传输,因此数据可以无限拓展(不超过MTU最大传输单元);
确定一个 TCP 连接,需要 TCP 四元组:源地址 : 源端口 + 目的地址 : 目的端口 。还有如下基础概念:
Socket套接字:套接字由 IP 地址和 Port 端口号组成;
IP 地址:(IPv4 32位)主机之间通过 IP 地址识别报文应属于哪一个主机;
Port 端口:(16位)端口用来识别报文属于一台主机上的哪一个进程;
序列号:用来解决乱序问题;
窗口大小:用来做流量控制;
由于 TCP 是面向连接,能保证数据是一定被交付的,因此常用于:FTP 文件传输、HTTP / HTTPS连接
TCP连接数:TCP 的连接数量永远到达不了 IP x Port 数的理论上限
2.2 TCP头
TCP 头 20~60 字节长(byte)
TCP报文由首部和数据两部分组成。首部一般由20-60字节(Byte)构成,长度可变。其中前20B格式固定,后40B为可选。
因为,TCP报文还得传给下层网络层,封装成IP包,而一个IP包最大长度为65535,同时IP包首部也包含最少20B,所以一个IP包或TCP包可以包含的数据部分最大长度为65535-20-20=65495B。
TCP 数据长度 = IP 总长度 - IP首部长度 - TCP 首部长度
TCP报文中数据部分是可选的,即TCP报文可以不包含数据(同理IP包也可以不包含数据)。不含数据的TCP报文通常是一些确认和控制信息类的报文,如TCP建立连接时的三次握手和TCP终止时的四次挥手等
TCP/IP 报文格式(IP数据包、TCP报头、UDP报头)
MTU,MSS,分片传输
MTU:一个网络包的最大长度,以太网中一般默认设置为 1500 字节。
MSS:出去 IP 和 TCP 头,一个网络包中 TCP 数据的最大长度。
为什么我们有了 IP 分片之后,还需要 TCP 分片呢?
当 IP 层有一个超过 MTU 长度的报文需要发送的时候,如果一个 IP 分片丢失,那么所有的 IP 分片都需要重新传送,而有了 MSS 之后,当发现数据长度超过了 MSS 之后,就先进行分片,这样就能避免这个问题了。
2.3 三次握手,四次挥手
- 初始状态:客户端处于 closed(关闭)状态,服务器处于 listen(监听) 状态。
- 第一次握手:客户端发送请求报文将 SYN = 1同步序列号 和初始化序列号seq = x发送给服务端,发送完之后客户端处于SYN_Send状态。(验证了客户端的发送能力和服务端的接收能力)
- 第二次握手:服务端受到 SYN 请求报文之后,如果同意连接,会以自己的同步序列号SYN(服务端) = 1、初始化序列号 seq = y 和确认序列号(期望下次收到的数据包)ack = x+ 1 以及确认号ACK = 1报文作为应答,服务器为SYN_Receive状态。
- 第三次握手: 客户端接收到服务端的 SYN + ACK之后,知道可以下次可以发送了下一序列的数据包了,然后发送同步序列号 ack = y + 1和数据包的序列号 seq = x + 1以及确认号ACK = 1确认包作为应答,客户端转为established状态。(分别站在双方的角度上思考,各自ok)
三次握手的必要性
第三次握手主要为了防止已失效的连接请求报文段突然又传输到了服务端,导致产生问题。
比如客户端A发出连接请求,可能因为网络阻塞原因,A没有收到确认报文,于是A再重传一次连接请求。
连接成功,等待数据传输完毕后,就释放了连接。
然后A发出的第一个连接请求等到连接释放以后的某个时间才到达服务端B ,此时B误认为A又发出一次新的连接请求 ,于是就向A发出确认报文段。
如果不采用三次握手,只要B发出确认,就建立新的连接了,此时A不会响应B的确认且不发送数据,则B一直等待A发送数据,浪费资源。
- A的应用进程先向其TCP发出连接释放报文段 (FIN=1,seq=u),并停止再发送数据,主动关闭TCP连接,进入FIN-WAIT-1(终止等待1)状态,等待B的确认。
- B收到连接释放报文段后即发出确认报文段(ACK=1,ack=u+1,seq=v),B进入CLOSE-WAIT(关闭等待)状态,此时的TCP处于半关闭状态,A到B的连接释放。
- A收到B的确认后,进入FIN-WAIT-2(终止等待2)状态,等待B发出的连接释放报文段。
- B发送完数据 ,就会发出连接释放报文段 (FIN=1,ACK=1,seq=w,ack=u+1),B进入LAST-ACK(最后确认)状态,等待A的确认。
- A收到B的连接释放报文段后,对此发出确认报文段 (ACK=1,seq=u+1,ack=w+1),A进入TIME-WAIT(时间等待)状态。此时TCP未释放掉,需要经过时间等待计时器设置的时间2MSL(最大报文段生存时间)后,A才进入CLOSED状态。B收到A发出的确认报文段后关闭连接,若没收到A发出的确认报文段,B就会重传连接释放报文段。
四次挥手的必要性
因为当Server端收到Client端的SYN连接请求报文后,可以直接发送SYN+ACK报文。但是在关闭连接时,当Server端收到Client端发出的连接释放报文时,很可能并不会立即关闭SOCKET ,所以Server端先回复一个ACK报文,告诉Client端我收到你的连接释放报文了。只有等到Server端所有的报文都发送完了,这时Server端才能发送连接释放报文,之后两边才会真正的断开连接。故需要四次挥手。
第四次挥手为什么要等待2MSL?
- 保证A发送的最后一个ACK报文段能够到达B。这个ACK报文段有可能丢失,B收不到这个确认报文,就会超时重传连接释放报文段,然后A可以在2MSL时间内收到这个重传的连接释放报文段,接着A重传一次确认,重新启动2MSL计时器,最后A和B都进入到CLOSED状态,若A在TIME-WAIT状态不等待一段时间,而是发送完ACK报文段后立即释放连接,则无法收到B重传的连接释放报文段,所以不会再发送一次确认报文段,B就无法正常进入到CLOSED状态。
- 防止已失效的连接请求报文段出现在本连接中。A在发送完最后一个ACK报文段后,再经过2MSL,就可以使这个连接所产生的所有报文段都从网络中消失,使下一个新的连接中不会出现旧的连接请求报文段
2.4 重传机制
(1)超时重传
发送数据时,发送端会设定一个定时器 ,当定时器超时,发送端仍未收到对方的 ACK 报文时,发送端就会重新发送该数据。
基于这个原理,下面这两种情况会导致超时重传:
- 数据包丢失
- 确认信号 ACK 丢失
那么定时器的时间,超时时间 (RTO) 我们应该如何设置呢?他与 RTT(数据从一端到达另一端的时间) 有关。
超时时间 RTO 应该略大于我们的 RTT ,过大或过小都不合适,Linux 计算 RTO 有个公式大概原理是:
- 需要 TCP 通过采样 RTT 的时间,然后进行加权平均,算出一个平滑 RTT 的值,而且这个值还是要不断变化的,因为网络状况不断地变化。
- 除了采样 RTT,还要采样 RTT 的波动范围,这样就避免如果 RTT 有一个大的波动的话,很难被发现的情况。
如果超时重发的数据,再次超时的时候,又需要重传的时候,TCP 的策略是超时间隔加倍:也就是**每当遇到一次超时重传的时候,都会将下一次超时时间间隔设为先前值的两倍。两次超时,就说明网络环境差,不宜频繁反复发送。**这样就避免了大量重复发送的同一报文使网络变得更加拥堵。
(2)快速重传
TCP 还有一种快速重传的机制,它不以时间为判断依据,是以数据为判断依据 。
当发送端重复收到了消息 seq1 的ACK2 信号 ,那么就证明 seq2 没有被接收。
发送端接收到三个同样的ACK信号后 ,就知道了seq2并没有被收到。
于是就会在定时器超时前,重传seq2,但是因为3,4,5都被收到了,于是此时ACK会回复6。(?)
(3)SACK
在 TCP 头部「选项」字段里加一个 SACK 的东西,它可以将缓存的地图发送给发送方 ,这样发送方就可以知道哪些数据收到了,哪些数据没收到 ,知道了这些信息,就可以只重传丢失的数据。
如下图,发送方收到了三次同样的 ACK 确认报文,于是就会触发快速重发机制,通过 SACK 信息发现只有 200~299 这段数据丢失,则重发时,就只选择了这个 TCP 段进行重复。
2.5 滑动窗口
TCP 利用滑动窗口实现流量控制 。流量控制是为了控制发送方发送速率,保证接收方来得及接收。
若 TCP 每发送一个数据,就要进行一次确认的应答,这样的模式效率低下。那么如何解决这个问题呢?使用滑动窗口:
窗口的大小就是一次可以无需等待确认应答,可以继续发送数据的最大值 。窗口的实现,实际上是操作系统开辟了一个缓存空间,发送方主机在等到确认应答返回之前,必须在缓冲区中保留已发送的数据 。如果按期收到确认应答,此时数据就可以从缓存区清除。
上图:ACK 600 确认应答报文丢失,也没关系,操作系统会在下一个确认应答进行确认,只要发送方收到了 ACK 700 确认应答,就意味着 700 之前的所有数据接收方都收到了。这个模式就叫**累计确认、累计应答。**通常窗口的大小是由接收方的决定的。
(如果500-599数据丢失接收方真没收到呢?那就与快速重传方法一致,一致重传ack500,连续收到3个后,重传500-599,这时已经接收到了699,直接确认ack700就相当于前面全确认了)
发送,接收窗口构成:
TCP会话的双方都各自维护一个发送窗口和一个接收窗口。
接收窗口大小取决于应用、系统、硬件的限制。发送窗口则取决于对端通告的接收窗口 。接收方发送的确认报文中的window字段可以用来控制发送方窗口大小,从而影响发送方的发送速率。将接收方的确认报文window字段设置为 0,则发送方不能发送数据。
TCP头包含window字段,16bit位 ,它代表的是窗口的字节容量,最大为65535。这个字段是接收端告诉发送端自己还有多少缓冲区可以接收数据。于是发送端就可以根据这个接收端的处理能力来发送数据,而不会导致接收端处理不过来。接收窗口的大小是约等于发送窗口的大小。
2.6 流量控制
发送端主动减少发送流量,以此来避免接收端接收数据的能力不够,导致接收出错或者效率减慢。
流量控制就是通过滑动窗口来实现的。
2.7 TCP拥塞控制
发送端主动控制发送流量,以此来避免造成网络信道的拥挤。
拥塞控制主要靠三个算法来实现:
- 慢启动
- 拥塞避免
- 快速恢复
为了实现拥塞控制,我们定义了一个叫做拥塞窗口 (cwnd) 的概念,拥塞窗口是发送方的一个窗口 ,他会根据网络的拥塞程度进行动态变化 ,可以简单理解为是网络拥塞时 TCP 发送窗口的数量 。wei
同时还有一个叫做**慢启动门限(ssthresh)**的概念,他的作用是判定什么时候使用慢启动算法,什么时候是使用拥塞避免算法.
慢开始:算法的过程很简单,一开始拥塞窗口cwnd为1,发送窗口等于拥塞窗口,之后每轮次2,4,8,16这样指数级增大,直到拥塞窗口大于慢开始门限。然后采用拥塞避免算法,其实就是改为每轮次都线性+1,直到发生超时重传(认为此时网络已经开始拥塞),就把慢开始门限值调节为拥塞时的一半,然后从头再来一遍 慢开始--->拥塞避免。
快重传":就是要发送方尽快进行重传 ,而不是等到超时重传计时器超时再重传
①要求接收方不要等到字节要发送数据时顺带确认,而要立刻发送确认
②即使收到了失序的报文段,也要对已收到报文段发出重复确认
③发送方一旦收到3个连续的重复确认,就立刻重传相应的报文段,而不是等待超时重传计时器超时
快恢复:快恢复和快重传搭配使用 ,发送方一旦收到了3个重复确认 ,就知道现在只是丢失了个别的报文段 ,于是不使用慢开始算法,而是用快恢复算法,其实就是慢开始算法跳过了"慢开始"部分,而是直接把慢开始门限值和拥塞窗口调整为当前窗口的一半 ,然后开始执行拥塞避免算法。
说人话就是,拥塞窗口直接减半,然后依旧每次+1线性增长。
- 一开始采用慢启动 过程,这个过程是 cwnd 指数级增长的:1、2、4、8...。
- 达到 ssthresh 门限后,会进入拥塞避免算法 ,这个过程拥塞窗口 cwnd 是线性增加的。
- 若遇到超时情况,会重新开始慢启动过程 ,同时将 ssthresh 设置为当前窗口24的 1/2=12 。
- 进入拥塞避免算法后,若遇到三次 ACK 应答,即快速重传 的情况,我们会使用快速恢复算法,ssthresh更新为16/2=8
- 此时不会进入慢启动过程从零开始,而是从 ssthresh 的数值开始线性增长。