- 网络编程
- 多任务编程(进程线程)
- 服务器开发训练
- mongodb
- 正则表达式
- 第二阶段项目训练
网络编程
网络起源 (了解)
网络目的 : 数据的传输
ISO : 国际标准化组织
OSI七层模型 ----》 网络通信的标准化流程
应用层 : 提供用户服务,具体的内容由特定程序规定
表示层 : 数据的压缩优化加密
会话层 : 建立应用连接,选择传输层服务
传输层 : 提供数据传输服务,流量控制
网络层 : 路由选择,网络互连
链路层 : 提供链路交换,具体的消息的发送
物理层 : 物理硬件,接口 网卡的规定
osi模型优点 : 将功能分开,降低网络传输中的耦合度每一部分完成自己的功能,开发更加清晰专一
四层模型
应用层 : 应用层 表示层 会话层
传输层 : 传输层
网络层 : 网络层
物理链路层: 链路层 物理层
五层模型(tcp/ip模型)
应用层 : 应用层 表示层 会话层
传输层 : 传输层
网络层 : 网络层
链路层 : 链路层
物理层 : 物理层
要求 : 能够按顺序说出七层模型 五层和四层模型
知道每一层是什么作用
对网络消息传输流程有基本了解
协议 :网络通信中,各方必须遵守的规定。包括建立什么样的连接,消息结构等。
应用层 : TFTP HTTP DNS SMTP
传输层 : TCP UDP
网络层 : IP
物理层 : IEEE
网络相关概念
主机 : host 表示一台计算机
本地使用 : ‘localhost’
‘’
‘127.0.0.1’
网络使用 : ‘0.0.0.0’
‘172.60.50.60’
获取计算机名:
In [2]: socket.gethostname()
Out[2]: ‘tedu’
通过计算机名获取地址:
In [3]: socket.gethostbyname(‘tedu’)
Out[3]: ‘127.0.1.1’
IP地址
在网络上确定一台主机的地址
IPv4 :点分十进制 比如 192.168.1.72 0–255
32位二级制表示
IPv6 : 128位二进制
windows cmd.exe 窗口 --》 ipconfig
linux 查看本机地址 ifconfig
网络连接测试
ping 172.60.50.60
特殊IP
127.0.0.1 本地测试IP
0.0.0.0 使用局域网内可用的IP
192.168.1.0 表示当前网段
192.168.1.1 通常是网络节点设备的IP (网关)
192.168.1.255 广播地址
通过域名获取服务器信息
socket.gethostbyaddr(‘www.baidu.com’)
(‘127.0.0.1’, [], [‘119.75.213.61’])
主机 主机别名 主机IP
将点分十进制IP转换为二进制
In [11]: socket.inet_aton(‘192.168.1.2’)
Out[11]: b’\xc0\xa8\x01\x02’
将二进制转换为点分十进制IP
In [12]: socket.inet_ntoa(b’\xc0\xa8\x01\x02’)
Out[12]: ‘192.168.1.2’
功能 : 同上面两个完全相同。只是可以选择地址类型
inet_pton(socket.AF_INET,‘192.168.1.2’)
inet_ntop()
域名: 网络服务器地址的网络名称
端口号 : 端口号是网络地址的一部分,在一个系统中 每个网络应用都会有一个端口号相对应。用来在接收消息时确定由谁来接收
范围 : 1–65535
1–255 一些通用的众所周知程序占用
256-1023 系统应用端口
1024 — 65535 自用 >10000
获取应用端口:
In [16]: socket.getservbyname(‘mysql’)
Out[16]: 3306
字节序
数据在内存中的存储解析方式,不同操作系统可能不同
网络字节序 : 不同的操作系统在消息收发时均按照该标准操作。
传输层服务
面向连接的传输服务 ----》 tcp协议
传输特征:
可靠的数据传输
可靠性指数据传输中 无失序 无差错 无丢失 无重复
所有消息传输前一定会建立连接,传输后一定会断开连接
三次握手: 在进行面向连接的数据传输前进行传输连接的过程
1. 客户端向服务器发送连接请求(问是否可以连接)
2. 服务器接收到连接请求进行确认,返回报文
3. 客户端收到回复,进行连接建立
四次挥手: 在进行面向连接的数据传输时,断开连接的过程
1. 主动方发送报文 告知被动方要断开连接
2. 被动方返回报文,告知收到请求,准备断开
3. 被动方再次发送报文给主动方,告知准备完毕可以断开
4. 主动方发送报文进行断开
应用情况 :适用于传输较大的内容或文件,网络情况良好,需要保证传输可靠性的情况
比如 : 聊天信息,文件的上传下载,邮件传输
网页获取
面向无连接的传输服务 —》 udp协议
传输特点:
不保证可靠的数据传输
没有连接过程
数据的收发都比较自由,不会受另一端制约
适用情况: 网络情况较差,对传输可靠情形要求不高。需要提升传输效率的情况
比如 : 网络视频,群聊,发送广播
问题总结:
1.osi模型问题
2.三次握手四次挥手问题
3.tcp和udp的区别
socket套接字编程
目的 : 通过编程语言提供的函数接口进行组合,更简单的完成基于 tcp
或者udp通信的网路编程
套接字 : 完成上述目标的一种编程方法
套接字分类
流式套接字(SOCK_STREAM): 传输层基于tcp的协议进行通信
数据报套接字 (SOCK_DGRAM):传输层基于udp协议进行通信
底层套接字 (SOCK_RAM):访问底层协议的套接字
TCP服务端
import socket
-
创建套接字
socket.socket(socket_family = AF_INET,
socket_type = SOCK_STREAM,
proto = 0)
功能 : 创建一个套接字
参数 : socket_family : 选择地址族类型 AF_INET(使用IPv4)
socket_type :套接字类型 SOCK_STREAM 流式
SOCK_DGRAM 数据报
proto :子协议类型,没有子协议选择 0 (底层套接字)
返回值 : 套接字对象 -
绑定地址(IP 端口号)
sockfd.bind()
功能 : 绑定地址
参数 : 一个元组包含两项
第一项为IP第二项为端口号
(‘172.60.50.50’,8888) -
将套接字设置可监听
sockfd.listen(n)
功能 : 将套接字设置为监听套接字
参数 : n是一个正整数 表示监听等待队列的大小
- 等待队列:
- 等待接收连接请求
connfd,addr = sockfd.accept()
功能: 阻塞等待处理客户端连接
返回值 : 第一个 : 一个新的套接字用来和客户端通 信
第二个 : 连接的客户端的地址
- 阻塞函数:程序运行到阻塞函数的位置,如果某种期待条件没有达成
则暂停继续运行。当条件达成后会结束阻塞继续运行。
- 收发消息
data = connfd.recv(buffersize)
功能 : 流式套接字接收消息
参数 : 一次最多接收多大的消息 字节
返回值 : 返回接收到的内容
recv()是阻塞函数
e.g.
data = connfd.recv(1024).decode()
n = connfd.send(data)
功能 : 流式套接字发送消息
参数 : 要发送的内容 要求bytes格式
返回值 : 返回实际发送的字节数
e.g.
connfd.send(data.encode())
- 关闭套接字
close()
功能:关闭套接字 tcp套接字连接断开
#tcp_server.py
from socket import *
1.创建套接字
sockfd = socket(AF_INET,SOCK_STREAM)
2.绑定地址
sockfd.bind((‘172.60.50.50’,9999))
3.设置监听
sockfd.listen(5)
print(“Waiting for connect…”)
4.阻塞等待客户端请求
connfd,addr = sockfd.accept() # 没有连接客服端,阻塞在accept()处,等待客服端连接
print(“Connect from”,addr) # 打印地址
5.接收消息
data = connfd.recv(1024) # 客服端没发送消息阻塞在recv()
print(“Receive message:”,data.decode())
6.发送消息
n = connfd.send(‘I love China’.encode())
n = connfd.send(b’I love China’)
print(“发送了%d个字节”%n)
7.关闭套接字
connfd.close()
sockfd.close()
测试:telnet 172.60.50.50 9999
Waiting for connect…
Connect from (‘127.0.0.1’, 40168)
Receive message: hello
发送了12个字节
tcp 客户端
-
创建套接字
socket() -
请求连接
connect()
功能: 发起连接请求
参数: 是一个元组,表示服务器的地址 -
消息收发
recv() send()
recv()是阻塞函数,要和send()函数相互配合使用 -
关闭套接字
close()
#tcp_client.py
from socket import *
1.创建套接字
sockfd = socket(AF_INET,SOCK_STREAM)
2.发起连接 地址:服务端地址
sockfd.connect((‘172.60.50.50’,9999))
data = input(‘发送>>’)
3.将内容变为bytes格式发送
sockfd.send(data.encode())
data = sockfd.recv(1024).decode()
print(“收到消息:”,data)
4.关闭套接字
sockfd.close()
发送>>hello
收到消息: I love China
作业 :
- 口述 什么是七层模型,tcp/ip模型
三次握手和四次挥手的过程
tcp协议的传输和udp协议的传输有何区别 - 将tcp程序改写为一个通过循环可连续收发消息的程序
#tcp_server.py
from socket import *
#创建套接字
sockfd = socket(AF_INET,SOCK_STREAM)
#绑定地址
sockfd.bind((‘127.0.0.1’,9999))
#设置监听
sockfd.listen(5)
while True:
print(“Waiting for connect…”)
connfd,addr = sockfd.accept()
print(“Connect from”,addr)
while True:
data = connfd.recv(5)
if not data:
break
print(“Receive message:”,data.decode())
connfd.send(b’I love China’)
connfd.close()
sockfd.close()
tarena@tedu:~$ python3 01_tcp_server.py
Waiting for connect…
Connect from (‘127.0.0.1’, 40178)
Receive message: hello
Receive message: nihao
#tcp_client.py
from socket import *
#创建套接字
sockfd = socket(AF_INET,SOCK_STREAM)
#发起连接 地址:服务端地址
sockfd.connect((‘127.0.0.1’,9999))
while True:
data = input(‘发送>>’)
if not data:
break
#将内容变为bytes格式发送
sockfd.send(data.encode())
data = sockfd.recv(1024).decode()
print(“收到消息:”,data)
sockfd.close()
tarena@tedu:~$ python3 01_tcp_client.py 127.0.0.1 9999
发送>>hello
收到消息: I love China
发送>>nihao
收到消息: I love China
发送>>