Python之网络编程

文章目录

  • 一、网络编程
    • 概念
    • 网络模型
    • 软件开发架构
    • 网络编程前言
    • OSI七层协议
      • OSI七层协议之物理层(物理连接层)
      • OSI七层协议之数据链路层
      • OSI七层协议之网络层
      • OSI七层之传输层
        • 传输层之TCP与UDP协议
        • 三次握手连接细致说明
        • 四次挥手断连接细致说明
      • OSI七层之应用层
    • 七层模型传输数据过程
      • 1.OSI 七层模型数据传输过程如下
      • 2.数据包传输过程如下
      • 3.IP层传输单位是IP分组,属于点到点的传输;TCP层传输单位是TCP段,属于端到端的传输
      • 4.七层OSI

一、网络编程

概念

网络编程从大的方面说就是对信息的发送到接收,中间传输为为物理线路的作用

网络模型

	网络模型:描述网络的结构原理和工作原理
		OSI参考模型:七层
		Internet网络模型:四层
		网络协议:指定层上进行数据交换的规则。
		Internet的网络层协议:IP协议;DNS协议(辅助协议)
		Internet的传输层协议:TCP协议;UDP协议。

软件开发架构

	# 什么是软件开发架构?
	编写项目前需要遵循代码层面上的规范
    代码运行的流程 环节以及步骤
1.C/S架构
	Client(客户端)----------网络传输--------->Server(服务端)
    '''
    我们使用计算机下载下来的一个个app本质上就是各大互联网公司的客户端软件
    通过这些客户端软件我们就可以体验到各个互联网公司给我们提供的服务
    	eg:
    		下载淘宝客户端 打开 体验淘宝服务端提供的购物服务
    		下载抖音客户端 打开 体验抖音服务端提供的视频服务
    ps:一般情况下客户端与服务端交互需要互联网 但是有些不需要(因为客户端和服务端都有一台计算机上)
    
    
    客户端:即将要去消费的客人
    服务端:给客人提供服务的店
    
    
    作为服务端必备的多个条件:
    	1.24小时不间断对外提供服务
    	2.固定的地址(固定的软件或者url)
    	3.能够服务多个客人(高并发)
    '''
    
2.B/S架构
	Browser(浏览器)---------网络传输--------->Server(服务端)
    '''
    浏览器可以充当所有服务器的客户端
    
    ps:B/S架构本质还是C/S架构
    '''
    
# 当下我们使用的软件架构模式是二者兼有!
'''很多的公司开发的软件都是小程序(微信的),为了转换更容易一些'''


'''
C/S架构:
	优势:不同公司的客户端由不同公司独立开发,可以高度定制化客户端功能
	劣势:需要下载才能使用
	
B/S架构:
	优势:不用下载直接访问
	劣势:无法高度定制化,并且需要遵守很多规则
'''


'''
架构总结
ATM:三层架构
本质也属于软件开发结构的范畴

软件设计的大方向>>>:统一接口
	# 微信小程序
    # 支付宝小程序
'''

网络编程前言

	1.什么是网络编程:
	基于网络编写代码,能够实现数据的远程交互
2.学习网络编程的目的
	本质上是为了解决计算机之间的远程数据交互
	# 能够开发CS架构的软件
3.网络编程的起源
	'''
	最早起于美工军事领域,最早想实现计算机之间数据的交互只能硬盘拷贝,之后发明了网络编程
	'''
4.网络编程必备条件
	数据的远程交互
    	1.早期的滚筒电话		电话线
        2.早期的大屁股电脑		网线
        3.笔记本电脑、移动电话   网卡
        
    ps:实现数据的远程交互必备的基础条件:物理连接介质,否则无法相通

OSI七层协议

1.什么是网络,什么是上网?
#上网其实就是上传和下载数据的过程
   背景:
   	在早期的时候,其实世界范围内的计算机是不能够互相通信的,当时的计算机只是在'局域网'中通信,
   	后来呢,世界范围内的计算机也通信了,在广域网中通信,这就是互联网
       
	网络的组成:物理链接设备(路由器、交换器、网线等)+计算机界的英语(互联网通信协议)


2.互联网那个通信协议(OSI七层协议)
'''互联网的本质就是一系列的网络协议,这个协议就叫OSI协议(一系列协议),
按照功能不同,分工不同,人为的分层七层。实际上这个七层是不存在的。
没有这七层的概念,只是人为的划分而已。区分出来的目的只是让你明白哪一层是干什么用的。'''

