• 《Python网络编程》学习笔记--从例子中收获的计算机网络相关知识


           从之前笔记的四个程序中(http://www.cnblogs.com/take-fetter/p/8278864.html),我们可以看出分别使用了谷歌地理编码API(对URL表示地理信息查询和如何获取JSON数据都进行的封装)、URL(标识了可通过HTTP获取的文档)、HTTP(支持面向文档的命令,例如GET,使用了原始的TCP/IP套接字,也是在这里遇到了一点麻烦,需要自行处理301错误)、TCP/IP套接字(只处理字符串的发送和接收)。层层深入,Python对各网络层都提供了非常全面的支持。显然也能看出来,越底层程序的质量也明显随之下降。高层的网络协议通常会将其底层网络细节隐藏(类似于OSI参考模型中下层为上层提供服务的概念)。正确实现网络协议并非易事(类如我们遇到的301问题和需要使用代理访问的问题),因此我们尽可能使用标准库和第三方库来实现(造轮子难啊:( )。

      socket()API之下的几层:Transmission Control Protocol (TCP)、Internet Protocol (IP)、最底层的链路层(书上是这么写的,但是按照OSI参考模型应该还有物理层吧)

      书中在第一章中还提到了以下相关知识:

    • 编码与解码

       Python3对字符串和底层字节序列做了明显的区分(字节Byte(8位二进制数)和字符串(包含Unicode字符)),二者的转化使用编码(字符串to字节,encode()方法)和解码(字节to字符串,decode()方法)操作。

      例如书中的程序我做了一点简单的改变

      

    #!/usr/bin/env python3
    # Foundations of Python Network Programming, Third Edition
    # https://github.com/brandon-rhodes/fopnp/blob/m/py3/chapter01/stringcodes.py
    
    if __name__ == '__main__':
        # Translating from the outside world of bytes to Unicode characters.
        input_bytes = b'xffxfe4x001x003x00 x00ix00sx00 x00ix00nx00.x00'
        input_characters = input_bytes.decode('utf-16')
        print(repr(input_characters))
    
        # Translating characters back into bytes before sending them.
        output_characters = 'We copy you down, Eagle.
    '
        output_bytes = output_characters.encode('utf-8')
        with open('eagle.txt', 'wb') as f:  # wb以二进制形式写入文件eagle.txt
            f.write(output_bytes)
            print(output_bytes)

    输出结果为

    '413 is in.'
    b'We copy you down, Eagle.
    '

    而写入文件的结果为

    We copy you down, Eagle.
    • 网际协议Internet Protocol (IP)与IP地址

        将主机名转换为IP地址

    import socket
    
    if __name__ == '__main__':
        hostname = 'www.qq.com'
        addr = socket.gethostbyname(hostname)
        print('The IP address of {} is {}'.format(hostname, addr))

        IPv4(32位二进制数)

        特殊的IP地址段 127.*.*.*(预留地址段) 10.*.*.*  172.16-31.*.* 192.168.*.* (私有子网 private subnet)

         IPv6(32*4=128位二进制数)

    • 路由
    • 数据包分组(DF标记,是否对大于MTU的数据包进行分组)

       补充下 IP头部20字节,TCP头部20字节,UDP头部8字节,以太网的最大容量(包含头部)共1500B

       关于计算机网络部分的知识,还是不细讲了,回顾一下基础知识。

  • 相关阅读:
    【server】瞎写
    【windows c++ 笔记】随笔
    【VScode】使用VScode来写markdown ② 流程图
    【VScode】使用VScode 来写markdown ① 时序图
    【windows c++ 笔记】 正则表达
    【sublime text】中文乱码问题解决过程
    【vue3】从0搭建Vue3项目
    【git】设置VScode为默认查看差异工具
    【lua实战摸索】C API&auxiliary library 使用笔记
    【vue3】监控响应: reactive/watch/watchEffect/provide.inject/computed
  • 原文地址:https://www.cnblogs.com/take-fetter/p/8282463.html
Copyright © 2020-2023  润新知