Python网络编程(OSI模型、网络协议、TCP)
前言:
什么是网络?
网络是由节点和连线构成,表示诸多对象及其相互联系。
在数学上,网络是一种图,一般认为专指加权图。
网络除了数学定义外,还有具体的物理含义,即网络是从某种相同类 型的实际问题中抽象出来的模型
在计算机领域中,网络是信息传输、接收、共享的虚拟平台,通过它把各个点、面、体的信息联系到一起,从而实现这些资源的共享。
网络是人类发展史来最重要的发明,提高了科技和人类社会的发展。
在1999年之前,人们一般认为网络的结构都是随机的。但随着Barabasi和Watts在1999年分别发现了网络的无标度和小世界特性并分别在世界著名的《科学》和《自然》 杂志上 发表了他们的发现之后,人们才认识到网络的复杂性。
网络会借助文字阅读、图片查看、影音播放、下载传输、游戏、聊天等软件工具从文字、图片、声音、视频等方面给人们带来极其丰富的生活和美好的享受。
- 没错就是:数据传输
由于网络的复杂性以及各种应用硬件等等不匹配原因和编码是一个道理你有你的我有我的会导致冲突等问题所以出现了 :ISO(国际标准化组织)ISO是干嘛的呢?
- 他是一个非盈利性国际组织 这个组织制定了一个用于计算机或通讯系统间的互联网标准体系
- 叫OSI模型 不仅包括一系列抽象的术语或概念,也包括具体的协议
- OSI公有七层 :
- 应用层: 提供用户服务,具体的内容由特定的程序规定
- 表示层: 提供数据的加密和压缩优化
- 会话层: 确定建立应用链接,选择传输服务
- 传输层: 提供数据传输服务,进行流量控制
- 网络层: 路由选着,网络互联
- 链路层: 提供链路交换,具体消息的发送
- 物理层: 物理硬件,接口,网卡的规定
- 应用层 : 应用层 表示层 会话层
- 传输层 : 传输层
- 网络层 : 网络层
- 物理链路层: 链路层和物理层
- 应用层 : 应用层 表示层 会话层
- 传输层 : 传输层
- 网络层 : 网络层
- 链路层 : 链路层
- 物理层 : 物理层
- 将功能分开 降低网络中的耦合度,
- 使用开发流程更加清晰,每部分各司其职
- 高内聚:每个模块功能尽量单一,不会多个功能掺杂
- 低耦合:尽量降低每个模块之间的关联性
- 在网络通讯中协议必须遵守的规定,
- 如建立什么连接,消息结构如何解析等
- 应用层:TFTP(文件传输)、HTTP(超文本传输协议)、DNS(域名解析)、SMTP(邮件传输)
- 传输层:TCP、UDP
- 网络层:IP
- 物理层:IEEE
- 本地使用:127.0.0.1 或 “localhost”
- 网络地址:“0.0.0.0” 或 “172.168.40.53”
- ifconfig:查看本机IP (ens33:本地IP lo:本地回还)
- ipconfig:windoes中
- socket.gethostname() : 获取本机主机名
- socket.gethostbyname('tedu') : 利用主机名获取ip
- socket.gethostbyname('localhost'): 获取本地ip
- IPv4: 点分十进制 例如:192.168.1.3 取值0~255(32位)
- IPv6: 128位
- 127.0.0.1 本地IP测试
- 0.0.0.0 自动使用本地可用网卡IP
- 192.168.1.0 代表网段
- 192.168.1.1 通常为网关地址
- 192.168.1.255 广播地址
- socket.inet_aton('192.168.1.2')
- b'\xc0\xa8\x01\x02'
- socket.inet_ntoa(b'\xc0\xa8\x01\02')
- '192.168.1.2'
- 是指网络服务器地址在网络上的名称
- 端口号是地址的一部分,在一个系统中每个网络(区分应用ip)
- 应用监听不同的端口,以获取对应的端口传递信息
- 取值范围:1---------65535
- 1---------255 一些通用端口(众所周知的程序占用)
- 256------1023 系统端口
- 1024-----65535 自用端口
- socket.getservbyname('ssh')
- 22
- socket.getservbyname('mysql')
- 3306
- 传输特征:
- 可靠的数据传输:
- 可靠性:无失序、无差错、无重复、无丢失
- 在数据传输前和传输后需要建立连接和断开链接
- 面向传输服务建立连接的过程:‘三次握手’
- 客户端向服务器发送链接请求
- 服务器接受到请求进行确认,返回确认报文
- 客户端收到服务器回复最终确认链接
- 面向传输服务断开链接的过程:‘四次挥手’
- 主动方发送报文,告知被动方要断开链接
- 被动方回复报文,表示已经接受到请求,准备断开
- 被动方再次发送报文,表示准备处理就绪,可以断开
- 主动方发送确认报文,断开链接
- 应用情况:
- 适用于传输较大的内容或文件,网络良好,
- 需要保证传输可靠性的情况
- e.g. 信息聊天,文件上传下载,邮件,网页获取
- 不保证传输的可靠性
- 没有建立连接和断开的过程
- 数据的收发比较自由
- 适用情况:
- 网络情况较差,对可靠性要求不高,收发消息的两端
- e.g.:网络视频,群聊,广播等
- 通过编程语言提供的套接字编程接口
- 可以更简单的完成基于tcp/udp的编程
- 是完成上述目标的一种编程手段
- 传输层基于套接字的协议通信
- 面向连接可靠的传输 tcp的传输 流式套接字
- 面向无连接不可靠的传输 udp的传输 数据报套接字
- 访问底层协议套接字
- 创建套接字
- sock_family地址族类型 AF_INET:IPV4网络通讯
- sock_tpye:套接字类型 SICK_STREAM :流式 SOCK_DGRAM:数据报
- proto:通常为0 选定子协议类型
- 返回值:返回一个套接字对象
- 绑定地址
- addr--->元组 (ip, port) ("0.0.0.0", 8888)
- 将套接字设置为监听套接字,创建监听队列
- 监听队列大小
- 一个监听套接字可以连接多个客户端
- 阻塞等待并处理客户端链接
- connfd:新的套接字,用于和客户端通讯
- addr:链接客户端的地址(ip, port)
- 当程序运行到阻塞函数位置,如果某种条件
- 没有达成则暂停程序运行,直到条件达成结束阻塞
- 接受消息
- 一次接受消息的大小 字节
- 返回值:返回接受的内容
- 发送消息
- 要发送的内容(bytes格式)
- 返回值:返回实际发送的字节数
- 向服务端发起链接
- 服务器地址 (元组)
from socket import * # 创建套接字对象
sockd = socket()
# 绑定IP地址
sockd.bind(("127.0.0.1", 6666))
# 设置监听套接字
sockd.listen(5)
# 等待客户端链接
cond, addr = sockd.accept()
# 接受客户端消息(单次1024字节)
data = cond.recv(1024)
print(data.decode())
# 发送消息
cond.send(b"Hello, I'm the server")
# 关闭套接字
cond.close()
sockd.close()
这里本机测试可以利用两个进行 telnet命令链接服务端测试

