前言:

什么是网络?

网络是由节点和连线构成,表示诸多对象及其相互联系。

在数学上,网络是一种图,一般认为专指加权图。

网络除了数学定义外,还有具体的物理含义,即网络是从某种相同类 型的实际问题中抽象出来的模型

在计算机领域中,网络是信息传输、接收、共享的虚拟平台,通过它把各个点、面、体的信息联系到一起,从而实现这些资源的共享

网络是人类发展史来最重要的发明,提高了科技和人类社会的发展。

在1999年之前,人们一般认为网络的结构都是随机的。但随着Barabasi和Watts在1999年分别发现了网络的无标度和小世界特性并分别在世界著名的《科学》和《自然》           杂志上 发表了他们的发现之后,人们才认识到网络的复杂性。

网络会借助文字阅读、图片查看、影音播放、下载传输、游戏、聊天等软件工具从文字、图片、声音、视频等方面给人们带来极其丰富的生活和美好的享受。

 
 
 
 
网络目的:
      网络传输的目的是什么?
  • 没错就是:数据传输
 
  由于网络的复杂性以及各种应用硬件等等不匹配原因 
  和编码是一个道理你有你的我有我的会导致冲突等问题
  所以出现了 :ISO(国际标准化组织)
  ISO是干嘛的呢?
  • 他是一个非盈利性国际组织 这个组织制定了一个用于计算机或通讯系统间的互联网标准体系
  • 叫OSI模型  不仅包括一系列抽象的术语或概念,也包括具体的协议
  • OSI公有七层 :
 
  1. 应用层: 提供用户服务,具体的内容由特定的程序规定
  2. 表示层: 提供数据的加密和压缩优化
  3. 会话层: 确定建立应用链接,选择传输服务
  4. 传输层: 提供数据传输服务,进行流量控制
  5. 网络层: 路由选着,网络互联
  6. 链路层: 提供链路交换,具体消息的发送
  7. 物理层: 物理硬件,接口,网卡的规定
 
四层模型:
  1. 应用层 :  应用层   表示层  会话层
  2. 传输层 :  传输层
  3. 网络层 :  网络层
  4. 物理链路层: 链路层和物理层
 
五层模型(tcp/ip模型):
  1. 应用层 : 应用层   表示层  会话层
  2. 传输层 : 传输层
  3. 网络层 : 网络层
  4. 链路层 : 链路层
  5. 物理层 : 物理层
 
 
OSI模型优点
  • 将功能分开 降低网络中的耦合度,
  • 使用开发流程更加清晰,每部分各司其职
 
高内聚低耦合:
  1. 高内聚:每个模块功能尽量单一,不会多个功能掺杂
  2. 低耦合:尽量降低每个模块之间的关联性
 
 
 
 
网络协议:
  • 在网络通讯中协议必须遵守的规定,
  • 如建立什么连接,消息结构如何解析等
  • 应用层:TFTP(文件传输)、HTTP(超文本传输协议)、DNS(域名解析)、SMTP(邮件传输)
  • 传输层:TCP、UDP
  • 网络层:IP
  • 物理层:IEEE
 
iPython3:socket模块
 
网络相关概念:
    网络主机:在网络上确定一台主机
  1. 本地使用:127.0.0.1 或 “localhost”
  2. 网络地址:“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
 
常用IP地址:
  1. IPv4: 点分十进制   例如:192.168.1.3   取值0~255(32位)
  2. IPv6: 128位
 
网络连接测试
    ping 172.18.32.47
 
特殊ip
  1. 127.0.0.1            本地IP测试
  2. 0.0.0.0                自动使用本地可用网卡IP
  3. 192.168.1.0        代表网段
  4. 192.168.1.1        通常为网关地址
  5. 192.168.1.255    广播地址
 
 
访问主机IP地址:
    socket.gethostbyaddr('127.0.0.1')
    ('localhost', [], ['127.0.0.1'])
         主机     别名      ip地址
 
IP十六进制转换:
  • 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 自用端口
 
获取应用程序的端口:
  1. socket.getservbyname('ssh')
  2. 22
  1. socket.getservbyname('mysql')
  2. 3306
 
 
