计算机网络

分层网络模型

首先网络模型分层如下
在这里插入图片描述

在这里插入图片描述

五层网络模型一般称为TCP/IP模型,其实和OSI差不多,下面是对应的映射表

在这里插入图片描述

以前对于网络分层比较模糊,不知道为什么要划分,以及划分的依据,每层网络协议之间还有什么协作吗。

其实可以类比实际生活中的航空旅程,如下所示:

在这里插入图片描述

在每个机场,可以看做一个节点,需要有购买票务,行李托运,登机口等等流程,也就是每个节点会有一些流程,不同的流程可以看做不同的协议,所谓的协议就是根据规范进行一些校验或者进行数据处理,然后再继续进行传输,而传输都是一样,航空功能就是直接飞机传输,而网络中,最根本的传输就是最底下的物理层,根据无线或者电缆进行传输,然后遇到一些节点,比如交换机,路由器,会进行处理,比如遇到交换机,那么就会从物理层到链路层,进行交换机相关的数据处理,如果遇到路由器,则会进行从物理层到链路层再到网络层,取出网络层数据包,进行解析然后处理。

如下所示:

在这里插入图片描述

下面是我个人对一些层次协议的理解

应用层

所谓应用层协议,指的是对应的应用程序所能解析和接受的报文信息

不同的应用层的报文格式不同,比如http, smtp,对应不同的应用。

应用层协议与常见应用和支撑的运输协议的对应关系如下

在这里插入图片描述

运输层

运输层其实是和应用进程紧密联合起来的,运输层通过唯一的端口号和对应的进程进行绑定,从而将报文传递给应用程序。

而进程和tcp端口之间数据的传递就是套接字。 套接字是一个底层实现的一个抽象,每个套接字对应一个tcp端口也就是tcp数据包中的目标端口和源端口,应用程序启动就会有一个端口,就是tcp的这个端口,运输成的报文会定向到这个端口对应的套接字,然后从套接字读取数据。

网络层

网络层和运输层的联系,可以打一个比方:邮政服务,A家庭有很多人,B家庭有很多人,A家的某个人会给B家的某个人写信,那么网络层相当于把A家庭的所有的信都传递给B,然后传输层再根据不同的人将信交给具体的人。

链路层

如果从下到上看的话,链路层的下层是物理层,物理层是真正的建立物理线路(无线网中时电波),不管如何,物理层数据时一位位传输的。

而链路层开始就变成了逻辑传输,数据以"帧"开始传输,并提供了差错检测、差错控制和流量控制。

链路层针对节点与相邻节点之间的数据传输,而网络层是针对全局的数据传输。

物理层

如上已经说过,物理层是真正的建立物理线路(无线网中时电波),不管如何,物理层数据时一位位传输的。不同的媒介,传输的物理线路可能不同。

套接字编程

socket编程,即直接基于传输层进行开发,调用底层的socket api进行数据传输。

有的时候不一定要通过http等应用层协议传输数据,直接通过socket api进行传输数据,这样,数据包会更小,不需要应用层解析。

一般场景比如交换机软件的开发中。
https://www.zhihu.com/question/29637351/answer/2177529520 这里面有socket毕竟详细的原理介绍,其实可以把socket理解问一个文件描述符,进程持有一个socket可以看做是对一个文件描述符济宁操作。 进程接收数据时也是通过socket的函数取数据,放到socket里的队列中
tcp连接中,连接和发送接收数据的socket是两个独立的socket

TCP的几个基本原理

tcp三次握手

在这里插入图片描述

tcp四次挥手

四次挥手值得注意的是,最后客户端向服务端发送ack之后,要等待2MSL,也就是两个报文传送时间,是因为为了避免之前有包丢失,导致发送ack给服务端之后,服务端觉得有异常,重新发送FIN,这个过程,从ack发送,到服务器发送FIN,刚好是2MSL时间。

在这里插入图片描述

TCP流量管理和拥塞机制

tcp传输层,每一侧主机都有接受缓存,缓存必然是有限制大小的,为了避免缓存有溢出,需要进行速度控制。

流量控制

tcp使用滑动窗口的概念,窗口的大小固定,每次发送报文数据后,会收到接收方的响应报文,响应报文中会有接收方从缓存中数据的已经读取的最大字节编号(LastByteRead), 和接收方从缓存中已经读取的字节编号(LastByteRecv), 通过相减判断剩余的窗口大小,发送方就可以控制发送的数据量大小

