1. 网络的概念
1)网络:多个节点通过特定的介质联系起来
的一种关系
2)计算机网络:以计算设备作为节点
通信线路作为介质的网络
3)互联网(英特网)
把许多的网络连在一起的网络
4)起源:起源于冷战
2. 网络功能
1)数据与信息的传输
2)资源的共享
3)打破时空的限制
3. 网络分类:
范围
1)局域网:小范围网络,位于同一个网段的网络
2)城域网:比局域网范围稍大的网络
3)广域网:更大范围的网络
用户群体
1)专用网:针对特定用户,例如军用网、金融网
2)公用网:针对公众的
4. 网络性能的衡量指标
1)带宽:通信信道支持的最高数据传输频率
单位:Mb/s, Kb/s, Gb/s
100M 100Mbits
b ==> bits 二进制位
B ==> Byte 字节(8bits)
2)传输速率:每秒传输多少个bits数据
3)吞吐量:单位时间内通过某个网络的数据量
4)时延:发送到完成接收之间的时间差
- 传输时延:从发送到发送完成的时间
- 传播时延:电磁波、电信号在介质中传输
所必须的时间
- 处理时延:网络数据交换节点进行
存储、转发时候所需的时间
- 排队时延:网络节点队列分组、排队所经历
的时间
* 路由器(router):网络核心设备
5. 网络编程的几个术语
1)服务器:提供网络服务的一方
2)客户端:请求服务的一方
3)通信:数据传输或交换的过程
4)协议(protocol):一组规则,数据的组织、
编码、传输、校验、解析规则
a =====> a
6. 网络通信的过程
客户端 服务器
请求服务 接收请求
解析请求
处理请求
返回响应
显示响应结果
7. 网络通信要解决的问题
客户端---------服务器
如何找到对方---------如何让对方找到自己
如何联系对方---------如何让对方联系自己
如何进行数正确传输---------如何进行数正确传输
如何让对方正确理解自己的意思
如何结束对话---------如何结束对话
1)查阅域名系统(如果知道IP,可以直接连接对方)
www.baidu.com(域名)===>119.75.217.26(IP)
域名系统:DNS
服务器到域名系统注册、备案
2)客户端主动向服务器发出连接请求
服务器接收客户端发出的连接请求
(三次握手)
3)正确传输:通信协议来保证
4)如何正确理解对方意思:应用协议来保证
5)释放连接:释放资源(四次挥手)
**8. 协议**
- 一组规则,规定了数据组织、编码、发送、
传输、解析的标准
- 由权威的机构制定或通信双方约定
- 通信的参与方都必须遵守
9. ISO/OSI七层参考模型
ISO:国际标准化组织
OSI:开放式系统互联参考模型
功能:网络通信过程的标准化
把网络通信过程分为7个层次
每个层次完成特定的任务
分解:分解过程,分解规模,降低复杂度
优点:分解问题规模,降低复杂度
各司其职
解耦
#### TCP/ IP七个层次:
7 应用层(Application):
提供用户服务,具体定义程序或服务的功能
常用的应用协议有:
http(用于超本文传输)
pop3(邮件接收)
smtp(邮件发送)
telnet(远程登录)
ftp(文件传输协议)
6 表示层(Presentation):
数据的压缩、优化、加密
5 会话层(session):
建立应用的连接,选择合适的传输服务
4 传输层(Transportation):
负责进程到进程间的通信
保证可靠性传输、差错校验、流量控制
3 网络层(Network):
负责主机到主机之间的通信
路由选择(寻址)、分段、网络互连
2 数据链路层(Data Link):
负责相邻主机间的通信
进行数据交换、控制消息收发、链路的连接
1 物理层(Physical):
定义机械、电器、物理标准
硬件特性、物理接口标准、传输介质
七层模型的特点:
1. 建立了统一的网络工作流程
2. 每个层次功能清晰,各司其职
3. 方便了网络产品开发,推动了网络发展
4. 没有实现
TCP/IP四层模型
应用层(应用层、表示层、会话层)
传输层
网络层
物理链路层(物理层、数据链路层)
五层模型
应用层(应用层、表示层、会话层)
传输层
网络层
数据链路层
物理层
10. 封装、解封
封装:每个层接收上一层传递的数据
加入本层的控制信息(包头)
并且传递给下一层
解封:每层接收下一层传递的数据
读取并去掉本层的控制信息
并且将数据传给上一层
11. 数据包如何寻找路径
- 每个网络节点都有一个IP地址(全球唯一)
- 数据封包的过程中
包含了数据的源地址、目的地址
- 网络转发设备,根据包头中记载的目的地址
进行路径的查找(路由表)
如果路由表包含到达目的主机的路径,则发送
如果路由表不包含到达目的主机的路径
则转发给下一个节点
每个数据包包含一个生命周期值,每经过一个
转发节点,该值就减1,如果该值为0还未
转发到目的地址,该包就会被丢弃
12. IP地址
1)用32bits保存(IPV4)
11111111 11111111 11111111 11111111(真实)
255.255.255.255 (点分十进制表示法)
每部分的取值0~255
* ipconfig(windows)
ifconfig(Linux/Unix)
IP地址构成:网络地址 + 主机地址
172.40.91.140
* 掩码:255.255.255.0
255转换成二进制:
11111111 11111111 11111111 00000000
掩码前面连续为1的部分是网络地址
其它部分为主机地址
私网地址:预留的一部分地址段,内网使用
A类:10.0.0.1--10.255.255.254
B类:172.16.0.1--172.31.255.254
C类:192.168.0.1--192.168.255.254
特殊IP地址:
127.0.0.1 代表本机地址(回环地址)
0.0.0.0 本机绑定的所有IP地址
主机地址全部为1:表示广播地址
例如:192.168.0.5 (C类)
192.168.0.255 (主机部分全部为1)
表示192.168.0网段的广播地址
主机地址全部为0,表示网络地址(网段)
例如:192.168.0.5 (C类)
192.168.0.0 (主机部分全为0)
表示192.168.0这个网段
练习:有IP地址 192.168.10.25
掩码:255.255.252.0
求:网络地址
求广播地址
计算方式:
第一步:将IP转换成二进制
11000000 10101000 00001010 00011001
第二步:将掩码转成二进制
11111111 11111111 11111100 00000000
第三步:取出前22bits为网络地址
后面部分全部替换成0,转换成10进制
11000000 10101000 00001000 00000000
192.168.8.0 (网络地址)
22bits后面部分全部换成1,转换成10进制
11000000 10101000 00001011 11111111
192.168.11.255 (广播地址)
13. 端口
1)作用:区分或标记不同的服务/应用
2)长度:16bits,1~65535
3)说明:
1~1023 系统保留使用
1024~65535 应用
4)常见端口:
80 HTTP服务端口
21 FTP服务端口
22 SSH(加密远程登录)端口
23 telnet端口
3306 MySQL默认端口
linux下使用下面的命令查看端口是否打开
netstat -an | grep 端口号
对于远程主机,连接远程的主机端口,看是否成功
可以使用netcat,telnet工具连接端口
14. 传输层(TCP、UDP)
1)TCP:传输控制协议
提供可靠传输
数据无丢失、无重复、无差错
如何实现可靠传输
- 面向连接的传输方式
- 每个数据包都有一个序号,用来
保证数据传输中不丢包、不重复
- 流量控制
连接建立过程(三次握手)
- 客户端向服务器发起连接请求
并且带上自己当前的序号N
- 服务收到连接请求后,产生一个应答
带两个序号
N+1:期望客户端下一个包的序号
K:自己的序号
- 客户收到应答后,再给服务器一个应答
带上序号K+1(期望服务器下一个包序号为
K+1)
断开连接:四次挥手
- 主动方发送断开请求
- 被动方收到请求,立即返回
表示准备断开
- 被动方处理完消息,完成断开准备
发送报文,表示可以断开
- 主动方收到指令,发送报文确认断开
适用场景:数据量较大、可靠性要求高
例如:网页访问,文件下载,网络游戏
2)UDP:用户报文协议
特点:无连接、不可靠传输
适用:数据量小、可靠性要求不高的情况
例如:QQ发送文字信息,DNS
- 服务器、客户端工作流程
1)服务器
创建socket -> 绑定地址 -> 监听 -> 接收请求
循环收发数据 ->
关闭连接
2)客户端
创建socket -> 发起连接 -> 收发数据 -> 关闭
==== 套接字socket的使用 ====
1. 什么是套接字
1)用于计算机网络通信的一种接口
利用socket可以在系统软件实现数据的收发
最早由加州大学伯克利分校开发
是目前计算机网络通信的基础、标准
计算机双方要通信,必须建立在socket上
2)套接字的类型
- 流式套接字(SOCK_STREAM)
+ 面向连接、可靠传输、数据无差错的收发序列
+ 流量控制功能
+ 数据被看成字节流,长度无限制,多个数据包
同时流入
- 数据报套接字(SOCK_DGRAM)
+ 无连接、不可靠传输、数据可能丢包、重复
+ 数据构成为一个个独立的报文
每一次发送数据就是一个数据报
3)socket主要函数
- 创建:sokcet(socket_family=AF_INET,
socket_type=SOCK_STREAM,
proto=0)
参数:
socket_family 地址族类型,默认AF_INET
socket_type 套接字类型
SOCK_STREAM 流式套接字
SOCK_DGRAM 数据报套接字
proto 子协议类型,默认填写0
- 绑定:bind
格式:bind(address)
参数:address 地址元组
第一个值为IP地址
第二个值为端口地址
- 监听:listen
格式:listen(backlog)
参数:backlog 未接收连接请求个数
超过该值,则会拒绝后面的请求
- 接受连接:accept
格式:sockfd, addr = s.accept()
功能:阻塞,等待客户端连接
如果有新的连接,接受连接并返回
返回两个参数
sockfd: 新创建的socket,用于数据传输
addr: 客户端地址
- 发送:send
格式:send(data)
参数:要发送的消息,要求bytes
返回:返回实际发送的字节数
- 接收:recv
格式:data = s.recv(buffersize)
参数:buffersize 表示最多接收多少字节
返回值:返回接收到的数据
如果对方发送完成或关闭连接
返回None
- 连接:connect(只能在客户端使用)
格式:connect(address)
参数:address 服务器地址
- 关闭连接:close
格式:s.close()
基础只是参考前面博客
###基于TCP复制文件代码
服务端
# 建立Socket
from socket import *
sk = socket()
# 绑定
sk.bind(('0.0.0.0',9999))
# 监听
sk.listen()
# 阻塞等待缓冲区数据
conn,addr = sk.accept()
print('客户端连接已建立:',addr[0])
# 接收数据
try:
f = open('ss.jpg','wb')
while True:
fs = conn.recv(1024)
print('文件接收完毕')
if not fs:
break
else:
f.write(fs)
f.close()
except:
print('文件打开失败!')
#关闭连接
sk.close()
conn.close()
# 建立Socket 连接
客户端
from socket import *
sk = socket()
sk.connect(('127.0.0.1',9999))
#读取文件
try:
f = open('D:/Vscode/Mon02Demo/NetServer/Demo4/work/s.jpg','rb')
while True:
fs = f.read(1024)
if not fs:
break
else:
print(fs)
sk.send(fs)
f.close()
except:
print('文件读取失败')
sk.close()