网络架构

单机架构

例子:植物大战僵尸,红警等

CS架构


例子:QQ,大型网游等

  1. 客户端:用户安装的软件;
  2. 服务端:统一管理数据库的主机中的软件就叫做服务端,再后来服务端不只是管理数据,外加处理业务逻辑。

CS架构要求

  1. 用户安装客户端;产商部署服务端
  2. 每个用户需要独立安装软件、服务端升级也要每个用户升级

面试题:数据放在服务端和客户端的利与弊?

  1. 服务端统一处理有更好的安全性和稳定性而且升级比较容易,不过服务器负担就增加了。
  2. 客户端将负担分配到每个用户,从而可以节约服务器资源,安全性和稳定性可能会有一定的问题,但是升级比较麻烦,每个安装的客户端程序都需要升级,另外为了节省网络资源,通过网络传输的数据应该尽量减少!

BS架构


例子:京东,淘宝等

  1. 统一客户,用户电脑中的浏览器,访问同种类的网站,具体业务的处理根据相应协议和标准提供通用的服务器程序,在不同的服务器处理。

架构

  1. OSI主要用于教学(万恶的大学),在编程的时候用的都是TCP/IP。

  2. TCP/IP的对应关系,就像在淘宝购物,快递(网络接口层),告诉卖家地址(网络层)、快递送货(运输层)、收到货物拆包使用(应用层)。

  3. 对于广泛使用的东西就需要制定相应的标准,就像大公司有很多制度来规范做事情的流程。由于网络传输应用非常广泛,但是规矩不是强制性的,所以叫做协议而不是标准,TCP/IP参考模型也可以看做是一种协议。

  4. BS结构中TCP/IP模型中的网络接口层没有响应的协议,网络层是IP协议,传输层是TCP协议,应用层是HTTP协议,另外还是用到了DNS结构,而且在HTTP上层还有相应。

  5. 基于BS结构下的程序就要求解决速度问题,而速度问题的核心就是解决海量数据操作和高并发问题,网站复杂架构就是从这两个问题演变出来的。

区别

互联网的组成


互联网的拓扑结构非常复杂 ,并且在地理位置上覆盖了全球,从工作方式上看,可以划分为两大块:

  1. 边缘部分:这部分由所有连接在互联网上的主机组成。这部分是用户直接使用的,用来进行通信和资源共享。
  2. 核心部分:由大量网络和连接这些网络的路由器组成。这部分用来为边缘部分提供服务。

互联网的硬件、软件两部分

当你打开浏览器,输入一个网址比如 <www.taobao.com> ,几秒钟就看到淘宝首页。这个一个简单的动作,整个互联网到底发送了什么?下面是一个简化的过程描述:

  1. 浏览器检查是否有缓存过域名对应IP地址
  2. 如果没有缓存的域名对应的IP,请求域名服务器解析成对应的IP地址
  3. 浏览器建立Socket连接,根据http协议组装http报文,通过tcp/ip协议发送报文。
  4. tcp/ip协议会通过网络层网卡(wifi或网线)发射信号到家庭里面的路由器,家里的路由器发送信号到电讯厂商的交换机(中间可能会经过很多次的路由)找到目标服务器,服务器也许托管在IDC机房,也许在阿里云VPS,也许在国外。
  5. 机房里面会有大型交换机、机柜、专业的精密空调,你要访问的那台IP的服务器就在其中某个机柜中。
  6. 在服务器接收到信号后,会根据tcp/ip协议解出http协议头。根据请求决定需要返回的数据
  7. 在服务器端实际上根据业务还有很复杂的逻辑;服务器后面还有许多台服务器,到底指定那台服务器来处理请求,需要负载均衡设备来完成
    要返回的数据是在缓存里面、还是在静态文件中、还是在数据库(如MySQL,Oracle)中
  8. 浏览器根据返回的数据,发现有一些静态资源(如CSS,JS,图片等)时有重新发起新的http请求,而这些静态资源文件可能在CDN网络中,请求静态资源的整个过程需需要从第一步重新再走一遍,并且很可能中间经过的交换机,路由过程是不一样的。

