【计算机网络】模块一:互联网和传输层协议

发布于:2023-01-22 ⋅ 阅读:(9) ⋅ 点赞:(0) ⋅ 评论:(0)

蜂窝网络

公司内网

在这里插入图片描述

  • 公司内网: 公司网络从本地网络服务提供商 (Internet Service Provider) 接入,然后内部再分成一个个子网。

  • 通信链路(Communication Link),用于传输网络信号。

  • 有的网络节点,同时接入了 2 条以上的链路,这个时候因为路径发生了分叉,数据传输到这些 节点需要选择方向,因此我们在这些节点需要进行交换(Switch)。
    数据交换的过程 :
    在这里插入图片描述

  • 比如说,你要传递一首 2Mb 的 MP3 的歌曲,歌曲本身不是一次传输完成的,而是被拆分成很多个封 包。每个封包只有歌曲中的一部分数据,而封包一旦遇到岔路口,就需要封包交换技术帮助每个封包选择最合理的路径。

  • 常见的具有交换能力的设备是路由器(Router)链路层交换机(Link-Layer Switch)。 通常情况下,两个网络可以通过路由器进行连接,多台设备可以通过交换机进行连接。但是路由器通常也具有交换机的功能

  • 每个路由器、交换机构成一级子网。最高级的路由器 在公司网络的边缘,它可以将网络内部节点连接到其他的网络(网络外部)。本地网络提供商(ISP)提 供的互联网先到达边缘的路由器,然后再渗透到内部的网络节点。

  • 局域网络之间,可以通过路由器、交换机进行连接,从而构成一个更大的局域网

移动网络

  • 网络传输需要通信链路(Communication Link),而通信链路是一个抽象概念。这里说 的抽象,就是面向对象中抽象类和继承类的关系,比如同轴电缆是通信链路,无线信号的发送接收器可 以构成通信链路,蓝牙信道也可以构成通信链路。
    在这里插入图片描述

  • 在移动网络中,无线信号构成了通信链路。在移动网络的设计中,通信的核心被称作蜂窝塔(Cellular Tower),有时候也称作基站(BaseStation) 六边形的结构可以让信号无死角地覆盖.
    在这里插入图片描述

  • 国家或全球网络提供商将网络供给处于蜂窝网络边缘的路由器,路由器连接蜂窝塔,再通过蜂 窝塔(基站)提供给处于六边形地区中的设备。

  • 国家 ISP : such 中国移动。
    在这里插入图片描述

  • 基站重叠设计的好处是,当一个基站过载、出现故障,或者用户设备周边信号出现不稳定,就可以切换到另 一个基站的网络,不影响用户继续使用网络服务。
    在这里插入图片描述

+在一定范围内的区域,离用户较近的地方还可以部署服务器,帮助用户完成计算。这相当于 计算资源的下沉,称为边缘计算。相比中心化的计算,边缘计算延迟低、链路短,能够将更好的体验带给距离边缘计算集群最近的节点。

家用网络

  • 路由器也承担了链路层网关的作用,作为家用电器之间信息的交换设备。
    在这里插入图片描述

整体关系

在这里插入图片描述

  • 最顶部的全球或国家大型的 ISP 之间联网,构成了网络的主干。然后区域性的 ISP 承接主干网络,在这 个基础之上再向家庭和公司提供接入服务。移动蜂窝网络因为部署复杂,往往也是由大型 ISP 直接提 供。

数据的传输

  • 最终提供服务或者享受服务的设备,称为终端 (Terminal),或者端系统(End System),有时候简单称为主机(Host)

  • 网络传输分成两类,

    • 端到端(Host-to-Host)的能力,由 TCP/IP 协议群提供。
    • 广播的能力: 一对多、多对多的能力,可以看作是端到端(Host-to-Host)能力的延伸。
      在这里插入图片描述
  • **网络基础设施往往不能一次性传输太大的数据量,因此通常会将数据分片传输。**比如传输一个 MP3,我 们会将 MP3 内容切分成很多个组,每个组也称作一个封包,英文都是 Packet。 如果部分损坏 ,只需重发损坏的封包。
    在这里插入图片描述

  • 网络中两点间的路径非常多,如果一条路径阻塞了,部分封包可以考虑走其他路径。发送端 将数据拆分成封包(Packet),封包在网络中遇到岔路,由交换器和路由器节点决定走向