拥塞控制

拥塞是指由于网络层即一下的原因导致数据超时丢包,从而导致实际发送数据的效率很低。

tcp发送方维护了一个拥塞窗口,发送的的最新字节编号-收到的最新ack字节编号 <=min{流量滑动窗口大小,拥塞窗口大小}。

tcp发送到对于拥塞的判断是对于超时从而丢包的统计,来确认拥塞的程度。

tcp拥塞控制算法

  • 慢启动,通常初始时拥塞窗口设置为一个较小值,开始时会出现指数型增长 ,比如一个RTT(发送和响应的最大时间)内刚开始发送两个报文后,每次接受到一个报文就将窗口+1,那么两个就是+2
  • 当窗口大小达到一个sshthresh阈值时,就按照线性增加窗口

发生拥塞时,sshthresh变为拥塞时的窗口的大小的一半。

可靠数据传输

tcp通过报文序号、确认号,确保数据的有序传输和接受

使用定时器来保证数据的超时重传。

TCP状态扭转

在这里插入图片描述

在这里插入图片描述

TCP与UDP的区别

tcp和udp同属于传输层协议

tcp相对于udp的不同之处在于,tcp有以下特性

  • 可靠数据传输,使用流量控制、序号、确认和定时器,确保数据正确、有序传递给接收方
  • 拥塞控制,通过拥塞控制,调节网络传输速率,避免了整个传输链路的过高流量

TCP粘包

tcp是面向字节流的,客户端给服务端发送数据时,数据包会先放到缓存中,然后等缓存超过一定阈值之后才真正开始发送,那么可能不同的数据,就会都放在缓存中,一个数据的尾部和一个数据的头部都粘在一起,那么如果是不同请求的,可能无法区分。
udp是每个包都有长度,并且没有缓冲区,所以udp不会出现问题
如果解包,那么就是应用层的事情了,一般情况下,一个http的数据中会有conent-lenght表示内容长度,body结尾也会有\r\n进行一个间隔

路由选择算法

路由算法主要分以下两类:

总体式路由算法:每个路由器都拥有网络中其他路由器的全部信息,以及网络的流量状态。也叫LS (链路状态)算法。
分散式路由算法:每个路由器只有与它直接相连的路由器的信息,没有网络中每个路由器的信息。也叫DV (距离向量)算法。
LS算法
链路状态算法(也称最短路径算法)发送路由信息到互联网上所有的结点,对于每个路由器,仅发送它的路由表中描述了其自身链路状态的那一部分。

采用LS算法时,每个路由器必须遵循以下步骤:

1、确认在物理上与之相连的路由器并获得它们的IP地址。当一个路由器开始工作后,它首先向整个网络发送一个“HELLO”分组数据包。每个接收到数据包的路由器都将返回一条消息,其中包含它自身的IP地址。

2、测量相邻路由器的延时(或者其他重要的网络参数,比如平均流量)。为做到这一点,路由器向整个网络发送响应分组数据包。每个接收到数据包的路由器返回一个应答分组数据包。将路程往返时间除以2,路由器便可以计算出延时。(路程往返时间是网络当前延迟的量度,通过一个分组数据包从远程主机返回的时间来测量。)该时间包括了传输和处理两部分的时间——也就是将分组数据包发送到目的地的时间以及接收方处理分组数据包和应答的时间。

3、向网络中的其他路由器广播自己的信息,同时也接收其他路由器的信息。
在这一步中,所有的路由器共享它们的知识并且将自身的信息广播给其他每一个路由器。这样,每一个路由器都能够知道网络的结构以及状态。

4、使用一个合适的算法,确定网络中两个节点之间的最佳路由。

在这一步中,路由器选择通往每一个节点的最佳路由。它们使用一个算法来实现这一点,如Dijkstra最短路径算法。在这个算法中,一个路由器通过收集到的其他路由器的信息,建立一个网络图。这个图描述网络中的路由器的位置以及它们之间的链接关系。每个链接都有一个数字标注,称为权值或成本。这个数字是延时和平均流量的函数,有时它仅仅表示节点间的跃点数。例如,如果一个节点与目的地之间有两条链路,路由器将选择权值最低的链路。