硬件组成

  1. 终端设备:电脑(pc,笔记本),移动设备(手机,pad),智能电视,智能家居
  2. 网络设备:网卡,网线,水晶头,路由器,家用交换机,防火墙设备,中继器,桥接器
  3. 主机设备:IDC机房,机柜,精密空调,负载均衡器,服务器,工作站,小型机、大型机

软件组成

  1. 网络协议类,比如互联网的基础协议tcp/ip协议
  2. 操作系统类,比如window,linux,macOS,android,iOS
  3. 平台中间件类:比如webServer,Nginx,Apache,Tomcat,MySQL等
  4. 应用类:比如浏览器,微信,邮箱,游戏等等。

OSI七层协议

  1. 互联网的本质就是一系列的网络协议,这个协议就叫OSI协议(一系列协议),按照功能不同,分工不同,人为的分层七层。实际上这个七层是不存在的。没有这七层的概念,只是人为的划分而已。

  2. 每一层都运行不同的协议,协议就是标准。

  3. 七层划分为:应用层、表示层、会话层、传输层、网络层、数据链路层、物理层。

  4. 五层划分为:应用层、传输层、网络层、数据链路层、物理层。

  5. 四层划分为:应用层、传输层、网络层、网络接口层。

物理层

物理层功能:主要是基于电器特性发送高低电压(电信号),高电压对应数字1,低电压对应数字0

数据链路层

  1. 数据链路层的功能:定义了电信号的分组方式<以太网协议>
  2. ethernet规定:一组电信号构成一个数据报,叫做’帧’,每一数据帧分成:报头head和数据data两部分
  3. ethernet规定接入internet的设备都必须具备网卡,发送端和接收端的地址便是指网卡的地址,即Mac地址
  4. 计算机底层,只要在一个局域网,都是靠广播的方式。
  5. 其实基于广播的这种通信就可以实现全世界通信了,你吼一声,如果全世界是一个局域网,全世界的计算机肯定可以听得见,从理论上似乎行得通,但如果全世界的计算机都在吼,你想一想,这是不是一个灾难。因此,全世界不能是一个局域网,于是就有了网络层。

网络层

网络层功能:引入一套新的地址用来区分不同的广播域/子网,这套地址即网络地址

  1. Mac地址是用来标识你在局域网的某个位置,IP地址是用来标识你在哪个局域网。
  2. 你要跨网络发包要知道对方的IP地址,计算机在发包前,会判断你在哪个局域网,对方在哪个局域网,如果在一个局域网,基于Mac地址的广播发包就OK了;如果不在一个教室,即跨网络发包,那么就会把你的包交给网关来转发。
  3. Mac地址及IP地址唯一标识了你在互联网中的位置。

局域网中怎么获取对方的Mac地址:

- 源Mac 目标Mac 源IP 目标IP 数据部分
发送端主机 发送端Mac FF:FF:FF:FF:FF:FF 172.16.10.10/24 172.16.10.11/24 数据
  1. 肯定要知道对方的IP地址,这是最基本的。
  2. 自己的IP可以轻松获得,自己的Mac也轻松获取,目标Mac为12个F,我们叫广播地址,表达的意思是我想要获取这个目标IP地址172.16.10.11的机器的Mac地址。
  3. Mac为12个F代表的是一种功能,这个功能就是获取对方的Mac地址,计算机的Mac永远不可能是12个F。
  4. 一嗓子吼出去了,所有人开始解包,只有IP地址是172.16.10.11的这个人才会返回他的Mac地址,其他人全部丢弃。发回来源Mac改成自己的Mac地址,同时把目标的Mac地址放在数据部分。

跨网络获取对方的Mac地址:

