Python教程

python网络编程回顾

本文主要是介绍python网络编程回顾,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

网络架构

单机架构

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

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数据部分
发送端主机发送端MacFF:FF:FF:FF:FF:FF172.16.10.10/24172.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数据部分
发送端主机发送端MacFF:FF:FF:FF:FF:FF172.16.10.10/24172.16.10.11/24数据
-源Mac目标Mac源IP目标IP数据部分
发送端主机发送端MacFF:FF:FF:FF:FF:FF172.16.10.10/24网关地址数据
-源Mac目标Mac源IP目标IP数据部分
发送端主机发送端Mac网关Mac172.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 等。

常用的端口号

应用程序FTPTFTPTELNETSMTPDNSHTTPSSHMYSQL
熟知端口21,206923255380223306
传输层协议TCPUDPTCPTCPUDPTCPTCPTCP

三次握手

120-TCP三次握手和四次挥手-三次握手.gif
  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网络编程回顾的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!