DV算法
距离向量算法(也称为Bellman-Ford算法)则要求每个路由器发送其路由表全部或部分信息,但仅发送到邻近结点上。从本质上来说,链路状态算法将少量更新信息发送至网络各处,而距离向量算法发送大量更新信息至邻接路由器。由于链路状态算法收敛更快,因此它在一定程度上比距离向量算法更不易产生路由循环。但另一方面,链路状态算法要求比距离向量算法有更强的CPU能力和更多的内存空间,因此链路状态算法将会在实现时显得更昂贵一些。

Dijkstra算法执行下列步骤:

1、路由器建立一张网络图,并且确定源节点和目的节点,我们设为V1和V2。然后路由器建立一个矩阵,称为“邻接矩阵”。在这个矩阵中,各矩阵元素表示权值。例如,[i, j]是节点Vi与Vj之间的链路权值。如果节点Vi与Vj之间没有链路直接相连,它们的权值设为“无穷大”。

2、路由器为网路中的每一个节点建立一组状态记录。此记录包括三个字段:
前序字段——表示当前节点之前的节点。
长度字段——表示从源节点到当前节点的权值之和。
标号字段——表示节点的状态。每个节点都处于一个状态模式:“永久”或“暂时”。

3、路由器初始化(所有节点的)状态记录集参数,将它们的长度设为“无穷大”,标号设为“暂时”。

4、路由器设置一个T节点。例如,如果设V1是源T节点,路由器将V1的标号更改为“永久”。当一个标号更改为“永久”后,它将不再改变。一个T节点仅仅是一个代理而已。

5、路由器更新与源T节点直接相连的所有暂时性节点的状态记录集。

6、路由器在所有的暂时性节点中选择距离V1的权值最低的节点。这个节点将是新的T节点。

7、如果这个节点不是V2(目的节点),路由器则返回到步骤5。

8、如果节点是V2,路由器则向前回溯,将它的前序节点从状态记录集中提取出来,如此循环,直到提取到V1为止。这个节点列表便是从V1到V2的最佳路由。

DNS

DNS跟http, ftp同属于应用层协议,只不过dns不是直接和用户打交道,一般是为了给其他应用提供dns服务。

dns基于udp

http2 vs http1

https://xiaolincoding.com/network/2_http/http2.html

  • 1、二进制传输,原来是基于文本的,哪怕是200,也是文本,即’2’, ‘0’, ‘0’。相当于三个字符,每个字符一个字节,即24个bit,而如果是二进制,则是’10001000’,压缩率一般可以达到50%到80%

  • 2、头部压缩,有一个静态和动态字典表,静态就是记录了常用的header的name的value,每个有index标记,很多已有的就传index就行,如果是自定义的,那么客户端传过去之后,两端都会存储,下次也传index就行

  • 3、多路复用,对于一个tcp链接,可以处理多个http2请求,每个http请求有独立的stream id

  • 4、服务端主动推送,比如一个客户端请求html时,服务端还会主动返回css内容。

http个版本大致比较

http1.0, 每次http请求都要新建一个tcp连接
http1.1, 可以tcp连接复用,但是会有http队头阻塞,也就是前面的http请求没有返回,后面的http就需要等待
http2, 解决了http队头阻塞的问题,做到了真正的多路复用
http3, 底层使用udp,会更快

HTTPS

https://coolcao.com/2018/08/06/https/
https可以看做是在tcp和http之间加上了一个ssl层,ssl层用于加密解密。
在正式开启https传送加密的数据之前,先使用一个非对称加密,服务端有一个秘钥,然后返回给客户端带有公钥的证书,客户端会提前保存好证书的公钥去判断证书是否正确,然后取出公钥,并生成随机数,使用公钥加密一个随机数,返回给服务端,当然这期间有多个随机数,服务端和客户端通过交互都已经拿到了这几个随机数,然后根据规则都生成了相同的秘钥,之后,就用这个秘钥作为对称加密秘钥进行数据的加密后进行传输和解密
在这里插入图片描述对于证书的验证
在这里插入图片描述

抓包

使用tcpdump命令可以抓本机的包,还可以指定端口和ip

附录

https://blog.csdn.net/chuanglan/article/details/90735135

《计算机网络-自顶向下方法》

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值