传输层服务:
 
 面向连接的传输服务(tcp协议):
  • 传输特征:
  • 可靠的数据传输:
  • 可靠性:无失序、无差错、无重复、无丢失
  • 在数据传输前和传输后需要建立连接和断开链接
  • 面向传输服务建立连接的过程:‘三次握手
  1. 客户端向服务器发送链接请求
  2. 服务器接受到请求进行确认,返回确认报文
  3. 客户端收到服务器回复最终确认链接
  • 面向传输服务断开链接的过程:‘四次挥手’
  1. 主动方发送报文,告知被动方要断开链接
  2. 被动方回复报文,表示已经接受到请求,准备断开
  3. 被动方再次发送报文,表示准备处理就绪,可以断开
  4. 主动方发送确认报文,断开链接
  • 应用情况:
  • 适用于传输较大的内容或文件,网络良好,
  • 需要保证传输可靠性的情况
  • e.g.  信息聊天,文件上传下载,邮件,网页获取
 面向无连接的传输服务(udp协议):
  1. 不保证传输的可靠性
  2. 没有建立连接和断开的过程
  3. 数据的收发比较自由
  • 适用情况:
  • 网络情况较差,对可靠性要求不高,收发消息的两端
  • e.g.:网络视频,群聊,广播等
 
 
 
 
socket 套接字编程:
    目的:
  • 通过编程语言提供的套接字编程接口
  • 可以更简单的完成基于tcp/udp的编程
    套接字:
  • 是完成上述目标的一种编程手段
    套接字类别:
      1.流式套接字(SOCK_STREAM):
  • 传输层基于套接字的协议通信
  • 面向连接可靠的传输  tcp的传输   流式套接字
      2.数据报套接字(SOCK_DGRAM):
  • 面向无连接不可靠的传输 udp的传输  数据报套接字
      3.低层套接字(SOCK_RAM):
  • 访问底层协议套接字
 
TCP服务端:
   import socket
   1.创建套接字(函数):
      socket.socket(sock_family = AF_INET,
              sock_type = SOCK_STREAM,
      proto = 0)
      功能:
  • 创建套接字
      参数:
  • sock_family地址族类型   AF_INET:IPV4网络通讯
  • sock_tpye:套接字类型   SICK_STREAM :流式   SOCK_DGRAM:数据报
  • proto:通常为0  选定子协议类型
  • 返回值:返回一个套接字对象
   2.绑定地址(函数):
      sockfd.bind(addr)
        功能:
  • 绑定地址
        参数:
  • addr--->元组  (ip, port) ("0.0.0.0", 8888)
   3.设置监听套接字:
      sockfd.listen(n)
        功能:
  • 将套接字设置为监听套接字,创建监听队列
参数:
  • 监听队列大小
  • 一个监听套接字可以连接多个客户端
   4.等待接受客户端链接:
      connfd,addr = sockfd.accept()  阻塞状态
      功能:
  • 阻塞等待并处理客户端链接
      返回值:
  1. connfd:新的套接字,用于和客户端通讯
  2.  addr:链接客户端的地址(ip, port)
      阻塞函数
  • 当程序运行到阻塞函数位置,如果某种条件
  • 没有达成则暂停程序运行,直到条件达成结束阻塞
-
   5.消息的收发:
      data = connfd.recvbuffersize
        功能:
  • 接受消息
        参数:
  • 一次接受消息的大小 字节
  • 返回值:返回接受的内容
      n = connfd.send(data)
        功能:
  • 发送消息
        参数:
  • 要发送的内容(bytes格式)
  • 返回值:返回实际发送的字节数
   6.关闭套接字
      sockfd.close()
 
客户端:
    1.创建套接字 (和服务端套接字类型相同)
    2.发起链接
       connect(addr)
          功能:
  • 向服务端发起链接
  参数:
  • 服务器地址  (元组)
    3.消息收发
    4.关闭套接字
 