通过IP地址区分,计算机运算判断出不在同一个局域网内,目标IP就变成了网关的IP了。网关的IP在计算机上配死了,可以轻松获取。

- 源Mac 目标Mac 源IP 目标IP 数据部分
发送端主机 发送端Mac FF:FF:FF:FF:FF:FF 172.16.10.10/24 172.16.10.11/24 数据
- 源Mac 目标Mac 源IP 目标IP 数据部分
发送端主机 发送端Mac FF:FF:FF:FF:FF:FF 172.16.10.10/24 网关地址 数据
- 源Mac 目标Mac 源IP 目标IP 数据部分
发送端主机 发送端Mac 网关Mac 172.16.10.10/24 飞哥的IP 数据

IP协议详解

  1. 规定网络地址的协议叫IP协议,它定义的地址称之为IP地址,广泛采用的v4版本即IPv4,它规定网络地址由32位2进制表示
  2. 网络部分:标识子网
    主机部分:标识主机
    注意:单纯的IP地址段只是标识了IP地址的种类,从网络部分或主机部分都无法辨识一个IP所处的子网

子网掩码详解

  1. ”子网掩码”,就是表示子网络特征的一个参数。它在形式上等同于IP地址,也是一个32位二进制数字,它的网络部分全部为1,主机部分全部为0。

  2. 比如,IP地址172.16.10.1,如果已知网络部分是前24位,主机部分是后8位,那么子网络掩码就是11111111.11111111.11111111.00000000,写成十进制就是255.255.255.0。

  3. 知道”子网掩码”后,我们就能判断,任意两个IP地址是否处在同一个子网络。方法是将两个IP地址与子网掩码分别进行AND运算(两个数位都为1,运算结果为1,否则为0),然后比较结果是否相同,如果是的话,就表明它们在同一个子网络中,否则就不是。

  4. 总结一下,IP协议的作用主要有两个,一个是为每一台计算机分配IP地址,另一个是确定哪些地址在同一个子网络。

ARP协议详解

arp协议功能:广播的方式发送数据包,获取目标主机的Mac地址

传输层

传输层功能:建立端口到端口的通信

  1. 端口范围0-65535,0-1023为系统占用端口
  2. 有了Mac地址+IP地址+端口,就能确定世界上独一无二的一台计算机上的应用程序

TCP协议

可靠传输,TCP数据包没有长度限制,理论上可以无限长,但是为了保证网络的效率,通常TCP数据包的长度不会超过IP数据包的长度,以确保单个TCP数据包不必再分割。

UDP协议

不可靠传输,”报头”部分一共只有8个字节,总长度不超过65,535字节,正好放进一个IP数据包。

应用层

应用层功能:规定应用程序的数据格式。

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

背景

通过OSI七层网络模型中IP层的介绍,我们知道网络层,可以实现两个主机之间的通信。但是这并不具体,因为,真正进行通信的实体是在主机中的进程,是一个主机中的一个进程与另外一个主机中的一个进程在交换数据。IP协议虽然能把数据报文送到目的主机,但是并没有交付给主机的具体应用进程。而端到端的通信才应该是应用进程之间的通信。

UDP,在传送数据前不需要先建立连接,远地的主机在收到UDP报文后也不需要给出任何确认。虽然UDP不提供可靠交付,但是正是因为这样,省去和很多的开销,使得它的速度比较快,比如一些对实时性要求较高的服务,就常常使用的是UDP。对应的应用层的协议主要有 DNS,TFTP,DHCP,SNMP,NFS 等。

TCP,提供面向连接的服务,在传送数据之前必须先建立连接,数据传送完成后要释放连接。因此TCP是一种可靠的的运输服务,但是正因为这样,不可避免的增加了许多的开销,比如确认,流量控制等。对应的应用层的协议主要有 SMTP,TELNET,HTTP,FTP 等。

常用的端口号

应用程序 FTP TFTP TELNET SMTP DNS HTTP SSH MYSQL
熟知端口 21,20 69 23 25 53 80 22 3306
传输层协议 TCP UDP TCP TCP UDP TCP TCP TCP

