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'

    #### 计算机通信方式

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

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

    网络层:

    ​ 通过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 数据

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

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

      如果在同一网段通过 IP以及ARP协议获取到对方的mac地址,然后在通信.
    
      如果不是在同一网段: 一般得不到mac
      **主机ID为全0时表示网络ID,全1时表示广播地址** 
    
    - #### 网络层:
    
        IP协议:
    
        ip地址:四段点分十进制  192.168.14.141
    
        取值范围: 0~255.0~255.0~255.0~255
    
        子网掩码: C类子网掩码: 255.255.255.0
    
        ip地址 + 子网掩码  按位与运算 计算出是否在同一局域网(子网,网段)
    
        ```python
        计算172.16.10.1 与 172.16.10.128
    
        172.16.10.1:10101100.00010000.00001010.00000001
    
        255.255.255.0: 11111111.11111111.11111111.00000000
    
        从属于的局域网: 172.16.10.0
    
        172.16.10.128:10101100.00010000.00001010.10000000
    
        255.255.255.0: 11111111.11111111.11111111.00000000
    
        从属于的局域网: 172.16.10.0
    
        172.16.10.1 ~172.16.10.255
    
        C类子网掩码 一个网段最多可以承载多个IP地址?
    
        172.16.10.0 全网地址  被占用
    
        172.16.10.255 广播地址 被占用.
    
        所以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. Java线程池Executor&ThreadPool

    java自1.5版本之后,提供线程池,供开发人员快捷方便的创建自己的多线程任务.下面简单的线程池的方法及说明. 1.Executor 线程池的顶级接口.定义了方法execute(Runnable),该 ...

  2. (java实现)单向循环链表

    什么是单向循环链表 单向循环链表基本与单向链表相同,唯一的区别就是单向循环链表的尾节点指向的不是null,而是头节点(注意:不是头指针). 因此,单向循环链表的任何节点的下一部分都不存在NULL值. ...

  3. Android类似日历的翻转控件

    最近写了个翻转面板的控件拿出来与大家分享一下,类似日历的那种,写的比较简单有需要的可以直接拿去用.直接上效果图吧,代码我放在百度云了,有问题的话直接回复就好呢,大家一起交流下. http://pan. ...

  4. Flask基础(05)-->路由的基本定义

    # 导入Flask from flask import Flask # 创建Flask的应用程序 app = Flask(__name__) # http://127.0.0.1:5000/123或者 ...

  5. jQuery常用方法(四)-选择器

    JQuery Selectors 方法说明 基本选择器 $("#myDiv") 匹配唯一的具有此id值的元素 $("div") 匹配指定名称的所有元素 $(&q ...

  6. OKR群:为什么说每个程序员都应该有自己的个人OKR

    个人OKR OKR,即Object and Key Result,是IT大厂最近争相推广的目标管理工具,例如腾讯.百度和头条(字节跳动). 其实,OKR并不是仅仅只适用于公司和部门内部,我们个人也可以 ...

  7. 3. Git与TortoiseGit基本操作

    1. GitHub操作 本节先简单介绍 git 的使用与操作, 然后再介绍 TortoiseGit 的使用与操作. 先看看SVN的操作吧, 最常见的是 检出(Check out ...), 更新 (U ...

  8. JavaScript 类型 检测

    前言 ECMAScript中有5种数据类型,分别为Number,Boolean,Null,Undifined和String,以及一种复杂的数据类型Object(由名值对组成,是这门语言所有对象的基础类 ...

  9. python Django中的cookie和session

    目录 Cookie 1.1获取Cookie 1.2设置Cookie Session 1.数据库Session 2.缓存Session 3.文件Session 4.缓存+数据库Session Cooki ...

  10. Spring MVC学习 ( RESTful)

    是一套规则,不同的系统之间(Vue java Python C#  PHP)具体四种不同类型的HTTP 请求分别表示四种基本操作(CRUD) GET :查询(R) POST:添加(C) PUT:修改( ...