1. C/S B/S架构

C: Client 客户端 B: Browse 浏览器 S: Server 服务端

C/S架构: 基于客户端与服务端之间的通信

eg: QQ,微信,LOL,DNF等需要安装Application应用的,都采用C/S架构

优点: 个性化设置,响应速度快

缺点: 开发成本,维护成本高,占用空间,用户固定

B/S架构: 基于浏览器与服务端之间的通信

eg: 谷歌浏览器,火狐浏览器,360浏览器等等

优点: 开发和维护成本低,占用空间相对低,用户不固定

缺点: 功能单一,没有个性化的设置,响应速度相对慢一点.

2. 网络通信原理

1. 先通过错综复杂的物理线路连通

2. 确定对方的软件(应用层)的位置

3. 通过一揽子网络协议达到规范化

3. osi七层协议

应用层

表示层

会话层

传输层

网络层

数据链路层

物理层

  • 简单串联五层协议以及作用

    物理层: 指的是网线,光纤,双绞线等物理连接介质

    ​ 物理层发送的是比特流: 010101010101011010101010001

    数据链路层: 物理层发送的比特流应该按一定的规律去分组,

    ​ 所以数据链路层功能: 对比特流进行分组

    ​ 这里有一个对数据分组的标准: 以太网协议

    ​ 一组数据叫做一帧,数据报

    head | data | tail

    head固定的长度为14字节

    ​ 源MAC地址: 6字节

    ​ 目标MAC地址: 6字节

    ​ 类型: 2字节

    data: 最少是46字节,最大1500字节.

    tail: 固定为4字节,用于FCS(帧检验,采用CRC循环冗余码)

    ​ MAC地址: 每个电脑上有一个网卡,往网卡上都记录一个独一无二的地址,而MAC地址就是我们计算机网卡上标注的地址, 12位16进制数组成: 前六位是厂商编号,后六位是流水线号,eg:'1C-1B-0D-A4-E6-44'

    #### 计算机通信方式

    ​ 同一个局域网内,通过广播的形式通信

    1. 还有两个没有解决:
    2. 不同局域网如何通信
    3. 软件与软件的通信,而不是计算机之间的通信

    网络层:

    ​ 通过IP协议确定局域网(子网)的位置

    传输层:

    端口协议: 确定软件在计算机的位置

    应用层: 各种应用协议和自己定义的协议

    广播(局域网内) + mac地址(计算机位置) + ip(局域网的位置) + 端口(软件在计算机的哪个位置)

    有以上四个参数:你就可以确定世界上任何一个计算机的软件的位置.

  • 对五层协议详细的补充说明

    • 数据链路层的补充:

      同一个局域网通过广播的形式发送数据

      交换机的mac地址学习功能:

      一个交换机的5个接口: 5个计算机.

      1: FF-FF-FF-FF-FF-FF

      2: FF-FF-FF-FF-FF-FF

      3: FF-FF-FF-FF-FF-FF

      4: FF-FF-FF-FF-FF-FF

      5: FF-FF-FF-FF-FF-FF

      接口1: 源mac 1C-1B-0D-A4-E6-44 目标1C-1C-0D-A4-E5-44 |数据 以广播的形式发出

      2,3,4,5口都会接收到消息,5口是最终的目标地址,交换机就会将5口与mac地址对应上.

      1: 1C-1B-0D-A4-E6-44

      2: FF-FF-FF-FF-FF-FF

      3: FF-FF-FF-FF-FF-FF

      4: FF-FF-FF-FF-FF-FF

      5: 1C-1C-0D-A4-E5-44

      当五个口都对应上具体的mac地址,2口再次发消息,就不会广播了,就会以单播发送.

      我们的前提是什么? 你必须知道对方的mac地址你才可以以广播的形式发消息.实际上,网络通信中,你只要知道对方的IP与自己的IP即可.

      如果想要给一个计算机发数据,就一定要知道对方的ip地址

      ARP协议: 通过对方的ip的地址获取到对方的mac地址

      源mac 目标mac 源ip 目标ip 数据

      1B-1B-0D-A4-E6-54 1C-1B-0D-A4-E6-44 172.16.10.156 172.16.10.13 数据

      1. 总结:
      2. 前提:知道目标mac:
      3. 计算机A 发送一个消息给 计算机B
      4. 源码mac 目标mac IP 目标IP 数据
      5. 单播的形式发送到交换机,交换机会检测自己的对照表有没有目标mac,如果有,单播传.如果没有,交由上一层: 路由器:
      6. 路由器收到消息: 对消息进行分析:
      7. 要确定目标计算机与本计算机是否在同一网段,
      8. 如果在同一网段,直接发送给对应的交换机,交换机在单播发给目标mac.
      9. 如果不是在同一网段: 通过ip的路由表进行某种路由算法得出
      10. 前提:不知道目标mac:
      11. 计算机A 发送一个消息给 计算机B
      12. 源码mac 目标mac不知道 IP 目标IP 数据
      13. 单播的形式发送到交换机,交换机交由上一层路由器:路由器收到消息: 对消息进行分析:

    要确定目标计算机与本计算机是否在同一网段,

    1. 如果在同一网段通过 IP以及ARP协议获取到对方的mac地址,然后在通信.
    2. 如果不是在同一网段: 一般得不到mac
    3. **主机ID为全0时表示网络ID,全1时表示广播地址**
    1. - #### 网络层:
    2. IP协议:
    3. ip地址:四段点分十进制 192.168.14.141
    4. 取值范围: 0~255.0~255.0~255.0~255
    5. 子网掩码: C类子网掩码: 255.255.255.0
    6. ip地址 + 子网掩码 按位与运算 计算出是否在同一局域网(子网,网段)
    7. ```python
    8. 计算172.16.10.1 与 172.16.10.128
    9. 172.16.10.1:10101100.00010000.00001010.00000001
    10. 255.255.255.0: 11111111.11111111.11111111.00000000
    11. 从属于的局域网: 172.16.10.0
    12. 172.16.10.128:10101100.00010000.00001010.10000000
    13. 255.255.255.0: 11111111.11111111.11111111.00000000
    14. 从属于的局域网: 172.16.10.0
    15. 172.16.10.1 ~172.16.10.255
    16. C类子网掩码 一个网段最多可以承载多个IP地址?
    17. 172.16.10.0 全网地址 被占用
    18. 172.16.10.255 广播地址 被占用.
    19. 所以C类 一个网段最多为254台计算机
    • 传输层:

      端口协议: UDP协议,TCP协议

      一共有2的16次方个(0~65535)

      0~1023 操作系统专门使用的端口

      eg: 3306 数据库

      自己开发的软件都是8080以后的端口

4. UDP TCP 协议

TCP(Transmission Control Protocol)可靠的、面向连接的协议(eg:打电话)、流式协议, 传输效率低全双工通信(发送缓存&接收缓存)、面向字节流。使用TCP的应用:Web浏览器;文件传输程序。

UDP(User Datagram Protocol)不可靠的、无连接的服务,传输效率高(发送前时延小),一对一、一对多、多对一、多对多、面向报文(数据包),尽最大努力服务,无拥塞控制。使用UDP的应用:域名系统 (DNS);视频流;IP语音(VoIP)。

5. TCP协议的三次握手和四次挥手

通俗易懂版三次握手:

TCP三次握手过程

传输连接具有三个阶段:连接建立、数据传送以及连接释放。传输连接管理就是对连接建立以及连接释放过程的管控,使得其能正常运行,达到这些目的:使通信双方能够确知对方的存在、可以允许通信双方协商一些参数(最大报文段长度、最大窗口大小等等)、能够对运输实体资源进行分配(缓存大小等)。TCP连接的建立采用客户-服务器模式:主动发起连接建立的应用进程叫做客户,被动等待连接建立的应用进程叫做服务器。

连接建立阶段:

第一次握手:客户端的应用进程主动打开,并向客户端发出请求报文段。其首部中:SYN=1,seq=x。

第二次握手:服务器应用进程被动打开。若同意客户端的请求,则发回确认报文,其首部中:SYN=1,ACK=1,ack=x+1,seq=y。

第三次握手:客户端收到确认报文之后,通知上层应用进程连接已建立,并向服务器发出确认报文,其首部:ACK=1,ack=y+1。当服务器收到客户端的确认报文之后,也通知其上层应用进程连接已建立。

在这个过程中,通信双方的状态如下图,其中CLOSED:关闭状态、LISTEN:收听状态、SYN-SENT:同步已发送、SYN-RCVD:同步收到、ESTAB-LISHED:连接已建立

至此,TCP连接就建立了,客户端和服务器可以愉快地玩耍了。只要通信双方没有一方发出连接释放的请求,连接就将一直保持。

第一次握手可以检验服务端的接收功能是否健全

第二次握手可以检测客户端的发送功能和接收功能是否健全.

第三次握手可以检测服务端的发送功能是否健全.

问题一:为什么三次握手:

为什么A还要发送-次确认呢?这主要是为了防止已失效的连接请求报文段突然又传
送到了B,因而产生错误。
所谓“已失效的连接请求报文段”是这样产生的。考虑一种正常情况。A发出连接请
求,但因连接请求报文丢失而未收到确认。于是A再重传一次连接请求。后来收到了确
认,建立了连接。数据传输完毕后,就释放了连接。A共发送了两个连接请求报文段,其中
第一个丢失,第二个到达了B.没有“已失效的连接请求报文段”。
现假定出现一-种异常情况,即A发出的第一个连接请求报文段并没有丢失,而是在某
些网络结点长时间滞留了,以致延误到连接释放以后的某个时间才到达B.本来这是-个早
已失效的报文段。但B收到此失效的连接请求报文段后,就误认为是A又发出一-次新的连
接请求。于是就向A发出确认报文段,同意建立连接。假定不采用三次握手,那么只要B
发出确认,新的连接就建立了。
由于现在A并没有发出建立连接的请求,因此不会理睬B的确认,也不会向B发送数
据。但B却以为新的运输连接已经建立了,并一直等待A发来数据。B的许多资源就这样
白白浪费了。
采用三次握手的办法可以防止上述现象的发生。例如在刚才的情况下,A不会向B的
确认发出确认。B由于收不到确认,就知道A并没有要求建立连接。

四次挥手连接释放过程

第一次挥手:数据传输结束以后,客户端的应用进程发出连接释放报文段,并停止发送数据,其首部:FIN=1,seq=u。

第二次挥手:服务器端收到连接释放报文段之后,发出确认报文,其首部:ack=u+1,seq=v。此时本次连接就进入了半关闭状态,客户端不再向服务器发送数据。而服务器端仍会继续发送。

第三次挥手:若服务器已经没有要向客户端发送的数据,其应用进程就通知服务器释放TCP连接。这个阶段服务器所发出的最后一个报文的首部应为:FIN=1,ACK=1,seq=w,ack=u+1。

第四次挥手:客户端收到连接释放报文段之后,必须发出确认:ACK=1,seq=u+1,ack=w+1。 再经过2MSL(最长报文端寿命)后,本次TCP连接真正结束,通信双方完成了他们的告别。

在这个过程中,通信双方的状态如下图,其中:ESTAB-LISHED:连接建立状态、FIN-WAIT-1:终止等待1状态、FIN-WAIT-2:终止等待2状态、CLOSE-WAIT:关闭等待状态、LAST-ACK:最后确认状态、TIME-WAIT:时间等待状态、CLOSED:关闭状态

问题二: 在结束连接的过程中,为什么在收到服务器端的连接释放报文段之后,客户端还要继续等待2MSL(最长报文段寿命)之后才真正关闭TCP连接呢?

原因:需要保证服务器端收到了客户端的最后一条确认报文。假如这条报文丢失,服务器没有接收到确认报文,就会对连接释放报文进行超时重传,而此时客户端连接已关闭,无法做出响应,就造成了服务器端不停重传连接释放报文,而无法正常进入关闭状态的状况。而等待2MSL,就可以保证服务器端收到了最终确认;若服务器端没有收到,那么在2MSL之内客户端一定会收到服务器端的重传报文,此时客户端就会重传确认报文,并重置计时器。

百万年薪python之路 -- 网络通信原理的更多相关文章

  1. 百万年薪python之路 -- Socket

    Socket 1. 为什么学习socket 你自己现在完全可以写一些小程序了,但是前面的学习和练习,我们写的代码都是在自己的电脑上运行的,虽然我们学过了模块引入,文件引入import等等,我可以在程序 ...

  2. 百万年薪python之路 -- 面向对象之继承

    面向对象之继承 1.什么是面向对象的继承 继承(英语:inheritance)是面向对象软件技术当中的一个概念. 通俗易懂的理解是:子承父业,合法继承家产 专业的理解是:子类可以完全使用父类的方法和属 ...

  3. 百万年薪python之路 -- 模块二

    1. 序列化模块 什么是序列化呢? 序列化的本质就是将一种数据结构(如字典.列表)等转换成一个特殊的序列(字符串或者bytes)的过程就叫做序列化. 为什么要有序列化模块? 如果你写入文件中的字符串是 ...

  4. 百万年薪python之路 -- 模块

    1.自定义模块 1.1.1 模块是什么? 模块就是文件,存放一堆常用的函数和变量的程序文件(.py)文件 1.1.2 为什么要使用模块? 1.避免写重复代码,从文件级别组织程序,更方便管理 2.可以多 ...

  5. 百万年薪python之路 -- 数据库初始

    一. 数据库初始 1. 为什么要有数据库? ​ 先来一个场景: ​ 假设现在你已经是某大型互联网公司的高级程序员,让你写一个火车票购票系统,来hold住十一期间全国的购票需求,你怎么写? 由于在同一时 ...

  6. 百万年薪python之路 -- 并发编程之 协程

    协程 一. 协程的引入 本节的主题是基于单线程来实现并发,即只用一个主线程(很明显可利用的cpu只有一个)情况下实现并发,为此我们需要先回顾下并发的本质:切换+保存状态 cpu正在运行一个任务,会在两 ...

  7. 百万年薪python之路 -- JS基础介绍及数据类型

    JS代码的引入 方式1: <script> alert('兽人永不为奴!') </script> 方式2:外部文件引入 src属性值为js文件路径 <script src ...

  8. 百万年薪python之路 -- 前端CSS样式

    CSS样式 控制高度和宽度 width宽度 height高度 块级标签能设置高度和宽度,而内联标签不能设置高度和宽度,内联标签的高度宽度由标签内部的内容来决定. 示例: <!DOCTYPE ht ...

  9. 百万年薪python之路 -- HTML基础

    一. Web标准 web标准: w3c:万维网联盟组织,用来制定web标准的机构(组织) web标准:制作网页遵循的规范 web标准规范的分类:结构标准.表现标准.行为标准. 结构:html.表示:c ...

随机推荐

  1. (一)spring 高级装配-@Profile

    1.环境与profile 示例:数据库配置 a:通过@Bean注解,通过EmbeddedDatabaseBuilder创建数据源 @Bean(destroyMethod="shutdown& ...

  2. 大白话讲解 Java程序的运行机制和JVM

    据我们所知,Java程序是跨平台的.那么Java是如何实现跨平台的呢?看完下面几句话就会恍然大悟! 1.为什么Java语言既是编译型语言又是解释型语言呢? 答:运行Java程序,首先需要经过编译,编译 ...

  3. 给idea设置默认使用的JDK

    一,前言 在文章给idea设置默认使用的maven配置中我给我的idea设置了默认使用的maven,并且在setting.xml文件中,设置了本地的maven仓库,这样就不会使用maven默认在C盘的 ...

  4. 修改tomcat 使用的JVM的内存

    一,前言 在文章让tomcat使用指定JDK中,我让tomcat成功使用了我指定的JDK1.8,而不是环境变量中配置的JDK10.本篇文章我们就来探讨一下怎么设置tomcat使用的JVM的内存. 为什 ...

  5. JS中3种风格的For循环有什么异同?

    转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具.解决方案和服务,赋能开发者.原文出处:https://blog.bitsrc.io/3-flavors-of-the-for-loop-i ...

  6. Robot Framework自定义测试库的作用域的理解

    robot framework中,强大的测试库api支持,用户可根据实际需求定义测试库,导入后可使用自定义库中相应的关键字. 当自定义的测试库是类库,则需要考虑一个问题:类实例.用类实现的库可以有内部 ...

  7. layui 上传图片回显并点击放大实现

    1.页面代码布局 <div class="layui-col-xs12 form-group"> <div class="layui-col-xs6&q ...

  8. 基 B/S 平台的机房监控云平台-U位篇

    前言 机柜 U 位管理是一项突破性创新技术--继承了 RFID 标签(电子标签)的优点的同时,完全解决了 RFID 技术(非接触式的自动识别技术)在机房 U 位资产监控场应用景中的四大缺陷,采用工业互 ...

  9. Kafka 学习笔记之 Topic日志清理

    Topic日志清理 server.properties: log.cleanup.policy=delete (默认) 1. 按时间维度进行Kafka日志清理 log.retention.hours= ...

  10. uniapp 与C# 加解密

    1 uni-app操作 (1) 打开HBuilderX的视图->显示终端 cd 切换到你项目的根目录 执行命令 npm install crypto-js 安装成功后你的项目根目录会生成node ...