三次握手

  1. 最开始的时候客户端和服务器都是处于CLOSED状态。主动打开连接的为客户端,被动打开连接的是服务器。
  2. TCP服务器进程时刻准备接受客户进程的连接请求,此时服务器就进入了LISTEN(监听)状态;
  3. TCP客户进程向服务器发出连接请求报文,此时,TCP客户端进程进入了 SYN-SENT(同步已发送状态)状态。TCP规定,SYN报文段(SYN=1的报文段)不能携带数据,但需要消耗掉一个序号。
  4. TCP服务器收到请求报文后,如果同意连接,则发出确认报文。确认报文中应该 ACK=1,SYN=1,确认号是ack=x+1,同时也要为自己初始化一个序列号 seq=y,此时,TCP服务器进程进入了SYN-RCVD(同步收到)状态。这个报文也不能携带数据,但是同样要消耗一个序号。
  5. TCP客户进程收到确认后,还要向服务器给出确认。确认报文的ACK=1,ack=y+1,自己的序列号seq=x+1,此时,TCP连接建立,客户端进入ESTABLISHED(已建立连接)状态。TCP规定,ACK报文段可以携带数据,但是如果不携带数据则不消耗序号。
  6. 当服务器收到客户端的确认后也进入ESTABLISHED状态,此后双方就可以开始通信了。

TCP四次挥手

  1. 数据传输完毕后,双方都可释放连接。最开始的时候,客户端和服务器都是处于ESTABLISHED状态,然后客户端主动关闭,服务器被动关闭。

  2. 客户端进程发出连接释放报文,并且停止发送数据。释放数据报文首部,FIN=1,其序列号为seq=u(等于前面已经传送过来的数据的最后一个字节的序号加1),此时,客户端进入FIN-WAIT-1(终止等待1)状态。 TCP规定,FIN报文段即使不携带数据,也要消耗一个序号。

  3. 服务器收到连接释放报文,发出确认报文,ACK=1,ack=u+1,并且带上自己的序列号seq=v,此时,服务端就进入了CLOSE-WAIT(关闭等待)状态。TCP服务器通知高层的应用进程,客户端向服务器的方向就释放了,这时候处于半关闭状态,即客户端已经没有数据要发送了,但是服务器若发送数据,客户端依然要接受。这个状态还要持续一段时间,也就是整个CLOSE-WAIT状态持续的时间。

  4. 客户端收到服务器的确认请求后,此时,客户端就进入FIN-WAIT-2(终止等待2)状态,等待服务器发送连接释放报文(在这之前还需要接受服务器发送的最后的数据)。

  5. 服务器将最后的数据发送完毕后,就向客户端发送连接释放报文,FIN=1,ack=u+1,由于在半关闭状态,服务器很可能又发送了一些数据,假定此时的序列号为seq=w,此时,服务器就进入了LAST-ACK(最后确认)状态,等待客户端的确认。

  6. 客户端收到服务器的连接释放报文后,必须发出确认,ACK=1,ack=w+1,而自己的序列号是seq=u+1,此时,客户端就进入了TIME-WAIT(时间等待)状态。注意此时TCP连接还没有释放,必须经过2*MSL(最长报文段寿命)的时间后,才进入CLOSED状态。

  7. 服务器只要收到了客户端发出的确认,立即进入CLOSED状态。同样,撤销TCB后,就结束了这次的TCP连接。可以看到,服务器结束TCP连接的时间要比客户端早一些。

