1网络编程OSI协议

今日内容:

网络编程:
 软件开发结构
  1,C/S 架构
   s:  server 服务端
   c:  client 客户端
   客户端:就是指客户端的应用程序,什么时候需要服务就去享受自己喜欢的服务
   服务端:就是24小时都等待为别人服务或者都提供服务的一端
  2,B/S  架构
   s:server 服务器
   b:browser 浏览器,也是一种客户端,只是这个客户端不需要大家去安装什么应用程序,
    只需在浏览器上通过HTTP请求服务器端相关的资源(网页资源),
    客户端Browser浏览器就能进行增删改查。
  ps:微信支付宝都在做同一件事:同一接口
  学习网络编程的目的,就是可以开发一个城市架构的软件
 计算机之间为了更好的通信和更多的计算机进行链接数据交流,
  就必须有一套公共的标准协议,才能使对方读懂你发的数据,或使更多的计算机去读取操作数据,
   此时就必须要有一个公共的标准协议,即OSI协议,此协议只是其中一种
   
  OSI 协议
   应用层
   表示层
   会话层
   传输层
   网络层
   数据链路层
   物理连接层
   
   1,物理连接层:网线,网卡,光缆....
     就是传输高低电信号,即0110的一堆二进制数据
   2,数据链路层:
    1,规定电信号的分组方式
    2,规定任何计算机都有一块网卡,这个网卡上面刻有世界上独一无二的编号
     mac地址由12位16进制数  前6位是厂商编号  后6位是流水线编号
    ps:以上两点合称为“以太网协议”
    
    交换机:就是基于以太网协议通信,不能跨局域网通信
    互联网:就是N多个局域网彼此之间连接而成
   3,网络层
    ip协议
    规定了只要是接入互联网的计算机都必须有一个IP地址
    ip地址特点:点分十进制
    ip地址最小:0.0.0.0
    ip地址最大:255.255.255.255
    ip地址目前有两个版本:IPV4 IPV6(由于IPV4已经不够表示目前存在的计算机了 所以推出了IPV6版本)
    IP地址是动态分配的
   4,传输层 
    TCPUDP都是基于端口工作的协议
    端口(port) 
    
    计算机与计算机之间其实是计算机上的应用程序与应用程序之间的通信
    
    端口:用来唯一标识一台计算机上的某个应用程序
     端口号的范围:0~65535
     注意:0~1024这些都是操作系统默认使用的端口号
     建议:使用8000之后的端口
     MySQL默认端口:3306
     Redis默认端口:6379
     django默认端口:8000
     flask默认端口:5000
     
     端口号是动态分配的
      第一次起qq分配到的是8989
      将qq关闭再次启动端口号可能就变了
      
    TCP协议 :又称流式协议,或者可靠协议
      基于TCP协议通信 必选先建立双向通道
     三次握手四次挥手
  
      客户端向服务端发送请求,这是第一次握手,在此之前客户端一直处于监听状态
      服务端收到请求后给客户端回应,并将与之相对应的信息一起发生给客户端,第二次握手
  客户端收到数据消息时,必须再给服务端发送接收成功的消息,即服务端需要接收到确认消息,第三次握手成功!建立链接
 
  四次挥手,断链接
  客户端(或服务端)向服务端发出请求     第一次挥手
  服务端收到请求后给客户端发送收到请求的确认信息, 第二次挥手
  由于客户端可能存在没有把数据接收完整,服务器还没有完全把数据都发送给客户端,等服务端把数据处理完成发送给客户端,第三次挥手
  客户端再收到服务端的断链接消息后再把断链接消息要发送给服务端,就是服务端确认消息,断开链接,第四次挥手
 
  但服务器收不到客户端发送的收到信息时,在一定时间内会等待,一定时间的再次发送数据,直到时间结束,确定客户端退了或挂了,才会将 
  与之相关的数据进行清除,断开。
    
  PS: IP 地址:是唯一标识接入互联网的一台计算机
   port端口:用来唯一标识一台计算机上应用程序
   ip+port:就是唯一标识互联网一台计算机上的某个应用程序
   
   应用层:协议有HTTP协议 FTP协议
   
  知识点补充:
   时间类型不能直接用json转化为字符串,会报错,必须自己手动转
   import json
   from datetime import datetime,date
   #print(datetime.today())  年月日 时分秒
   # print(date.today())      年月日
    
    #isinstance 判断一个对象是否是某个类的实例
    #issubclass 判断一个类是否是某一个类的子类 或子孙类
    
   class MyJson(json.JSONEncoder):
    def default(self, o):
     if isinstance(o,datetime):
      return o.strftime('%Y-%m-%d %X')
     elif isinstance(o,date):
      return o.strftime('%Y-%m-%d')
     else:
      return super().default(self,o)
      #调用了super(),父类中有default()这个方法
      但是由于我自己定义了,所以优先查找自己的属性方法
      即对父类中的default()方法进行了拦截
      从而也证明了优先查找自己属性,再去查找父类,内置,
      
   res = {'c1':datetime.today(),'c2':date.today()}
   print(json.dumps(res,cls=MyJson))
原文地址:https://www.cnblogs.com/Fzhiyuan/p/11312104.html