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. ssh免密码登陆(集群多台机器之间免密码登陆)

    1. 首先在配置hosts文件(每台机器都要) 进入root权限 vi /etc/hosts 添加每台机器的ip + 主机名,例如: 172.18.23.201 hadoop1 172.18.23.1 ...

  2. pathlib模块

    一.pathlib库官方定义 pathlib 是Python内置库,Python 文档给它的定义是 Object-oriented filesystem paths(面向对象的文件系统路径).path ...

  3. IDEA加密算法(含所需jar包(commons-codec-1.11.jar ,bcprov-jdk15on-160.jar))

    软件设计上机实验IDEA算法: import javax.crypto.Cipher; import javax.crypto.KeyGenerator; import javax.crypto.Se ...

  4. nginx 配置语法

    一.语法规则: location [=|~|~*|^~] /uri/ { … } = 开头表示精确匹配 ^~ 开头表示uri以某个常规字符串开头,理解为匹配 url路径即可.nginx不对url做编码 ...

  5. 【SQL server初级】SQL SERVER Transactional Replication中添加新表如何不初始化整个快照

    在SQL SERVER的复制(Replication)中,有可能出现由于业务需求变更,需要新增一张表或一些表到已有的复制(发布订阅)当中,这种需求应该是很正常,也很常见的.但是在已有的复制(发布订阅) ...

  6. String 用法 简单API

    明天天梯赛选拔,怕不是STl忘到姥姥家去了,赶紧复习一下 构造str string s = "fuckyouRMA"; string s1(s, 2); de(s1); strin ...

  7. eShopOnContainers学习系列(二):数据库连接健康检查

    项目里使用数据库的时候,我们有时候需要知道数据库当前的健康状态,特别是当数据库连接不上的时候能够立马获悉.eShopOnContainers里存在着大量的服务健康.连接健康的检查,数据库连接是其中之一 ...

  8. VS2010连接Oracle配置

    直接看上图.EZ连接和TNS连接.TNS连接要修改tnsnames.tns文件内部的host为服务器地址

  9. asp.net开源流程引擎API开发调用接口大全-工作流引擎设计

    关键词: 工作流引擎 BPM系统 接口调用 工作流快速开发平台  工作流流设计  业务流程管理   asp.net 开源工作流 一.程序调用开发接口二.   接口说明 所谓的驰骋工作流引擎的接口,在B ...

  10. Linux内存描述之内存页面page–Linux内存管理(四)

    服务器体系与共享存储器架构 日期 内核版本 架构 作者 GitHub CSDN 2016-06-14 Linux-4.7 X86 & arm gatieme LinuxDeviceDriver ...