TCP协议

主机到主机

  • TCP(Transport Control Protocol)是一个传输层协议,提供 Host-To-Host 数据的可靠传输,支持全双工,是一个连接导向的协议,P 提供的是 Host-To-Host 传输,一台主机通过 TCP 发送数据给另一台主机.
    TCP / IP 五层模型
    在这里插入图片描述

  • TCP 协议往上是应用到应用(Application-To-Application)的协议,使用tcp,需要告诉tcp端口号:端口号用于区分应用。

  • TCP 要实现主机到主机通信,就需要知道主机们的网络地址(IP 地址,然后TCP 协议把 IP 地址给底层的互联网层处理。

  • 互联网层,也叫网络层(Network Layer),提供地址到地址的通信(Address-To-Address).

  • 互联网 层解决地址到地址的通信,但是不负责信号在具体两个设备间传递。因此,网络层会调用下方的链路层 在两个相邻设备间传递信息。当信号在两个设备间传递的时候,科学家又设计出了物理层封装最底层的 物理设备、传输介质等,由最下方的物理层提供最底层的传输能力。

连接和会话

  • 连接是数据传输双方的契约。

  • 连接是通信双方的一个约定,目标是让两个在通信的程序之间产生一个默契,保证两个程序都在线,而 且尽快地响应对方的请求,这就是连接(Connection)。

  • 连接是网络行为状态的记录。
    在这里插入图片描述

  • 会话(Session),会话是应用的行为,会话会自动重连(也就是重新创建连接),或者帮助创建连接。 此外,会话也负责 在多次连接中保存状态.
    在这里插入图片描述

  • 会话是应用层的概念,连接是传输层的概念

单工和双工

在这里插入图片描述

  • **TCP 是一个双工协议,数据任何时候都可以双向传输。**这就意味着客户端和服务端可以平等地发送、接 收信息。正因为如此,客户端和服务端在 TCP 协议中有一个平等的名词——Host(主机)
  • TCP的可靠性: 可靠性指数据保证无损传输。如果发送方按照顺序发送,然后数据无序地在网络间传递,就必须有一种 算法在接收方将数据恢复原有的顺序。另外,如果发送方同时要把消息发送给多个接收方,这种情况叫作多播,可靠性要求每个接收方都无损收到相同的副本。多播情况还有强可靠性,就是如果有一个消息 到达任何一个接收者,那么所有接受者都必须收到这个消息。

TCP的挥手和握手

  • TCP 是一个连接导向的协议,设计有**建立连接(握手)和断开连接(挥手)**的过程。TCP 没有设计会话 (Session),因为会话通常是一个应用的行为。
  • TCP 协议有这样几个基本操作:
    • 如果一个 Host 主动向另一个 Host 发起连接,称为 SYN(Synchronization),请求同步;
    • 如果一个 Host 主动断开请求,称为 FIN(Finish),请求完成;
    • 如果一个 Host 给另一个 Host 发送数据,称为 PSH(Push),数据推送。

建立连接的过程(三次握手)

  • 因为要保持连接和可靠性约束,TCP 协议要保证每一条发出的数据必须给返回,返回数据叫作 ACK(也 就是响应)。
    在这里插入图片描述
  • SYN、ACK、PSH 这些常见的标识位(Flag)在传输中以二进制为的形式进行表示,1 表示 SYN 开启,0 表示关闭。SYN-ACK 就是 SYN 位和 ACK 位都置 1
  • TCP 协议增加协议头,在协议头中取多个位(bit).

断开连接的过程(4 次挥手)

  • 因为断开连接要处理的问题比较多,比如说服务端可能还有 发送出去的消息没有得到 ACK;也有可能服务端自己有资源要释放。因此**断开连接不能像握手那样 操作——将两条消息合并。**所以,服务端经过一个等待,确定可以关闭连接了,再发一条 FIN 给客户端。
    在这里插入图片描述

小结

  • 1.TCP 提供连接(Connection),让双方的传输更加稳定、安全。
  • 2.TCP 没有直接提供会话,因为应用对会话的需求多种多样,比如聊天程序会话在保持双方的聊天记 录,电商程序会话在保持购物车、订单一致,所以会话通常在 TCP 连接上进一步封装,在应用层提供。
  • 3.TCP 是一个面向连接的协议(Connection -oriented Protocol),说的就是 TCP 协议参与的双方 (Host)在收发数据之前会先建立连接。 UDP 协议: 是一个面向报文 (Datagram-oriented)的协议——协议双方不需要建立连接,直接传送报文(数据)。
  • 4.最后,连接需要消耗更多的资源。比如说,在传输数据前,必须先协商建立连接。因此,不是每种场景都应该用连接导向的协议。像视频播放的场景,如果使用连接导向的协议,服务端每向客户端推送一帧视频,客户端都要给服务端一次响应,这是不合理的。

TCP的封包格式

TCP的封包和粘包

  • TCP 是一个传输层协议。往往不会将数据一次性发送,而是将数据拆分成很多个部分,然后逐个进行发送。在这里插入图片描述
  • 其原因是因为
  • 稳定性 :一次性发送的越多,出差错的概率越大。
  • 效率: 网络中存在并行的路径,拆分数据包就能更好地利用这些并行的路径。
  • 缓冲区是在内存中开辟的一块区域,目的是缓冲。当网卡忙不过来的时候,数据就需要排队,也就是将数据放入缓冲区。
  • 如果数据大小超过一个页表,可能会存在页面置换的问题,造成性能损失.
  • 在传输层封包不能太大。这种限制,往往是以缓冲区大小为单位的。也就是 TCP 协议,会将数据拆分成不超过缓冲区大小的一个个部分。每个部分有一个独特的名词,叫作 TCP 段 (TCP Segment)。在这里插入图片描述
  • 拆包: 数据拆分成多个 TCP 段传输,然后在目的地重组。
  • 这个过程俗称粘 包。所以粘包是将多个数据合并成一个 TCP 段发送.(多个数据太小了,为了防止多次发送占用资源)

TCP Segment

在这里插入图片描述

  • Source Port/Destination Port : 发送端口号和目标端口号,代表发送数据的应用程序和接 收数据的应用程序。比如 80 往往代表 HTTP 服务,22 往往是 SSH 服务
  • Data Offset 是一个偏移量。这个量存在的原因是 TCP Header 部分的长度是可变的,因此需要一 个数值来描述数据从哪个字节开始。
  • Reserved 是很多协议设计会保留的一个区域,用于日后扩展能力。
  • URG/ACK/PSH/RST/SYN/FIN 是几个标志位,用于描述 TCP 段的行为,TPC封包的行为.
    • URG 代表这是一个紧急数据 例如 用户按下了 Ctrl+CCtrl+ c
    • ACK 代表响应,所有的消息都必须有 ACK,这是 TCP 协议确保稳定性的一环。
    • PSH 代表数据推送,也就是在传输数据的意思。
    • SYN 同步请求,也就是申请握手
    • FIN 终止请求,也就是挥手。
  • Window 也是 TCP 保证稳定性并进行流量控制的工具
  • Checksum 是校验和,用于校验 TCP 段有没有损坏
  • Urgent Pointer 指向最后一个紧急数据的序号(Sequence Number)。它存在的原因是:有时候紧 急数据是连续的很多个段,所以需要提前告诉接收方进行准备。
  • Options 中存储了一些可选字段
  • Padding 存在的意义是因为 Options 的长度不固定,需要 Pading 进行对齐。
  • 拆包.:数据被拆分成很多个部分,部分增加了协议头。合并成为一个 TCP 段,进行传输
  • TCP 段经过复杂的网络结构,由底层的 IP 协议,负责传输到目的 地,然后再进行重组.
  • 稳定性要求是数据无损地传输(拆包获得数据,又需要恢复到原来的样子).
  • Sequence Number: 累计的发送字节数
  • Acknowledgement : 累计的接收字节数。 在这里插入图片描述
  • 无论 Seq 还是 ACK,都是针对“对方”而言的。是对方发送的数据和对方接收到的数据。

MSS(Maximun Segment Size)

  • MSS,是 TCP Header 中的可选项(Options),可选项控制了 TCP 段的大小,它是一个协商字段(Negotiate),
  • TCP 段的大小(MSS)涉及发送、接收缓冲区的大小设置,双方实际发送接收封包的大小,对拆包和粘 包的过程有指导作用,因此需要双方去协商。
  • MSS太大:会降低性能以及资源的占用,支持 TCP 协议工作的 IP 协议工作效率会下降。
  • MSS太小 :会浪费传输资源(降低吞吐量) , 一般采取折中的方案 , 一切都要用实验依据说话。

滑动窗口 & 流速控制

  • TCP 作为一个传输层协议,最核心的能力是传输。传输需要保证可靠性,还需要控制流速,这两个核心能力均由滑动窗口提供.

请求/响应模型

吞吐量提升的方法 : 就是让发送方有请求就发送出去,而不是等待响应。通过这样的处理方式,发送的数 据连在了一起,响应的数据也连在了一起,吞吐量就提升了. [下图 : 而不是请求后就等待 然后再发送]
在这里插入图片描述

排队(Queuing)机制

在这里插入图片描述

滑动窗口(Sliding Window)

  • 为了提高传输速率,TCP 协议选择将多个段同时发送,为了让这些段不至于被接收方拒绝服务,在发送 前,双方要协商好发送的速率。但是我们不可能完全确定网速,所以协商的方式,就变成确定窗口大小。
  • 有两个封包的 ACK 到达,因此标记为绿色。 这个时候滑动窗口可以向右滑动。
    在这里插入图片描述
    重传
  • 段 4 迟迟没有收到 ACK,如果后来段 4 重传成功(接收到 ACK),那么窗口就会继续右移。如果段 4 发送失败, 还是没能收到 ACK,那么接收方也会抛弃段 5、段 6、段 7。这样从段 4 开始之后的数据都需要重发。
    在这里插入图片描述

** 快速重传:**

在这里插入图片描述

  • 例如段 1、段 2、段 4 到了,但是段 3 没有到。 接收方可以发送多次段 3 的 ACK。如果发送方收到多个 段 3 的 ACK,就会重发段 3。这个机 制称为快速重传。这和超时重发不同,是一种催促的机制。
  • 为了不让发送方误以为段 3 已经收到了,在快速重传的情况下,接收方即便收到发来的段 4,依然会发 段 3 的 ACK(不发段 4 的 ACK),直到发送方把段 3 重传。
  • 窗口大小的单位:际操作中,每个 TCP 段的大小不同,限制数量会让接收方的缓冲区不好操作,因此实际操作中窗口大小 单位是字节数。

控制流速

  • **发送、接收窗口的大小可以用来控制 TCP 协议的流速。**当然,窗口越大,如果数据发生错误,损失也就越大,因为需要重传越多的数据。

UDP协议

HTTP 协议 1.1 和 2.0 都基于 TCP,而到了 HTTP 3.0 就开始用 UDP 了。

  • TCP 最核心的价值是提供了可靠性
  • UDP 最 核心的价值是灵活,你几乎可以用它来做任何事情。
  • UDP(User Datagram Protocol),目标是在传输层提供直接发送报文(Datagram)的能力。 Datagram 是数据传输的最小单位。UDP 协议不会帮助拆分数据,它的目标只有一个,就是发送报文。

DUP的封包格式

  • UDP 的设计目标就是在允许用户直接发送报文的情况下,最大限度地简化应用的设计。下图是 UDP 的 报文格式。
    在这里插入图片描述
  • Source Port 是源端口号。因为 UDP 协议的特性(不需要 ACK),因此这个字段是可以省略的。 但有时候对于防火墙、代理来说,Source Port 有很重要的意义,它们需要用这个字段行过滤和路 由。
  • Destination Port 是目标端口号(这个字段不可以省略)。
  • Length 是消息体长度。
  • Checksum 是校验和,作用是检查封包是否出错。
  • Data octets 就是一个字节一个字节的数据,Octet 是 8 位。
  • 校验和(Checksum)机制: 因为校验数 据在传输过程中有没有丢失、损坏是一个普遍需求。传输的内容是01组成的二进制。比如现在数据有 4 个 byte:a,b,c,d,那么一种最简单的校验和就是: checksum=(a+b+c+d) ^ 0xff 取反所有进制位 ,如果发送方用上述方式计算出 Checksum,并将 a,b,c,dChecksum一起发送给接收方,接收方就 可以用同样的算法再计算一遍,这样就可以确定数据有没有发生损坏(变化)。

UDP 与 TCP的区别

  • 1.目的差异 :
    • TCP 协议的核心目标是提供可靠的网络传输
    • UDP 的目标是在提供 报文交换能力基础上尽可能地简化协议轻装上阵。
  • 2.可靠性差异 :
    + TCP 核心是要在保证可靠性提供更好的服务。TCP 会有握手的过程,需要建立连接,保证双方同时在 线。而且TCP 有时间窗口持续收集无序的数据,直到这一批数据都可以合理地排序组成连续的结果。
    + UDP 并不具备以上这些特性,它只管发送数据封包,而且 UDP 不需要 ACK,这意味着消息发送出去成 功与否 UDP 是不管的.
  • 3.连接 vs 无连接
    • TCP 是一个面向连接的协议(Connection-oriented Protocol),传输数据必须先建立连接。
    • UDP 是一 个无连接协议(Connection-less Protocol),数据随时都可以发送,只提供发送封包(Datagram)的 能力
    1. 流控技术(Flow Control): TCP 使用了流控技术来确保发送方不会因为一次发送过多的数据包而使接收方不堪重负。TCP 在发送缓冲区中存储数据,并在接收缓冲区中接收数据。当应用程序准备就绪时,它将从接收缓冲区读取数据。 如果接收缓冲区已满,接收方将无法处理更多数据,并将其丢弃。UDP 没有提供类似的能力.
    1. 传输速度: UDP 协议简化,封包小,没有连接、可靠性检查等,因此单纯从传输速度上讲,UDP 更快。
    1. 场景差异
    • 第一类:TCP 场景 远程控制(SSH)File Transfer Protocol(FTP) 邮件(SMTP、IMAP)等 点对点文件传出(微信等)
    • 第二类:UDP 场景 网络游戏 音视频传输 DNS Ping 直播
    • 第三类:模糊地带 HTTP(目前以 TCP 为主) 文件传输
      理论上,任何一个用 TCP 协议构造的成熟应用层协议,都可以用 UDP 重构

思考题

TCP 为什么是 3 次握手,4 次挥手?

TCP 是一个双工协议,为了让双方都保证,建立连接的时候,连接双方都需要向对方发送 SYC (同步请求)和 ACK(响应)。握手阶段双方都没有烦琐的工作,因此一方向另一方发起同步(SYN)之后,另一方可以将自己的 ACK 和 SYN 打包作为一条消息回复,因此是 3 次握手——需要 3 次数据传输
到了挥手阶段,双方都可能有未完成的工作。收到挥手请求的一方,必须马上响应(ACK),表示接收到了挥手请求。最后等所有工作结束,再发送请求中断连接(FIN),然后响应ACK,因此是 4 次挥手。

一台内存在 8G 左右的服务器,可以同时维护多少个连接?

public class Server {
    public static void main(String[] argv) throws IOException {
        var serverSocket = new ServerSocket();
        var addr = new InetSocketAddress(3001);
        serverSocket.bind(addr);
        var list = new LinkedList<>();
        while(true) {
            var client = serverSocket.accept();
            list.add(client);
            System.out.println(list.size());
        }
    }
}
public class Client {
    public static void main(String[] argv) throws IOException, InterruptedException {
        var clients = new LinkedList<>();
        for(int i = 0; i < 1000000; i++) {
            var client = new Socket("127.0.0.1", 3001);
            clients.add(client);
        }
        Thread.sleep(10000000);
    }
}

在用sudo cat /proc/{进程ID}/status | grep VmHWM可以看到 实际的内存占用
完全可以运行100W的连接,当时连接太多会报一个Cannot assign requested address的异常
核心的问题是,通信需要缓冲区,通信需要 I/O。这是因为通信占用资 源,连接本身占用资源

TCP 协议是如何恢复数据的顺序的,TCP 拆包和粘包 的作用是什么?

TCP 拆包的作用是将任务拆分处理,降低整体任务出错的概率,以及减小底层网络处理的压力。拆包过程需要保证数据经过网络的传输,又能恢复到原始的顺序。这中间,需要数学提供保证顺序 的理论依据。TCP 利用(发送字节数、接收字节数)的唯一性来确定封包之间的顺序关系。

有哪些好用的压测工具?

  • 压力测试最常见的工具是 Apache Benchmark(简称 AB),在 Linux 下面可以通过包管理器安装 ab: yum install httpd-tools apt-get install apache2-utils ab 安装好后,可以利用下面这条指令向某个网站发送并发 1000 的 10000 次请求: ab -n 10000 -p 1000 https://example.com/
  • JAVA 的工具“JMeter” 可视化

滑动窗口和流速控制是怎么回事?

  • 滑动窗口是 TCP 协议控制可靠性的核心。发送方将数据拆包,变成多个分组。然后将数据放入一个拥有滑动窗口的数组,依次发出,仍然遵循先入先出(FIFO)的顺序,但是窗口中的分组会一次性发送。窗口中序号最小的分组如果收到 ACK,窗口就会发生滑动;如果最小序号的分组长时间没有收到 ACK,就会触发整个窗口的数据重新发送。
  • 另一方面,在多次传输中,网络的平均延迟往往是相对固定的,这样 TCP 协议可以通过双方协商窗口大小控制流速。

既然发送方有窗口,那么接收方也需要有窗口吗?

接收方收到发送方的每个数据分组(或者称为 TCP Segment),接收方肯定 需要缓存。举例来说,如果发送方发送了:1, 2, 3, 4。 那么接收方可能收到的一种情况是:1,4,3。 注意,没有收到 2 的原因可能是延迟、丢包等。这个时候,接收方有两种选择。

  • 选择一:什么都不做(这样分组 2 的 ACK 就不会发送给发送方,发送方发现没有收到 2 的 ACK,过一 段时间就有可能重发 2,3,4,5)。 当然具体设计还需要探讨,比如不重发整个分组,只重发已发送没有收 到 ACK 的分组。这种方法的缺陷是性能太差,重发了整个分组(或部分)。因此我们可以考虑另一种选择。
  • 选择二:如果重发一个窗口,或部分窗口,问题就不会太大了。虽然增加了网络开销,但是毕竟有进步 (1 进步了,不会再重发)。性能方面最大的开销是等待超时的时间,就是发送方要等到超时时间才重发窗口,这样操作性能太差。 因此,TCP 协议有一个快速重传的机制——接收方发现接收到了 1,但是没有接收到 2,那么马上发送 3 个分组 2 的 ACK 给到发送方,这样发送方收到多个 ACK,就知道接收方没有收到 2,于是马上重发 2。
  • 接收方也维护一个滑动窗口,是一个不错的选择。接收窗口的状态,可以和发送 窗口的状态相互对应了。

TCP 协议和 UDP 协议的优势和劣势?

  • TCP 最核心的价值就是提供封装好的一套解决可靠性的优秀方案。TCP 帮助我们在确保吞吐量、延迟、丢包率的基础 上,保证可靠性。很 多现成、好用的能力。
  • UDP 则不同,UDP 提供了最小版的实现,只支持 Checksum。UDP 最核心的价值是灵活、轻量、传输 速度快。
  • 主要还是看应用的场景
  • 最后还有一个非常重要的考虑因素就是成本,如果没有足够专业的团队解决网络问题,TCP 无疑会是更好的选择。

Moba 类游戏的网络应该用 TCP 还是 UDP?

  • 所有在线联机游戏都有件非常重要的事情需要完成,就是确定事件发生的唯一性,这个性质和 聊天工具是类似的.
  • 内存同时刻只能有一个状 态,所以多个线程的操作必须有先有后。
  • 服务器要尽快响应多个客户端提交的事件,并以最快的速度分配自增序号,然后返回给客户端。
  • Moba 服务端的核心是自增序号的计算和尽量缩减延迟。
  • 如果规模较小的在线竞技类游戏,TCP 完全适用。但是当游戏玩家体量上升后,TCP 协议的头部(数据封包)较大,会增加服务器额外的 I/O 压力。要发送更多的数据,自然有更大的 I/O 压力。从这个角度来看,UDP 就有了用武之地。

总结

  • 当你既要保证 FIFO,又要提供多处理的数据结构时,可以想到滑动窗口
  • 当你设计请求/响应模型的时,可以想到多路复用
  • 当你为自己的应用选择协议时,可以想到实现可靠性最基本的思路。