• 互联网协议等


    1、什么是互联网协议及为何要有互联网协议

      互联网协议:互联网的实现,分成好几层。每一层都有自己的功能,就像建筑物一样,每一层都靠下一层支持。每一层都是为了完成一种功能。为了实现这些功能,就需要大家都遵守共同的规则。大家都遵守的规则,就叫做"协议"。互联网的每一层,都定义了很多协议。这些协议的总称,总称为"互联网协议"(Internet Protocol Suite)。它们对电脑如何连接和组网,做出了详尽的规定。

    互联网协议的功能:定义计算机如何接入Internet,以及接入Internet的计算机通信的标准。

    2、osi五层模型

      互联网的实现,分成好几层。每一层都有自己的功能,就像建筑物一样,每一层都靠下一层支持。

      用户接触到的,只是最上面的一层,根本没有感觉到下面的层。要理解互联网,必须从最下层开始,自下而上理解每一层的功能。

      如何分层有不同的模型,有的模型分七层,有的分四层。把互联网分成五层,比较容易解释

    Python全栈开发S5第3天作业

      如上图所示,最底下的一层叫做实体层(Physical Layer),最上面的一层叫做应用层(Application Layer),中间的三层(自下而上)分别是链接层(Link Layer)、网络层(Network Layer)和传输层(Transport Layer)。越下面的层,越靠近硬件;越上面的层,越靠近用户。

      ①最低层实体层,它就是把电脑连接起来的物理手段(光缆、电缆、双绞线、无线电波等方式)。它主要规定了网络的一些电气特性,作用是负责传送0和1的电信号。

      ②接着是链接层,它在实体层的上方,它的作用是把单纯的0和1电信号进行分组,确定了0和1的分组方式。电信号分组方式。目前占主导地位的电信号分组方式为以太网协议。以太网规定,一组电信号构成一个数据包,叫做"帧"(Frame)。每一帧分成两个部分:标头(Head)和数据(Data)。"标头"包含数据包的一些说明项,比如发送者、接受者、数据类型;"数据"则是数据包的具体内容。标头中包含的源和目标地址由来:以太网规定接入互联网的设备都必须具备网卡,发送端和接收端的地址便是指网卡的地址,即MAC地址。每块网卡出厂时都被烧制上一个世界唯一的MAC地址,有了MAC地址,就可以定位网卡和数据包的路径了。

      就算有了MAC地址,系统为了把数据包准确送到接收方,以太网采用了一种很"原始"的方式,它不是把数据包准确送到接收方,而是向本网络内所有计算机发送,它们读取这个包的"标头",找到接收方的MAC地址,然后与自身的MAC地址相比较,如果两者相同,就接受这个包,做进一步处理,否则就丢弃这个包。这种发送方式就叫做"广播"(broadcasting)。

      有了数据包的定义、网卡的MAC地址、广播的发送方式,"链接层"就可以在多台计算机之间传送数据了。

      ③第三层为网络层。以太网协议,依靠MAC地址发送数据。理论上,单单依靠MAC地址,任何一个网卡就可以找到世界上任意其他的网卡了,技术上是可以实现的,但这种方法对资源占用太严重,实际并不可行。为了区分MAC地址的子网络。如果是同一个子网络,就采用广播方式发送,否则就采用"路由"方式发送。

    这就导致了"网络层"的诞生。它的作用是引进一套新的地址,使得我们能够区分不同的计算机是否属于同一个子网络。这套地址就叫做"网络地址",简称"网址"。于是,"网络层"出现以后,每台计算机有了两种地址,一种是MAC地址,另一种是网络地址。两种地址之间没有任何联系,MAC地址是绑定在网卡上的,网络地址则是管理员分配的,它们只是随机组合在一起。

      ④第四层为传输层有了MAC地址和IP地址,我们已经可以在互联网上任意两台主机上建立通信。接下来为了辨识同一台主机上用到网络的具体程序,我们还需要一个参数"端口"(port),表示使用网卡的程序的编号。

    "传输层"的功能,就是建立"端口到端口"的通信。相比之下,"网络层"的功能是建立"主机到主机"的通信。只要确定主机和端口,我们就能实现程序之间的交流。因此,Unix系统就把主机+端口,叫做"套接字"(socket)。有了它,就可以进行网络应用程序开发了。

      ⑤最后为应用层。程序收到"传输层"的数据,接下来就要进行解读。"应用层"的作用,就是规定应用程序的数据格式这些应用程序协议就构成了"应用层"。

    这是最高的一层,直接面对用户。它的数据就放在TCP数据包(或UPD数据包)的"数据"部分。因此,现在的以太网的数据包就变成下面这样。

     

     Python全栈开发S5第3天作业

    3、用户上网流程

      1 首先用户设置好了自己的网络参数:

        * 本机的IP地址:192.168.1.100   * 子网掩码:255.255.255.0   * 网关的IP地址:192.168.1.1   * DNS的IP地址:8.8.8.8

    然后他打开浏览器,想要访问Google,在地址栏输入了网址:www.google.com。

    Python全栈开发S5第3天作业

     

      这意味着,浏览器要向Google发送一个网页请求的数据包。

      2 DNS协议

      我们知道,发送数据包,必须要知道对方的IP地址。但是,现在,我们只知道网址www.google.com,不知道它的IP地址。

    DNS协议可以帮助我们,将这个网址转换成IP地址。已知DNS服务器为8.8.8.8,于是我们向这个地址发送一个DNS数据包(53端口)。

    Python全栈开发S5第3天作业

     

      然后,DNS服务器做出响应,告诉我们Google的IP地址是172.194.72.105。于是,我们知道了对方的IP地址。

      3 子网掩码

      接下来,我们要判断,这个IP地址是不是在同一个子网络,这就要用到子网掩码。

      已知子网掩码是255.255.255.0,本机用它对自己的IP地址192.168.1.100,做一个二进制的AND运算(两个数位相同,结果为1,否则为0),计算结果为192.168.1.0;然后对Google的IP地址172.194.72.105也做一个AND运算,计算结果为172.194.72.0。这两个结果不相等,所以结论是,Google与本机不在同一个子网络。

      因此,我们要向Google发送数据包,必须通过网关192.168.1.1转发,也就是说,接收方的MAC地址将是网关的MAC地址。

      4 应用层协议

      浏览网页用的是HTTP协议,它的整个数据包构造是这样的:

    Python全栈开发S5第3天作业

     

      HTTP部分的内容,类似于下面这样:

        GET / HTTP/1.1   Host: www.google.com   Connection: keep-alive   User-Agent: Mozilla/5.0 (Windows NT 6.1) ......   Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8   Accept-Encoding: gzip,deflate,sdch   Accept-Language: zh-CN,zh;q=0.8   Accept-Charset: GBK,utf-8;q=0.7,*;q=0.3   Cookie: ... ...

      我们假定这个部分的长度为4960字节,它会被嵌在TCP数据包之中。

      5 TCP协议

      TCP数据包需要设置端口,接收方(Google)的HTTP端口默认是80,发送方(本机)的端口是一个随机生成的1024-65535之间的整数,假定为51775。

      TCP数据包的标头长度为20字节,加上嵌入HTTP的数据包,总长度变为4980字节。

      6 IP协议

      然后,TCP数据包再嵌入IP数据包。IP数据包需要设置双方的IP地址,这是已知的,发送方是192.168.1.100(本机),接收方是172.194.72.105(Google)。

      IP数据包的标头长度为20字节,加上嵌入的TCP数据包,总长度变为5000字节。

      7 以太网协议

      最后,IP数据包嵌入以太网数据包。以太网数据包需要设置双方的MAC地址,发送方为本机的网卡MAC地址,接收方为网关192.168.1.1的MAC地址(通过ARP协议得到)。

      以太网数据包的数据部分,最大长度为1500字节,而现在的IP数据包长度为5000字节。    因此,IP数据包必须分割成四个包。因为每个包都有自己的IP标头(20字节),所以四个包的IP数据包的长度分别为1500、1500、1500、560。

    Python全栈开发S5第3天作业

      8 服务器端响应

      经过多个网关的转发,Google的服务器172.194.72.105,收到了这四个以太网数据包。

      根据IP标头的序号,Google将四个包拼起来,取出完整的TCP数据包,然后读出里面的"HTTP请求",接着做出"HTTP响应",再用TCP协议发回来。

      本机收到HTTP响应以后,就可以将网页显示出来,完成一次网络通信。

    Python全栈开发S5第3天作业

     

     

  • 相关阅读:
    Web前段学习索引
    Python学习索引
    Centos7下安装Docker(详细的新手教程)
    Django部署阿里云服务器(nginx+uwsgi)
    (转)Mongo db 与mysql 语法比较
    (转)mongo基本常用命令
    python操作mongodb的基本操作命令
    http响应码
    python回调函数
    Flask框架的使用
  • 原文地址:https://www.cnblogs.com/ALXPS/p/6912671.html
Copyright © 2020-2023  润新知