为什么客户端最后还要等待2MSL?

  1. MSL(Maximum Segment Lifetime),TCP允许不同的实现可以设置不同的MSL值。

  2. 保证客户端发送的最后一个ACK报文能够到达服务器,因为这个ACK报文可能丢失,站在服务器的角度看来,我已经发送了FIN+ACK报文请求断开了,客户端还没有给我回应,应该是我发送的请求断开报文它没有收到,于是服务器又会重新发送一次,而客户端就能在这个2MSL时间段内收到这个重传的报文,接着给出回应报文,并且会重启2MSL计时器。

  3. 防止类似与“三次握手”中提到了的“已经失效的连接请求报文段”出现在本连接中。客户端发送完最后一个确认报文后,在这个2MSL时间中,就可以使本连接持续的时间内所产生的所有报文段都从网络中消失。这样新的连接中不会出现旧连接的请求报文。

为什么建立连接是三次握手,关闭连接确是四次挥手呢?

建立连接的时候,服务器在LISTEN状态下,收到建立连接请求的SYN报文后,把ACK和SYN放在一个报文里发送给客户端。而关闭连接时,服务器收到对方的FIN报文时,仅仅表示对方不再发送数据了但是还能接收数据,而自己也未必全部数据都发送给对方了,所以己方可以立即关闭,也可以发送一些数据给对方后,再发送FIN报文给对方来表示同意现在关闭连接,因此,己方ACK和FIN一般都会分开发送,从而导致多了一次。

如果已经建立了连接,但是客户端突然出现故障了怎么办?

TCP还设有一个保活计时器,显然,客户端如果出现故障,服务器不能一直等下去,白白浪费资源。服务器每收到一次客户端的请求后都会重新复位这个计时器,时间通常是设置为2小时,若两小时还没有收到客户端的任何数据,服务器就会发送一个探测报文段,以后每隔75秒发送一次。若一连发送10个探测报文仍然没反应,服务器就认为客户端出了故障,接着就关闭连接。

socket

什么是Scoket

  1. socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,一组简单的接口就是全部,让Socket去组织数据,以符合指定的协议。

套接字工作流程

粘包问题

只有TCP有粘包现象,UDP永远不会粘包。

  1. 发送端可以是一K一K地发送数据,而接收端的应用程序可以两K两K地提走数据,当然也有可能一次提走3K或6K数据,或者一次只提走几个字节的数据。
  2. 也就是说,应用程序所看到的数据是一个整体,或说是一个流(stream),一条消息有多少字节对应用程序是不可见的,因此TCP协议是面向流的协议,这也是容易出现粘包问题的原因。而UDP是面向消息的协议,每个UDP段都是一条消息,应用程序必须以消息为单位提取数据,不能一次提取任意字节的数据,这一点和TCP是很不同的。

粘包的两种情况

  1. 发送端需要等缓冲区满才发送出去,造成粘包(发送数据时间间隔很短,数据了很小,会合到一起,产生粘包)(nagle算法规定,TCP协议会将数据量较小、时间间隔短的数据合并为一条发送给客户端)
  2. 接收方不及时接收缓冲区的包,造成多个包接收(客户端发送了一段数据,服务端只收了一小部分,服务端下次再收的时候还是从缓冲区拿上次遗留的数据,产生粘包)

为何TCP是可靠传输,udp是不可靠传输

  1. TCP在数据传输时,发送端先把数据发送到自己的缓存中,然后协议控制将缓存中的数据发往对端,对端返回一个ack=1,发送端则清理缓存中的数据,对端返回ack=0,则重新发送数据,所以TCP是可靠的
  2. udp发送数据,对端是不会返回确认信息的,因此不可靠

