OSI  七层模型

   1 应用层 【提供用户服务,具体功能由特定的程序而定】
2 表示层 【数据的压缩优化,加密】
3 会话层 【建立应用级的连接,选择传输服务】
4 传输层 【提供不同的传输服务,流量控制】
5 网络层 【路由选择,网络互连】
6 链路层 【进行数据转换,具体消息的发送,链路连接】
7 物理层 【物理硬件,接口设定,网卡路由交换机等】
  


cookie
  高内聚 : 模块功能尽可能单一,不要掺杂
  低耦合 : 模块之间尽量减少关联和影响 OSI 模型优点
  1 将工作流程标准化
  2 降低了模块间的耦合度,使每一部分可以单独开发,单独工作
   四层模型
  1 应用层 【:集合了原有的应用层,表示层,会话层】
  2 传输层
  3 网络层
  4 物理链路层

五层模型(TCP/IP模型)
  1 应用层
  2 传输层
  3 网络层
  4 链路层
  5 物理层 数据传输流程
  1 发送端由应用层到物理层逐层添加信息头(首部),最终在物理层发送。
  2 中间经过节点(交换机,路由器等。。)转发,发送到接收端
  3 在接收端根据发送端的每个信息头进行解析,最终消息到应用层展示给用户 网络协议 : 在网络通信中双方都遵循的规定,包括建立什么样的网络结构,消息结构,标识代表什么等。
  应用层协议 : TFTP HTTP DNS SMTP
  传输层协议 : TCP UDP
  网络层 : IP
  物理层   : IEEE 网络相关概念
  网络主机 : 在网络中标识一台计算机 HOST
  本地使用 :'localhost'
        '127.0.0.1'
  网络使用 : '0.0.0.0'
        '本机IP'
IP地址
  网络上确定一台主机网络位置的地址
  IPV4 : 点分十进制 占32位
  IPV6 : 128位 将IP十进制转化为二进制
  > socket.inet_aton('192.168.0.1')
  > 'b\xxxx'
将IP 二进制转化为十进制
 > socket.inet_ntoa('b\xxxx') 域名 :网络服务器地址的名称
  1,方便记忆
  2,名称表达一定的含义 网络端口号
  端口是网络地址的一部分,用于区分一个网络主机上的网络应用
  * 在一个操作系统中不同的网络应用监听不同的端口号
  取值范围 : 1~~65535
          1~~255 : 一些众所周知的通用端口
          256~~1023 :  系统应用端口
          1024 ~~ 65535 :自用端口
          建议使用 >10000的端口
  socket.getservbyname('http') 【返回对应应用的端口信息】
  -->80 网络字节序 传输层服务 面向连接的传输服务
  基于tcp协议的数据传输
  传输特征 : 提供可靠的数据传输,可靠性指数据传输过程中无丢失,无失序,无差错,无重复。
  
  实现手段:
    数据传输断开前都需要进行传输和断开的确认
      三次握手: TCP在数据传输前建立连接的过程
        1 客户端向服务器发送连接请求
        2 服务器收到请求后,回复确认消息,表示允许连接
        3 客户端收到服务器回复,进行最终标志发送确认连接
      
          

      四次挥手: TCP传输在连接断开前进行断开确认的过程
        1 主动发发送报文告知被动方要断开连接
        2 被动方收到请求后立即返回报文告知已经准备断开
        3 被动方准备就绪后再次发送报文告知可以断开
        4 主动方发送消息,确认最终断开         
 
    应用情况 :  适用于传输较大的文件,网络情况良好,需要保证传输可靠性的情况
          比如 :
            网页的获取,文件下载,邮件传输,登录注册
面向无连接的传输服务
  基于UDP协议的传输
    传输特点 : 不保证传输的可靠性,传输过程没有连接和断开的流程,数据收发自由
    应用情况 : 网络情况较差,对传输可靠性要求不高峰,需要提升传输效率。不变连接,需要灵活收发消息。
        比如:网络视频,群聊,广播发送

服务端
  1 创建SOCK对象,流式
    (socket.AF_INET,socket.SOCK_STREAM)
  2 绑定服务地址和端口
  3 监听端口
  4 等待连接
  5 消息收发
  6 关闭
 
import socket,selectors,time
epoll=selectors.DefaultSelector()
host='127.0.0.1'
port=8889
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.bind((host,port))
s.listen(10)
while True:
conn, add = s.accept()
try:
while True:
a=conn.recv(1024)
print(a)
if a.decode('utf8')=='##':
break
conn.send(a)
conn.close()
except:
conn.close()
s.close()

