2 python网络基础及协议udp/tcp
2.1 虚拟环境
- 目标
- 虚拟环境的作用;
- 创建虚拟环境;
- 能够进入/退出虚拟环境;
- 为pycharm配置虚拟环境;
- 虚拟环境常用命令
- 注意!
ctrl+H
可以显示出隐藏文件和文件夹
2.2 网络通信概述
-
网络概念(简化)
- 一些相互连接、以共享资源为目的的计算机的集合。
-
网络编程
- 让不同的电脑上的软件能够进行数据传递;
-
学习网络的目的
- 能够编写基于网络通信的软件;
- 能够编写基于网络通信的软件;
2.2.1 IP地址
-
IP地址的概念
- IP地址是指**互联网协议地址(Internet Protocol Address,网际协议地址),**是IP Address的缩写,IP地址是IP协议提供的一种统一的地址格式。
- 每台联网的电脑PC都需要有IP地址;
-
IP地址的作用
- IP地址用来在网络中表示一台电脑,即网络设备往网络中的每台计算机分配的一个唯一标识,比如192.169.1.1,在本地局域网上是唯一的;
-
IP地址特点
- 地址的前三段一般在一个网络中都保持不变,而最后一段改变
- 表示范围:xxx.xxx.xxx.0-xxx.xxx.xxx.255
- **xxx.xxx.xxx前三段是网络号,最后一段0-255是主机号;**0和255不可以用;
- 地址的前三段一般在一个网络中都保持不变,而最后一段改变
-
IP地址分类
- IP地址通常指的是:IPV4(IP协议的第4个版本)
IP地址 = 网络号+主机号
-
私有IP
- 国际规定有一部分IP地址用于局域网使用,属于私网IP不在公网中使用,范围是:
- IPv4和IPv6
IPv4
,是互联网协议(Inter Protocal,IP)的第四版,第一个被广泛使用,构成现今互联网技术及时的协议。采用“点分十进制”表示(如:192.168.1.100),一共有2^32-1个,估算约为42.9亿个,除去一些特用的IP和一些不能用的IP,剩下可用的不到40亿,IPv4发展至今,最大问题是网络地址严重不足;IPv6
,是**Internet Protocol Version 6**
的缩写,IPv6是IETF(互联网工程任务组,Internet Engineering Task Force)设计的用于替代现行版本IP协议(IPv4)的下一代IP协议。采用“点分十六进制:表示(如2031:0000:1F1F:0000:0000:0100:11A0:ADDF),而IPv6中IP地址的长度为128,即有2^128-1个地址;
2.2.2 IP地址查看(Ifconfig、ping)
-
目标
- 使用**
ifconfig
**查看主机的IP地址; - 使用**
ping
**命令查看网络的连通性;
- 使用**
-
虚拟机网卡设置
-
ifconfig
-
ping
2.2.3 端口
-
目标
- 端口分为知名端口、动态端口两类;
- 80、21、20知名端口的作用;
-
端口概念
- 端口认为是设备与外界通讯交流的出口,端口可分为虚拟端口和物理端口,其中虚拟端口指计算机内部或交换机路由器内的端口,不可见。例如计算机的80端口、21端口、23端口等。
- 端口像一个房子的门,出入这间房子的必经之路;
-
端口号
- 端口是通过端口号来标记的,端口号只有整数,范围是从0到65535;
-
端口分配
- 1、知名端口(Well Known Ports)
- 1、知名端口(Well Known Ports)
-
一般情况下如果一个程序使用知名端口需要root权限;
-
2、动态端口(Dynamic Ports)
- **动态端口范围是从1024到65535;**称为动态端口,是因为一般不固定分配某种服务,而是动态分配;
- **动态分配:**当一个系统程序或应用程序需要网络通信时,向主机申请一个端口,主机从可用的端口号中分配一个供它使用;当程序关闭时,同时就释放了所占用的端口号;
-
查看端口
netstat -an
查看端口状态
-
小结
IP地址+端口号
区分不同主机的不同服务;- 需要注意的是, 端⼝并不是⼀⼀对应的。 ⽐如你的电脑作为客户机访问⼀台WWW服务器时,WWW服务器使⽤“80”端⼝与你的电脑通信, 但你的电脑则可能使⽤ “3457” 这样的端⼝。
2.2.4 网络传输方式
-
目标
- 面向连接和面向无连接的区别;
- UDP网络传输方式的特点;
-
网络传输方式
-
(1)面向有连接型;
- 发送数据前,需要在收发主机之间建立一条通信线路,因此在面向有连接方式,必须在通信传输前后,专门建立和断开连接;
- TCP提供面向连接的通信服务,只有在确认通信对端存在时才会收发数据,可以控制通信流量的浪费。TCP提供了数据传输时的各种控制功能,丢包时可以进行重发控制,可以将次序乱掉的分包进行顺序控制;
-
(2)面向无连接型;
- 不要求建立和断开连接,发送端可任意时刻自由发送数据,接收端也不止何时何地会收到数据,因此,面向无连接,接收端需要时常确认是否收到了数据;
- 面向无连接通信不需要确认对端是否存在,即使接收端不存在或者无法接收数据,发送端也能将数据发送出去;
-
TCP/UDP两者区别
-
2.3 Socket
- 目标:
- socket创建步骤;
- 创建UDP socket套接字创建时需要指定socket.SOCK_DGRAM
- 什么是socket?
- socket(简称“套接字”),是支持TCP/UDP的网络通信的基本操作单元,可以看做是不同主机之间的进程进行双向通信的端点,通信双方的一种约定,用套接字中的相关函数来完成通信过程。
- socket(简称“套接字”),是支持TCP/UDP的网络通信的基本操作单元,可以看做是不同主机之间的进程进行双向通信的端点,通信双方的一种约定,用套接字中的相关函数来完成通信过程。
- 创建socket
- **socket起源于Unix,**而Unix/Linux基本哲学之一就是“一切皆文件/对象”,对于文件用【打开】【读写】【关闭】模式来操作。socket就是该模式的一个实现,socket一种特殊的文件,一些socket类就是对其进行操作(读写IO,打开,关闭)
- **socket起源于Unix,**而Unix/Linux基本哲学之一就是“一切皆文件/对象”,对于文件用【打开】【读写】【关闭】模式来操作。socket就是该模式的一个实现,socket一种特殊的文件,一些socket类就是对其进行操作(读写IO,打开,关闭)
- Socket对象(内建方法)
2.4 UDP
2.4.1 udp网络程序-发送数据
- 目标
- 使用**
socket
的sendto
**方法能够发送数据; - 使用**
encode
**方法能够对待发送数据进行编码;
- 使用**
- 实现步骤
- 1、导入模块socket;
- 2、创建socket套接字;
- 3、发送数据;
- 4、关闭套接字;
- 核心方法
2.4.2 udp网络程序-接收数据
- 目标
- 使用**
socket
的recvfrom
方法能够接收数据;** - 使用**
decode
方法能够对接收到的数据解码;**
- 使用**
- 核心方法
2.4.3 python3编码转换
-
目标
- 使用**
encode()
和decode()
**对字符串编码和解码; - 编解码失败如何解决;
- 使用**
-
编码和解码
- 文本总是**
Unicode
,由str
类型进行表示,二进制数据使用bytes
进行表示,网络中数据的传输是以二进制(字节码)方式来进行,所以我们需要对Unicode字符串内容进行编码和解码才能达到数据传输的目的;**
- 文本总是**
-
GBK国标格式,包括汉字;UTF-8是万国码;
2.4.4 udp端口绑定(发送端)bind
-
目标
- 使用
bind
方法在发送端给套接字绑定端口;
- 使用
-
udp网络程序,会变的端口号
-
udp绑定信息
- 绑定信息
- 一般情况下,一台电脑上运行的网络程序有很多,为了不与其他网络程序占用同一个端口号,在编程中,udp的端口号一般不绑定;
- 但是,如果是一个是服务端程序,需要绑定;
- 核心方法
- 绑定信息
- 注意**!!!绑定的是自己的发送端的IP地址与端口,不是接收的别人的!!!**
2.4.5 udp端口绑定(接收端)bind
-
目标
- 使用
bind
方法在接收端给套接字绑定端口
- 使用
-
实现思路
- 使用
bind()
在发送数据前绑定发送端主机的IP地址和端口
- 使用
-
注意:始终都是在控制绑定自己的端口号!!
2.4.6 udp广播
- 目标
- 知道广播的概念;
- 使用UDP群发广播消息;
- 使用UDP方式发送广播
- **广播地址(Broadcast Address)**是专门用于同时向网络中的所有工作站进行发送的一个地址,在使用TCP/IP协议的网络中,主机标识段host ID为全1的IP地址为广播地址;
- IP地址网络字段和主机字段全为1就是地址:
255.255.255.255
2.4.7 案例:udp聊天器
2.5 TCP
2.5.1 tcp简介
-
目标
- 清楚tcp创建连接,数据传送,终止连接的三个步骤;
- tcp可靠传输的原因;
- tcp与udp的区别;
-
1、TCP介绍
- TCP协议,传输控制协议(
Transmission Control Protocol,TCP
)是一种!!面向连接的、可靠的、基于字节流!!
的传输层通信协议,由IETF的RFC 793定义; - TCP通信需要经过创建连接、数据传送、终止连接三个步骤;
- TCP通信模型中,在通信开始前,一定要先建立相关的连接!
- TCP协议,传输控制协议(
-
2、TCP特点
- (1)面向连接
- 通信双方必须先建立连接才能进行数据的传输,双方都必须为该连接分配必要的系统内核资源,以管理连接的状态和连接上的传输;
- 双方间的数据都可以通过这一个连接进行;
- 完成数据交换后,双方必须断开连接,释放系统资源;
- 连接一对一,TCP不适用于广播的应用程序(使用UDP);
- (2)可靠传输
- a、TCP采用发送应答机制
- TCP发送的每个报文段都必须得到接收方的应答才认为TCP报文段传输成功;
- b、超时重传
- 发送端发出一个报文段之后就启动定时器,如果定时时间内咩有收到应答就重新发送这个报文段,TCP为了保证不发生丢包,每个包一个序号,同时序号保证传送到接收端实体的包按序接收。然后接收端实体已成功收到的包发回一个相应地确认(ACK);如果发送端实体在合理的往返时延(RTT)内未收到确认,那么对应的数据包被假设为已丢失被进行重传。
- c、错误校验(错误校验、去除重复)
- TCP用一个校验和函数来检验数据是否有错误,在发送和接收时都要计算校验和;
- d、流量控制和阻塞管理
- 流量控制用来避免主机发送的过快而是接收方来不及完全接收;
- a、TCP采用发送应答机制
- (1)面向连接
-
3、TCP与UDP不同点
- 面向连接(确认有创建三方交握,连接已创建才作传输);
- 有序数据传输;
- 重发丢失的数据包;
- 舍弃重复的数据包;
- 无差错的数据传输;
- 阻塞/流量控制;
-
4、流程对比
-
5、模型对比
- udp通信模型
- 在通信开始前,不需要建立相关的链接,只需要发送数据即可,类似于“写信”
- 在通信开始前,不需要建立相关的链接,只需要发送数据即可,类似于“写信”
- udp通信模型
-
TCP通信模型
- 在通信开始前,一定要先建立相关的链接,才能发送数据,类似于"打电话"
- 在通信开始前,一定要先建立相关的链接,才能发送数据,类似于"打电话"
-
!!TCP通信严格区分客户端,服务端!!
2.5.2 tcp网络程序—客户端
-
目标
- 编写tcp网络客户端程序,进行数据发送;
-
1、tcp客户端构建流程
- tcp客户端要比服务器端简单很多,tcp和服务端建立连接后,直接发送数据;
- tcp客户端要比服务器端简单很多,tcp和服务端建立连接后,直接发送数据;
-
2、实现步骤
- (1)导入socket模块;
- (2)创建socket套接字;
- (3)建立tcp连接,与服务端建立连接;
- (4)开始发送数据(到服务端);
- (5)关闭socket套接字;
-
3、核心方法
-
4、代码实现
2.5.3 tcp服务器端
-
目标
- 理解listen中的数值含义;
- 编写tcp网络服务端程序,进行数据接收;
-
1、tcp服务器
- tcp服务器:和客户端建立连接后,接收/发送数据给客户端;
- tcp服务器:和客户端建立连接后,接收/发送数据给客户端;
-
2、实现步骤
- (1)创建socket套接字;
- (2)bind绑定ip和port;
- (3)listen使套接字变为可以被动链接;
- (4)accept等待客户端的连接;
- (5)recv/send接收发送数据;
-
3、参考代码
-
在listen(128)之后,进入监听模式,服务器的套接字进入被动状态,不可以发送数据,等待客户端的连接发送数据;在有新的客户端连接后,会创建一个新的套接字,专门这针对于这一个客户端;
-
返回两个数据,新的套接字和地址,可以和多个客户端创建不同的套接字;
2.5.4 tcp服务端增强
-
目标
- 接收一个客户端发来的多条信息;
- 接收多个客户端的连接;
-
1、接收客户端发来的多条信息
-
2、允许多个客户端连接
-
3、代码实现
-
连接的话,需要多线程操作,以后会将
-
注意:目前代码必须等待第一个客户端断开后,第二个客户端才能有机会连接!
2.5.5 文件下载器
- 1、功能分析
- 2、代码实现
- 客户端代码
- 客户端代码
- 服务端代码
- 增强版:try捕获错误,except处理错误,加一个while True实现多客户端连接;
2.5.6 tcp的3次握手
- 目标
- TCP3次握手是用于建立连接
- TCP3次握手是用于建立连接
- 分析:如果没有第三个包?
- 从服务端来看,会一直发送第二个包,服务器性能下降,造成资源浪费;
- 客户端没有进行确认,可能会开始重新建立连接,重新发送SYN请求;
- 三次握手是指TCP建立连接的时候发送的三个数据包
2.5.7 tcp的4次挥手
- 目标
- TCP4次挥手是用于断开连接;
- TCP四次挥手是指在断开连接时发送的4个数据包,确保断开连接;
- 为什么等待2MSL?
- 防止第4个包发送失败,此时服务器会重新发送第4个包;需要主动发起一方等待;一般是30s到2分钟;
- 之前总是端口被占用,虽然关闭了端口8080,但是要等2MSL;
- 可以通过设置套接字地址重用
*
2.6 浏览器访问服务器的过程
2.6.1 IP地址与域名
- 1、IP地址
- IP全称(Internet Protocal Address,互联网协议地址,网络地址)。IP地址与身份证一样,具有唯一性;
- 网络不分国界,全球范围所有主机,都一个IP地址,不能相同;
- IP地址分为IPv4和IPv6,IP地址由32位二进制构成,分成四段,每段8位二进制;
- “点分十进制”表示,每一段取值范围0-255;
- IP全称(Internet Protocal Address,互联网协议地址,网络地址)。IP地址与身份证一样,具有唯一性;
特殊的IP地址:127.0.0.1,每台电脑都有,是电脑内部的IP地址;
127.0.0.1代表自己的内部IP地址,都是自己访问自己,外网无法访问;
- 2、域名
- 域名概念
- Domain Name,DN,一个网址,特殊的名字;**域名是IP地址的外号,**方便记忆;
- 域名构成
- 由字母、数字、中划线(-),长度不超过255个字符;
- 例如
www.sina.com.cn`` www.baidu.com ``www.hao123.com
其中, .com称为顶级域名
- 常见的顶级域名
- 域名概念
2.6.2 DNS及浏览器请求过程
-
目标
- 知道浏览器访问网站的大致流程
-
1、DNS服务器
- DNS(Domain Name System域名解析系统),主要用于**将域名转为对应的IP地址,**DNS是一台运行在互联网上服务器;
- DNS服务器可以看做一个通讯录,通过域名找IP地址;
-
电脑之间不能识别域名,只识别IP地址
-
2、本地DNS
- hosts是本地的DNS,DNS就是IP地址与域名的对应关系表;
- hosts文件是隐藏文件、系统文件,没有拓展名的文件;
-
3、浏览器请求的基本流程如下:
2.7 HTTP协议
- 目标
- 知道HTTP协议为了实现浏览器和服务器之间的通信;
- 了解HTTP协议组成和作用;
2.7.1 HTTP协议概述
-
1、HTTP协议简介
- 超文本传输协议(HTTP,HyperText Transfer Protocol)是互联网应用最为广泛的一种网络协议。所有的WWW文件都必须遵守这个标准,设计HTTP最初的目的是为了提供一种发布和接收HTML页面的方法;
- HTTP是一个客户端和服务器端请求和应答的标准(TCP)。客户端是终端用户,服务器端是网站。通过使用Web浏览器,网络爬虫或者其他工具,客户端发起一个到服务器上指定端口(默认端口80)的HTTP请求;
- 超文本传输协议是一种应用层协议;
-
2、应用层
-
3、请求request-响应response模式
-
4、小结
2.7.2 HTTP协议格式查看
-
目标
- 使用谷歌浏览器查看HTTP协议格式
-
1、使用谷歌/火狐浏览器开发者工具分析通信过程和格式
- 在web应用中,服务器把网页传给浏览器,是将网页的HTML代码发送给浏览器,浏览器解析显示出来,而浏览器和服务器之前的传输应用层协议就是HTTP;所以:
- HTML是一种用来定义网页的文本;
- HTTP是用来在网络上传输HTML文本的协议,用于浏览器和服务器的通信;
- HTTP协议报文格式查看
- windows和Linux平台F12调出开发者工具;
- MAC选择视图->开发者工具;
- 在web应用中,服务器把网页传给浏览器,是将网页的HTML代码发送给浏览器,浏览器解析显示出来,而浏览器和服务器之前的传输应用层协议就是HTTP;所以:
2.7.3 HTTP请求报文协议分析
-
目标
- 知道请求报文包含请求行、请求头、空行、请求体
-
1、请求协议的格式
-
http请求包含四个部分:
- 1、请求行(request-line);
- 2、请求头(request-header);
- 3、空行;
- 4、请求数据(request-content),叫做请求内容或者请求主体;
-
注意:
- GET方式,只有请求行、请求头、空行;
- POST方式,请求行+请求头+空行+请求主体;
-
(1)请求行
-
请求行分为三个部分:请求方式+请求路径+协议版本;
- 其中,GET==请求方式,/model/list_father.php==请求路径,HTTP/1.1==协议版本号;
-
注意:
- 1、请求行需要单独占一行,用来说明当前请求的最基本的信息;
- 2、请求路径不包括域名;
- 3、HTTP协议以前是1.0版本,现在是1.1版本;
-
(2)请求头
- **请求头==**所有当前需要用到的协议项的集合;
- **协议项==**浏览器在请求服务器的时候实现告诉服务器的一些信息或者事先的约定;
- 常见的请求头:
-
(3)空行
- 用来分离请求头和请求数据,请求头到此结束!!的标志!!
-
(4)请求数据
- 只有post方式提交的时候,才有请求数据!
- 只有post方式提交的时候,才有请求数据!
-
2、请求报文格式总结
-
3、通过网络调试助手模拟TCP服务器,接收request请求
-
4、小结
- 请求报文格式
- (1)请求行
- 请求方式 资源路径 协议及版本
- (2)请求头
- 协议项
- 协议名:协议值
- (3)请求空行
- 分割请求头和请求的主体
- (4)请求主体
- 浏览器要发给服务端的内容
- GET方式没有请求体,POST方式有请求体
- (1)请求行
- 请求报文格式
2.7.4 HTTP响应报文协议分析
-
目标
- 响应报文包含响应行、响应头、空行、响应体;
- 响应状态码404表示网址没有找到;
-
1、响应协议:
-
**定义:**服务器向浏览器做出响应(反馈数据)时候的协议
-
组成:响应行(状态行)+响应头+空行+响应主体(响应数据)
- (1)响应行:
- 第一行HTTP/1.1 200 OK叫做响应行,分为3部分:协议版本号 状态码 状态描述
- (1)响应行:
-
(2)响应头
- 协议名:值
- server:服务器主机信息
-
(3)空行
- 分割响应头与响应主体,响应头到此结束!!
-
(4)响应主体
- 服务器反馈给浏览器的数据!
-
响应报文格式总结
-
小结—响应协议
-
(1)响应行
-
协议及版本 状态码 状态描述
常见状态码:
200 一切正常
404 客户端请求的资源不存在
302 重定向
-
-
(2)响应头
-
协议项构成
协议名:协议值
-
-
(3)响应空行
-
分隔响应头和响应主体
-
-
(4)响应主体
-
服务器响应给客户端的数据
-
-
2.7.5 长连接和短连接
-
目标
- 知道长连接和短连接的区别
-
在HTTP/1.0中,默认使用短连接,浏览器和服务器每进行一次HTTP操作,就建立一次连接,但任务结束就中断连接,如果客户端浏览器访问的某个HTML或其他类型的Web页中包含有其他的Web资源,如js文件、图像文件、CSS文件等;当浏览器每遇到这一个Web资源,都会建立一个HTTP会话;
- 2、TCP短连接
- 3、TCP长连接通信过程
- 4、TCP长/短连接的优点和缺点
- 小结!!
2.8 附录
2.8.1 SOCKET设置