网络---》进程线程---》web服务器
mongo ---》 regex --》 项目
互联网 --》 网络传输数据
ISO(国际标准化组织)---》网络体系结构标准 OSI模型
OSI 七层模型
应用层 :提供用户服务,具体内容由特定程序规定
表示层 :提供数据的压缩解压和加密等
会话层 :建立程序级的连接,决定使用什么样的传输服务
传输层 :提供合适的通信服务,流量控制
网络层 : 路由选择,网络互联,分组传输
链路层 : 提供链路交换,具体消息发送
物理层 : 物理硬件,接口
OSI 模型优点 : 将功能分开,降低网路传输中的耦合度,每一部分完成自己的功能,开发更加清晰。
高内聚 :使模块功能单一,不混杂。
低耦合 :模块之间尽量减少相互的关联和影响
四层、五层模型
四层模型
应用层 : 应用层 表示层 会话层
传输层 : 传输层
网络层 : 网络层
物理链路层 : 链路层 物理层
五层模型(TCP/IP模型)
应用层 : 应用层 表示层 会话层
传输层 : 传输层
网络层 : 网络层
链路层 : 链路层
物理层 :物理层
要求 : 能够顺序说出七层模型,知道如何对应四层五层模型,简单理解每一层的功能,能理解数据传输过程
什么是协议
网络协议 : 网络通信中,各方必须遵守的规定,包括建立什么连接,如何识别,消息结构等
应用层: TFTP HTTP SMTP DNS
传出层: TCP UDP
网络层: IP
网络概念
主机 : 计算机的名称
localhost
获取主机名
In [3]: socket.gethostname()
Out[3]: 'tedu'
通过主机名解析IP
In [4]: socket.gethostbyname('tedu')
Out[4]: '127.0.1.1'
In [5]: socket.gethostbyname('localhost')
Out[5]: '127.0.0.1'
IP
IPv4 : 192.168.1.2
点分是十进制:三个点分为四个部分,0--255
IPv6 : ip地址更多
127.0.0.1 : 本地测试ip
0.0.0.0 : 局域网可用IP
192.168.1.0 : 表示网段
192.168.1.1 : 网关
192.168.1.255 : 广播地址
2---254
ifconfig ping
In [6]: socket.gethostbyaddr('www.baidu.com')
Out[6]: ('127.0.0.1', [], ['119.75.216.20'])
主机名 别名 IP
将IP地址转换为二进制
In [7]: socket.inet_aton('192.168.1.2')
Out[7]: b'\xc0\xa8\x01\x02'
将二进制转换为点分十进制
In [8]: socket.inet_ntoa(b'\xc0\xa8\x01\x02')
Out[8]: '192.168.1.2'
inet_pton inet_ntop 功能同上,只是第一个参数用
socket.AF_IENT表示IPv4 socket.AF_INET6--->IPv6
端口号
端口号是地址的组成部分,在一个系统中区分应用层程序
1--65535 : 1--255 众所周知的端口 256---1023 系统端口
>10000 6666 7777 8888 9999
获取一个应用的端口
In [11]: socket.getservbyname('mysql')
Out[11]: 3306
子网掩码:和IP配合过滤网段
dns:域名解析
字节序
大端序:高字节存在低地址
小端序:低字节存在低地址
网络字节序 : 将字节序发送方式统一
传输层服务
tcp协议
面向连接 ----》 可靠的数据传输
三次握手
1.客户端向服务器发起连接请求(问是否可以连接)
2.服务器接收到请求后进行确认(允许连接)返回报文
3.客户端收到许可,建立连接
四次挥手
1.主动方发送报文告知被动方要断开连接
2.被动方返回报文,告知受到请求,准备断开
3.被动方发送报文给主动方告知准备就绪可以断开
4.主动方发送报文确定断开
可靠传输 : 无失序 无差错 无丢失 无重复
应用情况 : 适用于传输内容较大,网络情况好,需要提供准确传输的情况
比如 : 聊天信息 ,文件传输,邮件
udp协议
面向无连接的服务 ----》 不可靠
发送时由发送端自主进行,不考虑接收端
适用情况 : 网络较差,对传输准确性要求低,广播组播
比如 : 视频会议, 广播数据
套接字编程
套接字: 进行网络通信的一种手段 socket
流式套接字(SOCK_STREAM) :传输层基于tcp协议进行通信
数据报套接字(SOCK_DGRAM) :传输层基于udp协议进行通信
原始套接字(SOCK_RAW): 访问底层协议的套接字
TCP 服务端
from socket import *
1. 创建套接字
socket(socket_family=AF_INET,
socket_type=SOCK_STREAM,
proto = 0)
功能 : 创建套接字
参数 : socket_family:选择地址族种类 AF_INET (UNIX)
socket_type : 套接字类型SOCK_STREAM 流式
SOCK_DGRAM 数据报
proto :子协议类型默认为0
返回值 : 返回创建的套接字
2. 绑定 IP 和端口号
sockfd.bind()
功能 : 绑定IP和端口
参数 : 是一个元组 ,第一项是字符串形式的IP
第二项是端口号
(‘192.168.1.2’,8888)
3. 让套接字具有监听功能
sockfd.listen(n)
功能 : 使套接字变为监听套接字,同时创建监听队列
参数 : n 监听队列大小
4. 等待客户端连接
sockfd.accept()
功能 : 阻塞等待客户端连接
返回值 : 第一个:返回一个新的套接字用来和客户端通信
第二个:返回连接的客户端的地址
5. 消息的收发
recv(buffer)
功能 : 接收消息
参数 : 一次接收消息的大小 字节
返回值: 接收到的内容
send(data)
功能: 发送消息
参数: 发送的内容 (byte)
返回值 : 发送了多少个字节
* 当没有接收端的时候send操作会导致 broken pipe
6. 关闭套接字
close()
功能 : 关闭套接字
****************************************
创建一个tcp服务端
from socket import *
sockfd = socket(AF_INET,SOCK_STREAM,0)
sockfd.bind(('127.0.0.1',8888))
sockfd.listen(5)
while True:
print("waiting for connect....")
connfd,addr = sockfd.accept()
print("connect from",addr)
while True:
data = connfd.recv(1024)
if not data:
break
print(data.decode())
connfd.send('来,确认下眼神'.encode())
connfd.close()
sockfd.close()
****************************************
tcp客户端流程
1.创建流式套接字
2.发起连接请求
connect()
功能:发起连接
参数 : 一个元组 第一个元素 : 服务器的IP
第二个元素 : 服务器的port
3.收发消息
4.关闭套接字
********************************************
创建一个tcp客户端
from socket import *
sockfd = socket(AF_INET,SOCK_STREAM)
sockfd.connect(('127.0.0.1',8888))
while True:
msg = input("发消息>>")
sockfd.send(msg.encode())
if not msg:
break
data = sockfd.recv(1024)
print(data.decode())
sockfd.close()
********************************************
**** 如何让一个服务器处理多个客户端任务 ****
练习
1. 什么是网络七层模型,每一层什么功能。tcp/ip模型又是什么
2. 简述三次握手和四次挥手的过程
3. 使用tcp完成一个简单的对话交互