客户端
  1 创建SOCK对象
  2 建立连接 connet
  3 消息收发
  4 关闭
 
import socket,time
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.connect(('127.0.0.1', 8889))
while True:
s.send(bytes('你好',encoding='utf8'))
time.sleep(2)
a=s.recv(1024)
print(a.decode('utf8'))


UDP
套接字传输注意事项
  1 监听套接字存在客户端即可发起连接,但是最终连接的处理需要accept进行处理
  2 如果连接的另外一段,则recv会立即返回空子串不再阻塞
  3 当连接的另一端退出时,再试图send 发送就会产生 BrokenPipeError 网络收发缓冲区
  缓冲区作用: 1 协调收发(处理)速度
         2 减少交互次数
  send和recv 实际上是和缓冲区进行交互,发送缓冲区满时就无法发送,接收缓冲区满时recv才阻塞 TCP粘包
  产生原因:
    tcp 套接字以字节流方式传输,没有消息边界
      发送和接收并不能保证每次发送都及时的被接收
  影响:
      如果每次发送内容表达一个独立的含义此时可能需要处理粘包防止产生歧义
  处理方法
      1 每次发送的消息添加结尾标志(人为增加消息边界)
      2 发送数据结构体
      3 协调收发速度,每次收发后都预留接收时间 UDP
  1 创建数据报套接字
    (sock.AF_INFT,sock.SOCK_DGRAM)
  2 绑定地址 
    bind
  3 消息的收发
  4 conn,addr = s.recvfrom(buffersize)
    参数 :接收UDP消息
    返回值 :data 接收到的数据
         addr 消息发送端的地址   sockfd.sendto(datamaddr)
    功能 :发送UDP消息
    参数 :data 发送的消息 bytes格式
        addr 目标地址
    返回值 :发送的字节数   5 关闭套接字
    socket.close()

网络收发缓冲区
  缓冲区作用: 1 协调收发(处理)速度
         2 减少交互次数
  send和recv 实际上是和缓冲区进行交互,发送缓冲区满时就无法发送,接收缓冲区满时recv才阻塞 TCP粘包
  产生原因:
    tcp 套接字以字节流方式传输,没有消息边界
      发送和接收并不能保证每次发送都及时的被接收
  影响:
      如果每次发送内容表达一个独立的含义此时可能需要处理粘包防止产生歧义
  处理方法
      1 每次发送的消息添加结尾标志(人为增加消息边界)
      2 发送数据结构体
      3 协调收发速度,每次收发后都预留接收时间 UDP
  1 创建数据报套接字
    
  2 绑定地址
    bind
  3 消息的收发
  4 conn,addr = s.recvfrom(buffersize)
    参数 :接收UDP消息
    返回值 :data 接收到的数据
         addr 消息发送端的地址   sockfd.sendto(datamaddr)
    功能 :发送UDP消息
    参数 :data 发送的消息 bytes格式
        addr 目标地址
    返回值 :发送的字节数   5 关闭套接字
    socket.close()


_服务端


——客户端



添加程序第一行
   #!/usr/bin/env python3 TCP套接字编程和UDP套接字编程区别
  1 流式套接字使用字节流的方式传输,数据报套接字以数据报形式传输数据
  2 TCP 会有粘包现象,UDP有消息边界不会形成粘包
  3 TCP 可以保障数据传输完整性,UDP则不保证
  4 TCP 需要进行listen accept 操作UDP不需要
  5 TCP收发消息使用新的套接字,recv send ,udp 使用recvfrom sendto 补充函数
  sendall()
  功能 : 发送 TCP 消息  
  参数 : 要发送的内容,bytes格式
  返回值 : 成功返回None,失败产生异常
 

