• 计算机网络基础 和 socket模块


    (1) a:  c/s  架构  :  client  客户端   和 server 服务器端         能充分发挥pc的性能   

          b:  b/s  架构 : browser  浏览器  和 server 服务器端     隶属于c/s架构     统一了应用的接口

    (2)知识点:

        1,mac地址 ;  是一个物理地址,全球唯一,类似于身份证    是一个十六进制的12位数

        2  ip地址 :   是一个四位点分十进制,它标识了计算机在网络中的位置,类似于学号

        3,  交换机的通信方式 ; 广播:吼一嗓子   单播:  一对一    组播:  一对多

        4, arp协议: 通过目标ip地址获取目标mac地址的一个协议

        5,  端口:  操作系统为本机上每一个运行的程序都随机分配一个端口,其他电脑上的程序可以通过端口获取到这个程序

              ip地址  +  端口  能唯一找到某台电脑上的某个程序

        6,   路由器:     分隔并连接不同的网段

        7,   网关:   类似于局域网的出口和入口

        8,   网段:  一个局域网内的ip地址范围

        9:   子网掩码:   子网掩码  &  ip地址    得到网段

        10:   osi  五层模型

            应用层    :    http,https,ftp

            传输层    :    tcp/udp         四层交换机和路由器

            网络层     :    ip协议         三层交换机和路由器

            数据链路层:  arp协议       以太网交换机   网卡  网桥

            物理层     :   传输电信号      集线器,网线  光纤

     3,socket   模块  又叫做套接字    有多种类型的,一般用两种

              sk = socket.socket(family = AF_INET, type=SOCK_STREAM)

    family:

             AF_UNIX基于文件类型的套接字   基于unix系统开发,为了同一台电脑上多个程序直接通信,unix系统的中心思想是 : 一切皆文件

             AF_INET基于网络类型的套接字

    type:

             SOCK_STREAM      字节流类型   ===>    tcp协议  可靠的,面向连接的, 面向字节流形式的传输方式

              SOCK_DGRAM        报文类型     ===>     udp协议  不可靠的,不面向连接的,面向数据包的传输方式,但是它快

    利用tcp 实现一个简单的交互

    #服务器端
    # import socket
    # ret = socket.socket()                  #括号内不传参数,默认 family = 基于网络类型的套接字(AF_INET), type = SOCK_DGRAM
    # ret.bind(('192.168.12.104',18080))     #端口的范围0-65535   但是0-1023 是给操作系统用的不让用
    # ret.listen()                           #打开可被连接状态
    # conn,addr = ret.accept()               #等待接受客户端连接的连接,阻塞等待
    # s1 = conn.recv(10000)                  #接收数据,指定最高接受某个字节
    # print(s1.decode('utf-8'),addr)         #将接受到的byte解码成需要的格式
    # s1.close()                             #关闭本次连接
    # ret.close()                            #关闭服务器
    #客户端
    # import socket
    # ret = socket.socket()                      #实例化一个类
    # ret.connect(('192.168.12.104',18080))    #连接服务器的IP.和端口   定位到程序
    # ret.send('你好啊!'.encode('utf-8'))       #发送byte类型的数据类型,如果是中文需要编码
    # ret.close()                                 #关闭连接
    View Code

     4,tcp协议:     '127.0.0.1'每个计算机都有这么一个本机地址,只能被本机识别,不能被其他机器识别

        tcp协议一次只能链接一个客户端,不能同时和多个客户端通信

        tcp协议的三次握手:  注意:一定是client先发起请求

                                           a: 客户端向服务器发送链接请求

                                           b: 服务器收到请求并返回客户端请求连接

                                           c: 客户端回应可以连接

        tcp协议的四次挥手:   注意:双发谁先发起断开连接都可以

                                           a;客户端发起断开连接的请求(如果你有数据需要发送,可以继续接受)

                                           b:服务器回复:我收到你的请求了

                                           c;服务器发送已经准备好断开连接了

                                           d:客户端回复:收到你的信息,断开连接

     5TCP协议实现远程操作系统的文件编程    

    # TCP协议实现远程操作主机(服务器端)
    import socket
    import subprocess
    ret = socket.socket()
    ret.bind(('127.0.0.1',9528))
    ret.listen()
    
    conn,addr = ret.accept()
    while 1:
        num = conn.recv(1024).decode('utf-8')         #接受远程客户端的命令,当作系统命令
        s1 = subprocess.Popen(num,shell=True,         #告诉本服务器(主机)操作系统,将cmd当成系统命令去执行
                              stdout=subprocess.PIPE, #是执行完系统命令之后,用于保存正确结果的一个管道
                              stderr=subprocess.PIPE) #是执行完系统命令之后,用于保存错误结果的一个管道
        stdout = s1.stdout.read()
        stderr = s1.stderr.read()
        conn.send(stdout+stderr)                      #双显示,择一显示
    conn.close()
    ret.close()
    
    # TCP协议实现远程操作主机(客户端)
    import socket
    ret = socket.socket()
    ret.connect_ex(('127.0.0.1',9528))
    while 1:
        num = input('请输入你要操作的命令:')
        ret.send(num.encode('utf-8'))
        a = ret.recv(1024).decode('gbk')
        print(a)
    ret.close()
    View Code

    6,TCP协议实现聊天

    #TCP协议实现互相聊天(服务器)
    import socket
    ret = socket.socket()
    ret.bind(('127.0.0.1',9527))
    ret.listen()
    info,addr = ret.accept()
    # print(info)
    while 1:
        msg = info.recv(2048).decode('utf-8')
        if msg.upper() == 'Q':
            break
        print('33[31;42m',msg,'33[0m')
        msn = input('请输入要发送的消息:').encode('utf-8')
        if msn.upper() == 'Q':
            break
       info.send(msn)
    info.close()
    ret.close()
    
    #TCP协议实现互相聊天(客户端)
    import socket
    ret = socket.socket()
    ret.connect(('127.0.0.1',9527))
    while 1:
        msn = input('请输入要发送的消息:')
        if msn.upper() == 'Q':
            break
        ret.send(msn.encode('utf-8'))
        msg = ret.recv(2048).decode('utf-8')
        if msg.upper() == 'Q':
            break
        print('33[31;42m',msg,'33[0m')
    ret.close()

    7,粘包问题          注意::  只有tcp协议才会发送粘包,udp不会发送

         一,TCP协议中:(粘包的发生过程)

    (1)当发送端多次连续发送且发送间隔较小的数据,tcp协议中会用合包机制(nagle算法),会等待这些数据打包成一块发送,数据没有切割符,有时会粘包

    (2)当发送端发送较大数据的时候,因受到网卡MTU的限制,会将数据进行拆分成多个小的数据(拆分机制,发生在发送端)

        当传送到目标主机后,操作系统会将多个小的数据合并成原本的数据

         二,UDP协议中    (究竟一次收发多少字节合适?)

      传输层:udp协议对一次收发数据大小的限制是: 65535 - ip包头(20) - udp包头(8) = 65507 

      数据链路层:由于MTU的限制  一次收发数据的大小被限制在  1500 - ip包头(20) - udp包头(8) = 1472

      结论:

              1472< 数据大小<65507   会在数据链路层拆包,因为是不可靠协议,拆分之后,如果丢任意一个数据包,那么此次数据传输失败

        

       

       

       

  • 相关阅读:
    EasyUI 常用图标
    DataGridView滚动条联动
    FTP下载工具
    C# 解析带命名空间的xml
    1.基于3.x版本vue脚手架创建新项目
    js处理异步的几种方式
    JS字符串常用方法
    git(开源的分布式版本控制系统)
    js检查数据类型的方法
    数组的常用方法
  • 原文地址:https://www.cnblogs.com/laogao123/p/9456772.html
Copyright © 2020-2023  润新知