前言 : 为什么要用网络编程
当你写了两个python文件,如a.py和b.py,分别去运行,会运行的很好。但如果这两个程序之间想要传递一个数据则需要在创建一个文件,把a.py想要传递的内容写到文件中,然后b.py从这个文件中读取内容即可。
但是当a.py和b.py分别在不同电脑上时该如何?
类似的机制有计算机网盘,qq等等。我们可以在我们的电脑上和别人聊天,可以在自己的电脑上向网盘中上传、下载内容。这些都是两个程序在通信。
软件开发架构
我们了解涉及到两个程序之间铜须的应用大致可以分为两种:
第一种:QQ,微信,网盘,优酷等是属于需要安装的桌面应用
第二种web类:百度,知乎,博客园等使用浏览器访问就可直接使用的应用
1.C/S架构
c/s架构
c:client 客户端架构
s:server 服务端架构
"""
将客户端看成是去店里消费客人
将服务端看成是提供服务的店面
eg:手机各种app就是各大软件的客户端
服务端需要具备的三大特征:
1.24小时不间断提供服务(监听)
2.固定的IP地址
3.能够服务多个用户(高并发),同一时间数量用户使用app
"""
2.B/S架构
b/s架构
b:browser 浏览器端
s:server 服务器端
"""
浏览器统一充当各个服务端的客户端
本质:bs架构本质上也是cs架构
"""
Browser 其实也是一种Client客户端,只是这个客户端不需要大家去安装多少应用程序,只需要在浏览器上通过HTTP请求服务端相关的资源(网页资源),客户端Browser浏览器就能进行增删改查
理论知识之网络基础
网络编程其实研究的就是程序之间的数据通信
远程数据传输发展史(民用)
1.有线电话 --> 电话线互联
2.无线电话 --> 信号发射器
3.大屁股电脑 --> 网线
4.笔记本电脑 --> 网卡
...
总结: 要先实现远程数据交互的前提时必须要有物理链接介质
除了有物理连接介质之外还应该有一些能够保证彼此无障碍交互的东西(标准)
OSI七层协议
OSI七层协议
# 所有的计算机都必要有这七层
应用层 ^
表示层 |
会话层 |
传输层 |
网络层 |
数据链路层 |
物理连接层 |
# 开发层面可以归纳为五层
应用层
表示层
会话层
传输层
网络层
数据链路层
物理连接层
从下往上研究:功能
物理连接层:提供一个物理连接接口,物理设备(网线,网卡...)
数据链路层:数据二进制传输
1.规定了电信号的分组方式
硬件
2.以太网协议
规定了计算机必有一块网卡,并且网卡上要有一个固定的一串数字
(12位16进制数: 前六位厂商编号,后六位流水线号)
上述的数字也称为计算机的mac地址(类似于身份证号)
常见硬件
交换机:
能够使接入该机器的所有计算机之间彼此互联
局域网:
某个区域,由交换机组成的网络
互联网:
可以简单理解为,多个局域网之间的彼此互联
"""
基于mac地址的数据传输
1.广播风暴
2.mac地址不能跨局域网传输
"""
路由器:能够链接多个局域网斌实现局域网之间的数据传输
转到OSI七层
网络层
IP协议:规定了接入互联网的计算机都必须有一个IP地址用于唯一标识(互联网)
两个版本:
IPV4:
点分十进制
最小 0.0.0.0
最大 255.255.255.255
IPV6:
能够表示出地球上每一粒沙子
IP分两大类;
IP协议可使一台计算机具有唯一标识
公网IP和私网IP
公网IP需要花钱购买并申请
私网IP自带但是无法基于互联网访问
ARP协议
arp协议的由来:计算机通信基本全靠吼,即广播的方式,所有上层的包到最后都要封装上一以太网头,然后通过以太网协议发送。
通信是基于mac的广播方式实现,计算机在发包时,获取自身的mac是容易的,如何获取目标主机的mac,就需要通过arp协议
arp协议
地址解析协议;基于网络请求将IP地址转换为mac地址
假如你(A)此时不知道你同伴 B 的 MAC 地址
答案很简单,在网络层,我需要把 IP 地址对应的 MAC 地址找到,也就是通过某种方式,找到 192.168.0.2 对应的 MAC 地址 BBBB。
这种方式就是 arp 协议,同时电脑 A 和 B 里面也会有一张 arp 缓存表,表中记录着 IP 与 MAC 地址的对应关系。
IP 地址 | Mac地址 |
---|---|
192.168.15.31 | BBBB |
一开始的时候这个表是空的,电脑 A 为了知道电脑 B(192.168.15.31)的 MAC 地址,将会广播一条 arp 请求,B 收到请求后,带上自己的 MAC 地址给 A 一个响应。此时 A 便更新了自己的 arp 表。
这样通过大家不断广播 arp 请求,最终所有电脑里面都将 arp 缓存表更新完整。
传输层
TCP 协议 UDP协议
一个程序如何在网络上找到另一个程序
首先,程序必须启动,其次,必须有这台机器的地址,比如我们的地址定位大概是国家\省\市\区\街道\楼\门牌号。
那么每一台联网的机器在网络上也有自己的地址,那么它的地址该如何表示?
端口协议:
范围: 0~65535
特性:动态分配
"""
第一次运行微信,系统随机去一个端口号,如2022
然后关闭微信重新启动,系统随机取一个端口号
"""
端口号基本使用原则:
0-1024 系统默认需要使用的端口号
1024-8000 常见软件端口号(言外之意,以后自己开发软件的避免上述两类)
# 端口号(port):能够唯一标识一台计算机上面云运行的一款应用程序
"""
端口号在同一计算机同一时刻不能重复
"""
总结::
ip + port
能够唯一标识世界上某一台接入互联网的计算机上面的某一个正在运行的应用程序
A通过微信给B发送消息
数据包从客户端 --> 服务端 ---> B的客户端接收
TCP协议
又称流式协议 可靠协议
三次握手 建立连接
重要状态
listen监听台:等待对方发请求
sysn_rcv态:忙于回复确认建立请求
# 洪水攻击:服务端在同一时间接收到大量的要求建立链接的请求
四次挥手 断开连接
不能合并为三次
在真空期内双方可能会有数据传给对方
三次握手,四次挥手
UDP协议
别名: 不可靠协议
数据发送没有通道概念,发送出去就不管
"""
TCP协议相当于打电话,你一句我一句
UDP协议相当于发短信 发送即可 不管对方时候查看
"""
应用层
都为认为自定义的协议标准,可遵循或不遵循
HTPP协议 FTP协议