from socket import * # 创建套接字
sockfd = socket(AF_INET, SOCK_STREAM)
# 绑定地址
sockfd.bind(("0.0.0.0", 8888))
# 设置监听
sockfd.listen(5)
# 等待客户端链接
print("waiting for connect....")
conn, addr = sockfd.accept()
print("Connect from", addr)
print("Connect from", conn) # 消息收发
while True:
data = conn.recv(1024)
if data.decode() == "":
n = conn.send(b"Bey")
break
print("Receive", data.decode())
n = conn.send(b"Receive your message")
print("send %d" % n)
# 关闭套接字
conn.close()
sockfd.close()
客户端:
# tcp_client.py from socket import * sockfd = socket()
sockfd.connect(("172.18.32.31", 8888))
while True:
msg = input("Msg>>")
if msg == "":
break
sockfd.send(msg.encode())
data = sockfd.recv(1024)
# if msg == "Bye":
# break
print(data.decode())
sockfd.close()
Python网络编程(OSI模型、网络协议、TCP)的更多相关文章
- Day09: socket网络编程-OSI七层协议,tcp/udp套接字,tcp粘包问题,socketserver
今日内容:socket网络编程 1.OSI七层协议 2.基于tcp协议的套接字通信 3.模拟ssh远程执行命令 4.tcp的粘包问题及解决方案 5.基于udp协议的套接字 ...
- 8.6 day27 网络编程 osi七层协议 Time模块补充知识 TCP协议
Time模块补充知识 date和datetime区别是什么? date 就是年月日 datetime就是年月时时分秒 以下代码为什么会报错? import json from datetime imp ...
- Python进阶----网络通信基础 ,OSI七层协议() ,UDP和TCP的区别 , TCP/IP协议(三次握手,四次挥手)
Python进阶----网络通信基础 ,OSI七层协议() ,UDP和TCP的区别 , TCP/IP协议(三次握手,四次挥手) 一丶CS/BS 架构 C/S: 客户端/服务器 定义: ...
- 网络编程的基本概念,TCP/IP协议简介
8.1.1 网络基础知识 计算机网络形式多样,内容繁杂.网络上的计算机要互相通信,必须遵循一定的协议.目前使用最广泛的网络协议是Internet上所使用的TCP/IP协议. 网络编程的目的就是指直接或 ...
- 网络编程 套接字socket TCP UDP
网络编程与套接字 网络编程 网络编程是什么: 网络通常指的是计算机中的互联网,是由多台计算机通过网线或其他媒介相互链接组成的 编写基于网络的应用程序的过程序称之为网络编程. 网络编程最主要的工 ...
- Python黑客编程基础3网络数据监听和过滤
网络数据监听和过滤 课程的实验环境如下: • 操作系统:kali Linux 2.0 • 编程工具:Wing IDE • Python版本:2.7.9 • 涉及 ...
- golang 网络编程之如何正确关闭tcp连接以及管理它的生命周期
欢迎访问我的个人网站获取更佳阅读排版 golang 网络编程之如何正确关闭tcp连接以及管理它的生命周期 | yoko blog (https://pengrl.com/p/47401/) 本篇文章部 ...
- Python3 与 C# 网络编程之~ 网络基础篇
最新版本查看:https://www.cnblogs.com/dotnetcrazy/p/9919202.html 入门篇 官方文档:https://docs.python.org/3/library ...
- c/c++ 网络编程 UDP 主机网络信息取得
网络编程 UDP 主机网络信息取得 1,if_nametoindex 通过网卡名字取得网卡编号 2,if_indextoname 通过网卡编号取得网卡名字 #include <stdio.h&g ...
- python 并发编程 io模型 目录
python 并发编程 IO模型介绍 python 并发编程 socket 服务端 客户端 阻塞io行为 python 并发编程 阻塞IO模型 python 并发编程 非阻塞IO模型 python 并 ...
随机推荐
- Uva 11384 正整数序列
题目链接:https://vjudge.net/problem/UVA-11384 题意:给定正整数 n,用最少的操作把序列 1,2,,,n 全部变成 0: 操作是:每次可以从序列中选择一个或者多个, ...
- 模拟停车POJ(3505)
题目链接:http://poj.org/problem?id=3505 解题报告: #include <stdio.h> #include <iostream> #includ ...
- theano提示:g++ not detected的解决办法
导入theano包后出现如下警告: WARNING (theano.configdefaults): g++ not detected ! Theano will be unable to execu ...
- LeetCode94. Binary Tree Inorder Traversal
题目 给定一个二叉树,返回它的中序 遍历. 示例: 输入: [1,null,2,3] 1 \ 2 / 3 输出: [1,3,2] 进阶: 递归算法很简单,你可以通过迭代算法完成吗? 考点 stack ...
- 提高篇(1):RMQ问题与ST表
RMQ是英文Range Minimum/Maximum Query的缩写,是询问某个区间内的最值,这里讲一种解法:ST算法 ST算法通常用在要多次(10^6级别)询问区间最值的问题中,相比于线段树,它 ...
- 交换机基础配置之跨交换机划分vlan
我们以上面的拓扑图来进行实验 四台pc机都在同一网段 pc1和pc2在同一台交换机上 pc3和pc4在同一台交换机上 现在我们实验的目的就是将pc1和pc3划分到同一vlan pc2和pc4划分到同一 ...
- php集成开发环境xampp的搭建
一:运维闲谈 作为一名linux运维工程师,在确保能够有熟练的服务器的搭建和维护优化技能的前提,还需对自身解决问题方法上做出一番功夫. 如何为自己的运维工作添砖加瓦,自动化运维便变得非常重要,一方面, ...
- scrapy--selenium(二)
今天学习了很多,还是想给大家讲一讲正题:scrapy的动态加载AJax的网页爬取:selenium.让我们开始 三: 针对大型电商网站:京东网,因为比较有代表性,爬出来有点小成就.先给大家看下效果图. ...
- css设置内容超出后显示省略号
1.使用overflow: hidden把超出的内容进行隐藏: 2.然后使用white-space: nowrap设置内容不换行: 3.最后使用text-overflow: ellipsis设置超出内 ...
- PHP时间日期操作增减(date strtotime) 加一天 加一月
date_default_timezone_set('PRC'); //默认时区 //当前的时间增加5天 $date1 = "2014-11-11"; echo date('Y-m ...