python网络编程回顾相关推荐

  1. 读书笔记 - -《Python网络编程》重点

    文章目录 一.前言 二.客户/服务器网络编程简介 三.UDP 3.1 端口号 3.2 套接字 3.3 UDP分组 3.4 小结 四.TCP 4.1 TCP工作原理 4.2 绑定接口 4.3 死锁 4. ...

  2. python 网络编程_Python网络编程(原书第2版)

    Python网络编程(原书第2版) 作者:(美)埃里克·周(Eric Chou) 著 出版日期:2019年06月 文件大小:54.50M 支持设备: ¥68.00 适用客户端: 言商书局 iPad/i ...

  3. python网络编程--socket简单实现

    python网络编程                                                                                           ...

  4. python网络编程-异常处理-异常捕获-抛出异常-断言-自定义异常-UDP通信-socketserver模块应用-03

    python网络编程-异常处理-异常捕获-抛出异常-断言-自定义异常-UDP通信-socketserver模块应用-03 参考文章: (1)python网络编程-异常处理-异常捕获-抛出异常-断言-自 ...

  5. python编程入门指南怎么样-学习python网络编程怎么入门

    第一部分底层网络学习 Python提供了访问底层操作系统Socket接口的全部方法,需要的时候这些接口可以提供灵活而强有力的功能. (1)基本客户端操作 在<python 网络编程基础>一 ...

  6. python编程实例下载-python网络编程之文件下载实例分析

    本文实例讲述了python网络编程之文件下载实现方法.分享给大家供大家参考.具体如下: 真是越看越喜欢python啊,想要了解它提供的http和ftp下载功能,原来是如此的简单. 1.相应模块 ftp ...

  7. python网络编程基础(线程与进程、并行与并发、同步与异步、阻塞与非阻塞、CPU密集型与IO密集型)...

    python网络编程基础(线程与进程.并行与并发.同步与异步.阻塞与非阻塞.CPU密集型与IO密集型) 目录 线程与进程并行与并发同步与异步阻塞与非阻塞CPU密集型与IO密集型 线程与进程 进程 前言 ...

  8. python网络编程案例_Python 网络编程_python网络编程基础_python高级编程

    Python 网络编程 Python 提供了两个级别访问的网络服务.: 低级别的网络服务支持基本的 Socket,它提供了标准的 BSD Sockets API,可以访问底层操作系统Socket接口的 ...

  9. python 网络编程 问题记录

    191223 python 网络编程 套接字的初使用 在本机配置服务端和客户端后,运行没问题:将服务端代码弄到另一台电脑上后启动,用原来的电脑去连接它,就连不上了,不知啥原因,是ip自动获取和指定ip ...

最新文章

  1. 我想成为一名计算机管理员英语作文,我想成为一名老师英语作文4篇
  2. 树言树语:谁动了苹果的弦
  3. 将PDF Expert设置为默认打开程序的操作步骤
  4. mysql查询索引数组_mysql-索引
  5. 高效背诵面试题、回答问题的技巧,求职者必看!
  6. 设计模式笔记二十一:状态模式
  7. php模板引擎smarty,[PHP]模板引擎Smarty介绍
  8. codevs 1388 砍树
  9. 有趣的算法(四)最通俗易懂的KMP算法解析
  10. windows phone笔记
  11. 多线程实战(一) : 交通灯管理系统
  12. 推荐5款优质的黑科技软件,好不好用你来判断
  13. Python实现汉字转换拼音
  14. java Io,读写文件拒绝访问
  15. Ran 0 tests in 0.000s
  16. true launch bar 和 editplus
  17. 从零开始教你用Unity做一个自动感应门
  18. 当极客 (Geek) 遇到呆瓜 (Nerd)
  19. 通达OA11.6复现
  20. Hook函数三步走(SetWindowsHookEx、UnhookWindowsHookEx、CallNextHookEx)

热门文章

  1. 小青蛙掉井c语言,关于青蛙的故事-跳出井底的蛙
  2. 微信小程序源码推荐 这个很实用 学习地址
  3. fgo服务器维护抽卡,fgo抽卡机制讲解 fgo卡池概率分析
  4. 令人喷饭的十二生肖欠揍问答
  5. 用python求素数的方法,以及一种算法优化
  6. 荣耀note10 鸿蒙,荣耀Note10曝光 三星W2019将采用双摄
  7. CGCTF 起名字真难
  8. border的所有用法
  9. 2021-06-15 MP3 MP5解码方案设计开发
  10. java compareto 中文_java中的compareto方法的详细介绍