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. [ML] Roadmap: a long way to go

    看上去不错的博文: 机器学习的经典算法一览 (一) 机器学习的经典算法一览 (二)       1.引言 正文将详细介绍传统机器学习算法,基本思想和用途.把问题解决思路和方法应用建议提前到这里的想法也 ...

  2. 【论文笔记】DeepOrigin: End-to-End Deep Learning for Detection of New Malware Families

    DeepOrigin: End-to-End Deep Learning for Detection of New Malware Families 标签(空格分隔): 论文 论文基本信息 会议: I ...

  3. xampp 启动mysql 显示busy

    1.端口被占用问题:2.默认3306端口并没有被占用:3.删除xampp\mysql\data\下的ibdata1再重启:4.没装其他mysql.

  4. centos安装软件

    rpm指令, 该指令安装文件后缀.rpm的可执行程序 yum指令 安装软件源代码,后缀为 .tar.gz(用gzip压缩过的tar包) rpm rpm软件包格式为 (一)查询系统装已经安装的软件信息 ...

  5. Linux系统查看CPU使用率命令

    在linux的系统维护中,可能需要经常查看cpu使用率,分析系统整体的运行情况.而监控CPU的性能一般包括以下3点:运行队列.CPU使用率和上下文切换. 1.top 这个命令很常用,在第三行有显示CP ...

  6. 《精通并发与Netty》学习笔记(15 - 详解NIO中Buffer之position,limit,capacity)

    一.前言熟悉NIO的人想必一定不会陌生buffer中position,limit,capacity这三个属性吧,之前在学习的时候遇到一个问题:就是当你先往缓冲区写入一部分数据,然后调用flip()方法 ...

  7. 小米 9 SE 获取Root 和 安装Magisk

    1.刷入第三方REC 和 Magisk 参考教程:[LR.Team]小米9SE专版TWRP中英文修改优化版_小米9 SE_MIUI论坛 使用上面的工具,傻瓜式操作即可. 关于刷入成功之后的说明:刷入成 ...

  8. Union All 使用注意事项和字段顺序不一致导致的异常

    使用注意,先说结果: UNION 操作符用于合并两个或多个 SELECT 语句的结果集,这里需要注意的是: UNION 内部的 SELECT 语句必须拥有相同数量的列: 列也必须拥有相似的数据类型(实 ...

  9. 在centos 7下升级内核

      前言 今天读了一篇老外的文章,讲的是如何在linux环境下升级内核.比较暴力,比较简单,故做个记录.   文章中,作者先列出一个常识:linux是内核名,不是系统名.我们平时说的"lin ...

  10. C语言字符串替换

    void exchg(char * str) { if(str == NULL) return; int len = strlen(str); char tmp; for(int i=0,j=len- ...