示例
服务端:
 
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)的更多相关文章

  1. Day09: socket网络编程-OSI七层协议,tcp/udp套接字,tcp粘包问题,socketserver

    今日内容:socket网络编程    1.OSI七层协议    2.基于tcp协议的套接字通信    3.模拟ssh远程执行命令    4.tcp的粘包问题及解决方案    5.基于udp协议的套接字 ...

  2. 8.6 day27 网络编程 osi七层协议 Time模块补充知识 TCP协议

    Time模块补充知识 date和datetime区别是什么? date 就是年月日 datetime就是年月时时分秒 以下代码为什么会报错? import json from datetime imp ...

  3. Python进阶----网络通信基础 ,OSI七层协议() ,UDP和TCP的区别 , TCP/IP协议(三次握手,四次挥手)

    Python进阶----网络通信基础 ,OSI七层协议() ,UDP和TCP的区别 , TCP/IP协议(三次握手,四次挥手) 一丶CS/BS 架构 C/S: 客户端/服务器    定义:       ...

  4. 网络编程的基本概念,TCP/IP协议简介

    8.1.1 网络基础知识 计算机网络形式多样,内容繁杂.网络上的计算机要互相通信,必须遵循一定的协议.目前使用最广泛的网络协议是Internet上所使用的TCP/IP协议. 网络编程的目的就是指直接或 ...

  5. 网络编程 套接字socket TCP UDP

    网络编程与套接字 网络编程 网络编程是什么: ​ 网络通常指的是计算机中的互联网,是由多台计算机通过网线或其他媒介相互链接组成的 ​ 编写基于网络的应用程序的过程序称之为网络编程. 网络编程最主要的工 ...

  6. Python黑客编程基础3网络数据监听和过滤

    网络数据监听和过滤 课程的实验环境如下: •      操作系统:kali Linux 2.0 •      编程工具:Wing IDE •      Python版本:2.7.9 •      涉及 ...

  7. golang 网络编程之如何正确关闭tcp连接以及管理它的生命周期

    欢迎访问我的个人网站获取更佳阅读排版 golang 网络编程之如何正确关闭tcp连接以及管理它的生命周期 | yoko blog (https://pengrl.com/p/47401/) 本篇文章部 ...

  8. Python3 与 C# 网络编程之~ 网络基础篇

    最新版本查看:https://www.cnblogs.com/dotnetcrazy/p/9919202.html 入门篇 官方文档:https://docs.python.org/3/library ...

  9. c/c++ 网络编程 UDP 主机网络信息取得

    网络编程 UDP 主机网络信息取得 1,if_nametoindex 通过网卡名字取得网卡编号 2,if_indextoname 通过网卡编号取得网卡名字 #include <stdio.h&g ...

  10. python 并发编程 io模型 目录

    python 并发编程 IO模型介绍 python 并发编程 socket 服务端 客户端 阻塞io行为 python 并发编程 阻塞IO模型 python 并发编程 非阻塞IO模型 python 并 ...

随机推荐

  1. P1980 计数问题

    题目描述 试计算在区间 11 到 nn的所有整数中,数字x(0 ≤ x ≤ 9)x(0≤x≤9)共出现了多少次?例如,在 11到1111中,即在 1,2,3,4,5,6,7,8,9,10,111,2, ...

  2. 2017.11.5 Java Web ----案例:数据库访问JavaBean的设计

    (12)案例----数据库访问JavaBean的设计 例题:数据库操作在一个Web应用程序中的后台处理中占有大比重,设计一组JavaBean封装数据库的基本操作供上层模块调用,提高程序的可移植性. [ ...

  3. jQuery实现轮播切换以及将其封装成插件(1)

    我们在网上经常会看到一些轮播切换的效果.轮播切换,就是在一个有限的空间中定时的像走马灯一样去播放一组图片,当然也可以通过鼠标悬停在小按钮上来切换显示.下面我们将一步一步的实现这一效果. 为保证效果,请 ...

  4. AngularJS 表达式中添加过滤器实例

    过滤器可以通过一个管道字符(|)和一个过滤器添加到表达式中 历练实例: <!DOCTYPE html><html><head><meta http-equiv ...

  5. 【Java】常用数据类型转换(BigDecimal、包装类、日期等)

    新工作转到大数据方向,每天都要面对数据类型互相转换的工作,再加上先前面试发现这部分的知识盲点, 决定复习之余自己再写一套便捷的方法,以后会比较方便.(虽然公司有现成封装的类,里头还有些遗漏的地方,暂时 ...

  6. Windows/Linux下查看系统CPU使用最高的线程

    参考:https://blog.csdn.net/qq_27818157/article/details/78688580 jstack -l 31372 > c:/31372.stack

  7. 关于discuz 不能全文搜索的问题

    这个问题客服反馈很多次了,以为discuz 默认搜索只能搜标题,除非配置了sphinx全文搜索引擎. 但是之前比较老的员工说以前能用的,也就是discuz老版本. 今天突然想到是不是discuz纵横搜 ...

  8. C/C++程序基础 (十)模板和泛型

    什么是泛型编程 基于模板,有效将算法和数据结构分离. 模板 包括类型和参数 模板函数:抽象的函数定义,代表一类同构函数.编译器在其调用位置自动完成对应模板函数的实例化. 模板类:抽象的类定义,代表更高 ...

  9. Java分享笔记:FileOutputStream流的write方法

    /*------------------------ FileOutputStream: ....//输出流,字节流 ....//write(byte[] b)方法: 将b.length个字节从指定字 ...

  10. springMVC-基本认识

    MVC设计模式 Controller Model View SpringMVC 1.  实现MVC设计模式的框架 2.  基于springIOC,是spring的一个子模块,不需要整合 核心组件 1. ...