'''OSI七层协议:规定了所有的计算机在远程数据交互的时候必须经过相同的处理流程、
在制造过程中必须拥有相同的功能硬件'''


'''协议是干什么的,协议就是标准'''
七层划分为:应用层、表示层、会话层、传输层、网络层、数据链路层、物理层。
# 常见的事整合的五层、四层
五层划分为:应用层、应用层、传输层、网络层、数据链路层、物理层。
四层划分为:应用层、传输层、网络层、网络接口层
'''
接收网络消息:数据由下往上传递
发送网络消息:数据由上往下传递
'''

Python之网络编程_第1张图片

OSI七层协议之物理层(物理连接层)

'主要用于确保计算机之间的物理连接介质 接收数据(bytes类型、二进制)'

它是专门用来发送高低电频的,其实就是01二进制
'''
物理层单纯的发送电频是没有任何的意义的,因为不知道发送的电频什么意思,
所以需要对发送的电频进行分组,但是呢物理层做不了分组
'''

OSI七层协议之数据链路层

	'它就是专门用来对物理层发送过来的数据进行分组的,该层使用的以太网协议Ethernet'
1.规定了点信号的分组方式
	一组电信号构成一个数据报,又叫做帧,或者叫数据帧,数据帧的组成:报头head和数据date两部分
    	head包含(固定18个字节)
        	发送者/源地址,6个字节
            接收者/目标地址,6个字节
            数据类型,6个字节
    # 数据报的具体内容:head长度+date长度=最短64字节,最长1518自己,超过最大限制就分片发送
2.以太网协议
	规定了计算机在出厂的时候都必须有一块网卡 网卡上有一串数字
    该数字相当于是计算机的身份证号码是独一无二的
    该数字的特征:1216进制数据(482进制)6位厂商编号,后6位流水线号
    该数字也称为:以太网地址/MAC地址
#以太网协议规定,每一个接入互联网的设备都必须要有一个网卡,发送端和接收端的地址便是指网卡地址,Mac地址
# 通过一个Mac地址能不能确定局域网中得唯一一台计算机?能确定

OSI七层协议之网络层

'''
该层使用的是IP协议,规定每一个接入互联网的计算机都必须要有一个IP地址,
网络层中的数据我们称为是数据包
'''

IP协议
	规定了所有接入互联网的计算机都必须有一个IP地址,类似于身份证号
    	mac地址是物理地址可以看成永远无法修改
        IP地址是动态分配的 不同的场所IP是不同的
IP地址特征:
	IPV4:点分十进制
        0.0.0.0--------------->255.255.255.255
        随着世界的发展,目前大多数用的IPV4,同时能上网的人越来越多了,已经快消耗殆尽了IPV4地址
        # 192.168开头的地址基本上都是局域网中得ip地址
        公网ip:需要购买的,如:阿里云、腾讯云,人家或给你一个公网ip地址,固定的,不会变。
        内网ip:192.168开头地址基本上都是局域网中得ip地址
        
    IPV6:能够给地球上每一粒沙分一个IP地址
    	IP地址可以跨局域网传输
       	'''
       	如何查看自己的ip地址:windows:cmd----ipconfig。linux(MacOS):ifconfig
       	'''
        # 其实通过一个IP地址它是可以定位唯一一个局域网
        'IP+Mac地址是可以确定世界范围内的唯一一台计算机'
        但是我们知道,现在只需要一个IP地址就能够确定唯一一台计算机,那是因为:arp协议的玩意儿,
        它能够通过你的IP地址计算出Mac地址,归根结底还是:IP+Mac地址
        
        '''补充一个ARP协议'''
        # ARP协议:能够根据IP地址动态解析到一个MAC地址
        谁在使用某个IP地址,我们就可以根据IP地址动态解析到使用者的MAC地址
        
        记忆:本地回环地址:127.0.0.1(你自己的电脑)
        192.168.1.252	127.0.0.1 localhost(这两个有时候会有区别)

