• Python网络编程


    网络协议五层模型

    网路的五层划分是什么

    ​ 互联网的实现,分成好几层,每一层都有自己的功能,就想建筑物一样,每一层都靠下下一层支持。用户接触到的,只是最上面的一层,根本没有感觉调下面的层

    ​ 每一层都是为了完成一种功能,未来实现这种功能,就需要大家遵守共同的规则,叫做“协议”。互联网的每一层,都定义了许多协议,这些协议的总称,就叫做“互联网协议”img

    由上图可知,最下层位物理层(实体层)

    实体层:

    • 什么是实体层呢?
      • 我们的电脑要组网,那么第一件事情是什么呢。我们都知道肯定是要将网线插入,通过网线将电脑链接起来。这就叫做物理层
      • 实体层还规定了网络的一些电气特性,作用负责传送0和1的电信号

    链接层:

    • 什么是链接层呢?

      • 我们知道,通过实体层传送0和1信号,但是单纯的0和1信号是没有任何意义的,所以我们必须规定解读的方式。比如多少个电信号为一组,每个电信号有什么意义。这就是链接层的功能。
      • 所以链接层会在实体层上面
    • 以太网协议:

      • 早期的时候,每家公司都有自己的电信号分组方式。逐渐的,一种叫做“以太网”的协议,占据了主导地位。以太网规定,一组电信号构成一个数据包,叫做“帧”。每一个帧分为两个部分:标头和数据
        • 标头:包含数据包的一些说明项,比如发送者、接受者、数据类型等
        • 数据:则是数据包的具体内容。
    • MAC地址:

      上面提到,以太网数据的“标头”,包含了发送者和接受者的信息。那么,发送者和接收者是如何标识呢?
      • 以太网规定,连入网络的所有设备,都必须具有“网卡“接口。数据包必须是从一块网卡,传送到另一块网卡。网卡的地址,就是数据包的发送地址和接收地址,这叫做MAC地址。
      • 每块网卡出厂的时候,都采取了48个二进制位,通常用12个16进制表示。前六个十六个进制是厂商标号,后六个是该厂商网卡的流水号。有了MAC地址就可以定位网卡和数据包的路径。
    • 广播:

      • 那么一块网卡是如何知道另一块网卡的MAC地址呢?实际上这是通过ARP协议来解决的
      • 那么有了MAC地址以后,又是如何把数据包准确的送到接收方呢?实际上它并不是把数据包准确的送过去,而是向本网络内所有计算机发送广播,让每台计算机自己判断,是否位接受方
        • 一号计算机向二号计算机发送一个数据包,同一个子网络的所有计算机都会接收到这个包。它们通过读取标头,找到接收方的MAC地址,与自己进行比较,相同就接收,不同就扔掉。这种方式叫做广播

    网络层

    • 网络层的由来
      • 以太网协议,依靠MAC地址发送数据。理论上,单单靠MAC地址,上海的网卡就可以找到洛杉矶的网卡了,技术上是可以实现的。但是有一个重大的缺点。以太网采用广播方式发送数据包,导致效率低,而且局限在发送者所在的子网络。
      • 因此,必须找到一种方法,用于区分地址是否是同一个子网络,哪些不是。如果是同一个子网络,就采取广播方式发送,否则就采用”路由“方式向不同的子网络分发数据包。这就导致了网络层的诞生
    • IP协议:
      • 规定网络地址的协议叫做ip协议,它所定义的地址,被称为ip地址。目前广泛采用的ip协议第四版,简称IPv4。这个版本规定,网络地址有32个二进制组成
      • ip协议的作用:
        • 1.为没一台计算机分配ip地址,
        • 确定哪些地址在同一个子网络
    • IP数据包
      • 根据ip协议发送的数据,就叫做ip数据包,其中必定包括ip地址信息
      • 但是以太网只包含MAC地址,并没有ip地址的栏位。那么需要把ip数据包直接放进以太网络数据包的数据部分,不用修改以太网的规则。这就是互联网分层机构的好处
      • 具体来说ip数据也分为标头和数据两个部分
    • APR协议
      • 因为ip数据包是放在以太网络数据包里发送的,所以必须同时知道两个地址,一个是从对方的MAC地址,另一个是对方的IP地址

    传输层

    • 传输层的由来
      • 有了MAC地址和IP地址,我们已经可以在互联网上任意两台主机上建立通信。
      • 传输层的功能就是建立端口到端口的通信。相比之下,网络层的功能是建立到主机的通信。UNICX系统就把主机+端口,叫做(socket)”套接字“,有了它就可以进行网络应用程序开发
    • UDP协议
      • 现在我们必须在数据包中加入端口信息,这就需要新的协议。最简单的实现叫做UDP协议,他的格式几乎就是在数据面前,加上端口号
    • TCP协议
      • UDP协议的优点是比较简单,容易实现,但是缺点是可靠性较差,一旦数据包发出,无法知道对方是否收到
      • TCP就是加入了确认机制的UDP协议,每一个数据包都要求确认。如果有一个缺失,就无法确认,保证了数据不丢失,但是过程复杂。实现困难,消耗较多资源。

    应用层

    • 应用层由来
      • 应用层收到传输层的数据,接下来进行解读。由于互联网是开放架构,数据来源五花八门,必须事先规定好格式,否则根本无法解读。应用层的作用,就是规定应用程序的数据格式。
      • 应用层解析TCP协议可以为各种各样的程序传递数据,比如Email、WWW、FTP等等。那么,必须有不同协议规定电子邮件、网页、FTP数据的格式,这些应用程序协议就构成了”应用层”。这是最高的一层,直接面对用户。它的数据就放在TCP数据包的”数据”部分。

    三次握手和四次分手

    三次握手

    • TCp是面向链接的,无论哪一方向向另一方发送数据之前,都必须现在双方之间建立一条连接。在TCP/IP协议中,TCP协议提供可靠的连接服务,连接是通过三次握手进行初始化的。三次握手的目的是同步连接双方的序列号和确认号并交换 TCP窗口大小信息。

      • 第一次握手:Client将标志位SYN置为1,随机产生一个值seq=x,并将该数据包发送给Server,Client进入SYN_SENT状态,等待Server确认。

      • 第二次握手:Server收到数据包后由标志位SYN=1知道Client请求建立连接,Server将标志位SYN和ACK都置为1,ack (number )=x+1,随机产生一个值seq=y,并将该数据包发送给Client以确认连接请求,Server进入SYN_RCVD状态。

      • 第三次握手:Client收到确认后,检查ACK是否为Client发送的seq+1,即x+1;如果正确则将标志位ACK置为1,ack=y+1,并将该数据包发送给Server。Server检查ack是否为Server发送的seq+1,即y+1,如果正确则连接建立成功,Client和Server进入ESTABLISHED状态,完成三次握手。

        img

    四次分手过程

    • 当客户端和服务器通过三次握手建立了TCP连接以后,当数据传送完毕,肯定是要断开TCP连接的啊。那对于TCP的断开连接,这里就有了神秘的“四次分手”

      • 第一次分手:客户端设置seq=x,向服务端发送一个FIN报文段;此时,主机1进入FIN_WAIT_1状态;这表示客户端没有数据要发送给服务端了
      • 第二次分手:服务端收到了客户端发送的FIN=1,向客户端回复ACK=1,ack=收到的seq+1=x+1,然后客户端进入FIN_WAIT_2状态;服务端告诉客户端,在等待自己去关闭连接
      • 第三次分手:服务端向客户端发送FIN=1,设置seq=y,请求关闭连接,同时服务端进入LAST_ACK状态
      • 第四次分手:客户端收到服务端发送的FIN,向服务端发送ACK=1,ack=收到的seq+1=y+1,然后主机1进入TIME_WAIT状态;服务端收到客户端的ACK报文段以后,就关闭连接;此时,客户端等待2MSL后依然没有收到回复,则证明Server端已正常关闭,客户端也关闭连接

      img

  • 相关阅读:
    第三方插件处理 json数据的易错点
    C# 生成缩略图 方法
    javascript 数组的数据删除 splice() 的问题
    System.InvalidOperationException: 未在本地计算机上注册“Microsoft.ACE.OLEDB.12.0”提供程序。
    C#单的二维码生成
    “System.NullReferenceException”类型的异常在 App_Web_j2s3gau3.dll 中发生,但未在用户代码中进行处理的Bug解决方案
    C#实现简单的邮件发送功能
    Python配置管理的几种方式
    Airflow 入门教程&示例
    pandas 使用 df.product 条件筛选报错Keyerror:False
  • 原文地址:https://www.cnblogs.com/ledgua/p/11527987.html
Copyright © 2020-2023  润新知