OSI网络通信工作流程的标准化 ----- 理论的更多相关文章

  1. [信息安全] 3.HTTPS工作流程

    [信息安全]系列博客:http://www.cnblogs.com/linianhui/category/985957.html 0. 简单回顾 在前面两篇博客中介绍了密码相关的一些基本工具,包括(对 ...

  2. 第2章 rsync算法原理和工作流程分析

    本文通过示例详细分析rsync算法原理和rsync的工作流程,是对rsync官方技术报告和官方推荐文章的解释. 以下是本文的姊妹篇: 1.rsync(一):基本命令和用法 2.rsync(二):ino ...

  3. [Inside HotSpot] C1编译器工作流程及中间表示

    1. C1编译器线程 C1编译器(aka Client Compiler)的代码位于hotspot\share\c1.C1编译线程(C1 CompilerThread)会阻塞在任务队列,当发现队列有编 ...

  4. rsync算法原理和工作流程分析

    本文通过示例详细分析rsync算法原理和rsync的工作流程,是对rsync官方技术报告和官方推荐文章的解释.本文不会介绍如何使用rsync命令(见rsync基本用法),而是详细解释它如何实现高效的增 ...

  5. js.ajax优缺点,工作流程

    1.ajax的优点 Ajax的给我们带来的好处大家基本上都深有体会,在这里我只简单的讲几点: 1.最大的一点是页面无刷新,在页面内与服务器通信,给用户的体验非常好.  2.使用异步方式与服务器通信,不 ...

  6. springmvc 运行原理 Spring ioc的实现原理 Mybatis工作流程 spring AOP实现原理

    SpringMVC的工作原理图: SpringMVC流程 . 用户发送请求至前端控制器DispatcherServlet. . DispatcherServlet收到请求调用HandlerMappin ...

  7. rsync(三)算法原理和工作流程分析

    在开始分析算法原理之前,简单说明下rsync的增量传输功能. 假设待传输文件为A,如果目标路径下没有文件A,则rsync会直接传输文件A,如果目标路径下已存在文件A,则发送端视情况决定是否要传输文件A ...

  8. Kubernetes工作流程--<1>

    Kubernetes工作流程 客户端创建pod 流程: 用户管理员创建 Pod 的请求默认是通过kubectl 客户端管理命令 api server 组件进行交互的,默认会将请求发送给 API Ser ...

  9. [网络编程之Socket套接字介绍,套接字工作流程,基于TCP协议的套接字程序]

    [网络编程之Socket套接字介绍,套接字工作流程,基于TCP协议的套接字程序] 为何学习socket套接字一定要先学习互联网协议: 1.首先:要想开发一款自己的C/S架构软件,就必须掌握socket ...

随机推荐

  1. Spring事务管理3----声明式事务管理(1)

     声明式事务管理(1)基于    基于 tx/aop  这种事务管理相比编程式事务管理来说对业务层基本没有改动,通过  TransactionProxyFactoryBean 创建业务层的代理,通过A ...

  2. BigDecimal的toString和toPlainString区别

    创建一个BigDecimal的数,分别调用toPlainString和toString方法 import java.math.BigDecimal; public class Test05 { pub ...

  3. java+大文件分段上传

    一. 功能性需求与非功能性需求 要求操作便利,一次选择多个文件和文件夹进行上传:支持PC端全平台操作系统,Windows,Linux,Mac 支持文件和文件夹的批量下载,断点续传.刷新页面后继续传输. ...

  4. Node.js启动服务报错SyntaxError: Unexpected token import

    启动服务报错如下: Last login: Wed Nov :: on ttys000 localhost:~ sipeng$ cd /Users/sipeng/Desktop/彭思/2017年学习/ ...

  5. 二进制安装k8s-单个master节点、两个node--修改版--有个错误:好多地方确少APISERVER

    centos7.4安装k8s-.11版本,二进制 安装 配置系统相关参数 如下操作在所有节点操作 # 临时禁用selinux # 永久关闭 修改/etc/sysconfig/selinux文件设置 s ...

  6. 【ARTS】01_24_左耳听风-201900422~2019004028

    ARTS: Algrothm: leetcode算法题目 Review: 阅读并且点评一篇英文技术文章 Tip/Techni: 学习一个技术技巧 Share: 分享一篇有观点和思考的技术文章 Algo ...

  7. PyQt5 调用 View 视图的方法

    一.使用Qt Designer 1. 直接引用ui文件: from PyQt5.uic import loadUi class MainWindow(QDialog): def __init__(se ...

  8. QFramework 使用指南 2020(九):Res Kit(3)异步加载 与 异步队列加载

    在上一篇我们了解了 Res Kit 的一些背后设计原理,讲解了一些概念,比如:开发阶段.真机阶段等. 在这一篇,我们回到 Res Kit 使用细节上. 在 Res Kit 的第一篇,我们介绍了 Res ...

  9. python、java、ruby、node等如何提取office文档中的内容?

    我相信大家都有过这样的需求,把doc.ppt.excel.pdf.txt中的文本内容提取出来.提取出来的文本内容可用于文档内容的全文索引,文档的基本内容摘要等.在度娘上搜索“如何提取文档内容”,确实有 ...

  10. 【ARM-Linux开发】 pkg-config的用法

    pkg-config 是一个提供从源代码中编译软件时查询已安装的库时使用的统一接口的计算机软件.pkg-config原本是设计用于Linux的,但现在在各个版本的BSD.windows.Mac OS ...