OSI七层之传输层

	PORT协议(端口协议)
	用来标识一台计算机上面的某一个应用程序
    范围:0-65535
    特征:动态分配(类似号码牌那种)
    	1.0-1024之间的端口号都是系统自己使用的
        2.1024-8000之间的端口号一般是常用软件的端口号
        	MySQL:3306
            Django:8000
            flask:5000
        3.我们自己开发的软件,端口一般选择8000之后的到655535
# 注意如果我们使用8000之前的端口号,启动很多软件,可能会出现端口号会撞号的情况。
同一个端口号只能表示一个正在运行的应用程序,端口号不能够冲突,但是软件一旦关闭,
就会释放出来占用的端口号,别的应用软件就能够使用了

常用软件的端口号:
	应用程序	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

URL:统一资源定位符(网址)
	网址本质是有IP和PORT组合成的!!!
IP+PORT:能够定位全世界独一无二的一台计算机上面的某一个应用程序
域名解析:将网址解析成IP+PORT
我们之所以不能直接使用IP+PORT的原因是太难记了,所以发明了域名(网址)

IP:PORT	实际使用冒号链接	114.55.205.139:80

'''
实际上,是为了方便阅读,我们才将IP:PORT与字符网址对应起来,
我们通过DNS服务就可以将域名转换为IP:PORT的格式,从而访问到网络那一端的程序。
'''
传输层之TCP与UDP协议
TCP与UDP都是用来规定通信方式的
	通信的时候可以随心所欲的聊,也可以遵循一些协议符合要求的聊
    eg:
        随性所欲的聊:文字、图片、视频等各种
        遵循协议:开头带尊称、首行空两格、只使用官方话
ps:不遵循上述协议也可以通信。只不过过遵循了更合规合法合理

eg:
    1.一台拥有IP地址的主机可以提供很多服务:Web服务、FTP服务、SMTP服务等,可以通过IP地址实现
    2.IP地址与网络服务的关系是一对多的关系,实际上是通过'IP地址+端口号'来区分不同的服务的
    

'TCP协议(重要)'
	通信时,它会发送一个通信请求这个请求必须被送到一个确切的地址,在双方‘握手’之后,
	TCP将在两个应用程序之间建立一个全双工(full-duplex)
	这个全双工的通信将占用两个计算机之间的通信线路,直到它被一方或者双方关闭为止。
    
    '''客户端要给服务端发送消息,肯定要建立链接'''
    1.TCP协议也称为可靠协议(数据不容易丢失)
        造成数据不容易丢失的原因不是因为有双向通道,而是因为有反馈机制,给对方发消息之后会保留一个副本,
        直到对方回应消息收到了才会删除,否则会在一定的时间内反复发送
    2.洪水攻击
        同一时间有大量的客户请求建立链接,会导致服务端一致处于SYN_RCVD状态
    3.服务端如何区分客户端建立链接的请求
        可以对请求做唯一的标识ip
        
        
TCP协议它也称为是可靠协议(三次握手),流式协议(发送数据分多次发送)如:100M数据	10M 10次
三次握手--------->建立连接
四次挥手--------->断开连接
	# 四次不能合并为三次
    	因为中间需要确认消息是否发完(TIME_WAIT)
'''
三次握手和四次挥手也可以看成是小情侣谈恋爱的过程
	三次握手:表白在一起
	四次挥手:决裂要分手
'''

'''
一定是客户端先给服务端发送消息,然后服务端给客户端坐返回信息
# 有个个例,服务端可以先给客户端发送消息,需要使用websocket协议,一般用在即时通信软件
客服系统、微信、QQ等都是

客户端可以是多个,服务端只有一个
'''


'UDP协议'
	也称之为数据报协议、不可靠协议
    早期的QQ使用的是纯生的(没有加任何额外功能)UDP协议
    现在的QQ自己添加了很多技术和功能
    #使用UDP的原因就是因为很简单、快捷、粗暴 只要指定对方的地址就可以发消息了
    

eg:
    三次握手和四次挥手可以看作商业的合作过程
    三次握手:双方需求和要求基本一致,促成合作
    四次挥手:一方满意,另一方不满意,最终因为条件不统一,最终导致合作失败
#通俗点:TCP我们可以看成是打电话:双方你侬我侬
		UDP我们可以看成是发短信:只要发了就行 不管对方看不看

Python之网络编程_第2张图片

三次握手连接细致说明
	TCP是因特网中的传输层协议,使用三次握手协议建立连接。当主动方发出SYN连接请求后,
	等待对方回答SYN+ACK[1],并最终对对方的 SYN 执行 ACK 确认。
	这种建立连接的方法可以防止产生错误的连接。[1] 
	
TCP三次握手的过程如下:
	客户端发送SYN(SEQ=x)报文给服务器端,进入SYN_SEND状态。
服务器端收到SYN报文,回应一个SYN (SEQ=y)ACK(ACK=x+1)报文,进入SYN_RECV状态。
客户端收到服务器端的SYN报文,回应一个ACK(ACK=y+1)报文,进入Established状态。
三次握手完成,TCP客户端和服务器端成功地建立连接,可以开始传输数据了。
	四次来回,中间是可以并为三次的
如下图

Python之网络编程_第3张图片

四次挥手断连接细致说明
	四次不能合并为三次
	因为中间需要确认消息是否发完(time_wait)
	建立一个连接需要三次握手,而终止一个连接要经过四次握手,这是由TCP的半关闭(half-close)造成的。

1.某个应用进程首先调用close,称该端执行“主动关闭”(active close)。该端的TCP于是发送一个FIN分节,
表示数据发送完毕。

2.接收到这个FIN的对端执行 “被动关闭”(passive close),这个FIN由TCP确认。
注意:FIN的接收也作为一个文件结束符(end-of-file)传递给接收端应用进程,
放在已排队等候该应用进程接收的任何其他数据之后,因为,
FIN的接收意味着接收端应用进程在相应连接上再无额外数据可接收。

3.一段时间后,接收到这个文件结束符的应用进程将调用close关闭它的套接字。这导致它的TCP也发送一个FIN。

4.接收这个最终FIN的原发送端TCP(即执行主动关闭的那一端)确认这个FIN。
既然每个方向都需要一个FIN和一个ACK,因此通常需要4个分节。
注意:
	(1) “通常”是指,某些情况下,步骤1的FIN随数据一起发送,另外,
	步骤2和步骤3发送的分节都出自执行被动关闭那一端,有可能被合并成一个分节。
	(2) 在步骤2与步骤3之间,从执行被动关闭一端到执行主动关闭一端流动数据是可能的,
	这称为“半关闭”(half-close)。
	(3) 当一个Unix进程无论自愿地(调用exit或从main函数返回)还是非自愿地(收到一个终止本进程的信号)
	终止时,所有打开的描述符都被关闭,这也导致仍然打开的任何TCP连接上也发出一个FIN。
无论是客户还是服务器,任何一端都可以执行主动关闭。通常情况是,客户执行主动关闭,但是某些协议,
例如,HTTP/1.0却由服务器执行主动关闭。

Python之网络编程_第4张图片

OSI七层之应用层

	Application App
	该层就是离用户最近的一层,比如微信、pycharm等都是一个个应用,它们都在应用层
    应用层相当于是程序员自己写的应用程序 里面的协议非常多
    
1.客户端:你想使用什么协议都行,自己开发的软件,协议自己选择
2.浏览器:你就不能够随便使用了,就要安装浏览器规定的协议使用,而浏览器使用的协议恰好是http协议
3.http协议
	HTTP协议	HTTPS协议
    https://www.baidu.com
    协议://域名/v1/v2?参数
    https://www.baidu.com/s?wd=%E7%BE%8E%E5%B3
    
    
'''
HTTP协议
	1.是明文传输数据
	2.不安全
HTTPS协议
	1.是密文传输数据
	2.安全
	https = http+ssl证书(它是需要申请的,国际机构、公钥、私钥等)
	nginx服务器:配置文件,需要在配置文件中配置一些东西,就能够把你的http改成https
'''

域名解析:
	DNS服务器它就是用来解析域名的,域名的本质其实就是IP地址,域名比IP地址好记,
	最终还是需要把域名解析成IP地址
        baidu.com				110.242.68.66
   域名的解析过程:
		1. 首先会先从本地开始解析hosts文件
    	2. 会去对应平台的域名关系表中取查询

七层模型传输数据过程

1.OSI 七层模型数据传输过程如下

Python之网络编程_第5张图片

2.数据包传输过程如下

3.IP层传输单位是IP分组,属于点到点的传输;TCP层传输单位是TCP段,属于端到端的传输

Python之网络编程_第6张图片

4.七层OSI

你可能感兴趣的:(网络编程,python)