01_网络编程基础理论

1.OSI七层模型: 将功能分开,降低网络传输中的耦合度,每一部分完成自己的功能,开发更加清晰

1.应用层(Application): 提供用户服务,具体内容有特定程序规定

        网络服务与最终用户的一个接口

        协议有: HTTP FTP TFTP SMTP SNMP DNS

2.表示层(Presentation Layer): 提供数据的压缩解压缩和加密等

        数据的表示,安全,压缩

        格式有,JPEG,ASCll,DECOIC,加密格式等

3.会话层(Session Layer): 建立程序的连接,决定使用什么样的传输服务

        建立,管理,终止会话

        对应主机进程,指本地主机与远程主机正在进行的会话

4.传输层(Transport): 提供合适的通信服务,流量控制

        基于端口(port)

        传输层由来: IP地址帮我们区分子网,mac地址帮我们找到主机,但却需要一个端口定位具体应用程序,端口即为应用程序与网卡的编号

        传输层功能: 建立端口到端口通信,范围:0-65535,0-1023为系统占用端口

        TCP协议: 面向连接可靠的数据传输,没有长度限制但不超过IP包长度,在IP包头中用2个字节描述报文长度,2个字节所能表达的最大数字就是65535
            可靠传输: 无失序,无差错,无丢失,无重复
            应用情况: 适用于传输内容较大,网络情况好,需要提供准确传输的情况,如聊天信息,文件传输,邮件
            TCP的三次握手与四次挥手流程图: https://www.processon.com/view/link/5ef9200d7d9c0844203a1449

            三次握手
                1.客户端向服务器发起连接请求(问是否可以连接)
                2.服务器接收到请求后进行确认(允许连接)返回报文
                3.客户端收到许可,建立连接

            四次挥手
                1.主动方发送报文告知被动方要断开连接
                2.被动方返回报文,告知受到请求,准备断开
                3.被动方发送报文给主动方告知准备就绪可以断开
                4.主动方发送报文确定断开

            连接
                TCP在真正的读写操作之前,server与client之间必须建立一个连接
                当读写操作完成后,双方不再需要这个连接时它们可以释放这个连接
                短连接和长连接流程图: https://www.processon.com/view/link/5efca678e401fd1fd2bbe605

            长连接
                1.client 向 server 发起连接
                2.server 接到请求,双方建立连接
                3.client 向 server 发送消息
                4.server 回应 client
                5.一次读写完成,连接不关闭
                6.后续读写操作...
                7.长时间操作之后client发起关闭请求

            短连接
                1.client 向 server 发起连接请求
                2.server 接到请求,双方建立连接
                3.client 向 server 发送消息
                4.server 回应 client
                5.一次读写完成,此时双方任何一个都可以发起 close 操作

            TCP长/短连接的优缺点
                长连接可以省去较多的TCP建立和关闭的操作,减少浪费,节约时间,对于频繁请求资源的客户来说,较适用长连接
                长连接多用于操作频繁,点对点的通讯,而且连接数不能太多情况,如数据库的连接用长连接
                短连接对于服务器来说管理较为简单,存在的连接都是有用的连接,不需要额外的控制手段
                短连接下客户请求频繁,将在TCP的建立和关闭操作上浪费时间和带宽
                并发量大,但每个用户无需频繁操作情况下需用短连好,如WEB网站

        UDP协议: 面向无连接的服务 不可靠的数据传输,报头8字节,总长不超过65535字节,刚好放进一个IP包
            发送时由发送端自主进行,不考虑接收端
            适用情况: 网络较差,对传输准确性要求低,广播组播
            比如: 视频会议, 广播数据

        物理设备: 四层交换机,四层路由器

5.网络层(Network): 路由选择,网络互联,分组传输

        基于IP地址(IPv4, IPv6)

        网络层由来: 世界大网路由是由一个个小的彼此隔离的局域网组成,以太网包只能在一个局域网内发送
            一个局域网是一个广播域,以太网的广播只能在一个广播域内发送,跨广播域发送只能由路由转发

        网络层功能: 规定网络地址的协议即IP协议,广泛采用的v4版本即ipv4,帮我们区分子网

        IP协议: 网络地址由32位2进制表示,范围: 0.0.0.0-255.255.255.255

        Windows用cmd查询网卡命令: ipconfig

        Linux终端中查询网卡命令: ifconfig

        拼命令(ICMP协议): ping 域名/网址

        物理设备: 路由器(有对外身份:外网IP),三层交换机

        路由器和交换机的区别
            交换机的主要功能: 组织局域网,经过交换机内部处理解析信息之后,将信息以点对点,点对多的形式发送给固定端
            路由器的主要功能: 跨网段进行数据传输,路由选择最佳路径

        子网掩码: 表示网络特征的一个参数,形式上等同于IP地址也是一个32位二进制数字,它的网络部分全部是1,主机部分全部是0
            子网掩码示例: 255.255.255.0
                网络位: 255.255.255
                主机位: 0

        标准的子网掩码
            定义: 指明一个IP地址的哪些位标识的是主机所在的子网,哪些位标识的是主机的位掩码
            A类IP地址的标准子网掩码: 255.0.0.0
            B类IP地址的标准子网掩码: 255.255.0.0
            C类IP地址的标准子网掩码: 255.255.255.0

子网判定

            1.将两个IP地址与子网掩码分别进行AND运算(两个数位都是1,运算结果是1,否则0),结果相同则在同一子网

            2.通过基于ICMP协议的ping命令去ping对方的ip地址, 可以ping通也表示在同一个子网

通过网络地址判定两个IP地址在不在子网示例:
    A主机的IP,子网掩码,按位与计算得出A主机的网络地址:
        192.168.0.100        1100 0000    1010 1000    0000 0000    0110 0100
        255.255.255.0        1111 1111    1111 1111    1111 1111    0000 0000
        192.168.0.0          1100 0000    1010 1000    0000 0000    0000 0000
    B主机的IP,子网掩码,按位与计算得出B主机的网络地址:
        192.168.0.137        1100 0000    1010 1000    0000 0000    1000 1001
        255.255.255.0        1111 1111    1111 1111    1111 1111    0000 0000
        192.168.0.0          1100 0000    1010 1000    0000 0000    0000 0000
    A主机的网络地址和B主机的网络地址一样,所有A主机和B主机在同一个子网
通过ping命令判定两个IP地址在不在子网示例:
    ping 192.168.0.137
    """执行结果
        PING 192.168.0.137 (192.168.0.137): 56 data bytes
        64 bytes from 192.168.0.137: icmp_seq=0 ttl=64 time=0.049 ms
        64 bytes from 192.168.0.137: icmp_seq=1 ttl=64 time=0.161 ms
        64 bytes from 192.168.0.137: icmp_seq=2 ttl=64 time=0.171 ms
        64 bytes from 192.168.0.137: icmp_seq=3 ttl=64 time=0.158 ms
        ^C
        --- 192.168.0.137 ping statistics ---
        4 packets transmitted, 4 packets received, 0.0% packet loss
        round-trip min/avg/max/stddev = 0.049/0.135/0.171/0.050 ms
    """
IP地址分类

            IPv4地址分类流程图: https://www.processon.com/view/link/5ef2818e5653bb2925b228f2target

            A类IP地址:
                一个A类IP地址由1字节的网络地址和3字节主机地址组成,网络地址的最高位必须是"0"
                地址范围: 1.0.0.1-126.255.255.254  # 0和127网段有特殊意义
                二进制表示为: 00000001 00000000 00000000 00000001 - 01111110 11111111 11111111 11111110
                可用的A类网络有126个,每个网络能容纳1677214个主机

            B类IP地址:
                一个B类IP地址由2个字节的网络地址和2个字节的主机地址组成,网络地址的最高位必须是"10"
                二进制表示为: 10000000 00000001 00000000 00000001 - 10111111 11111111 11111111 11111110
                地址范围: 128.1.0.1-191.255.255.254
                B类网络有16384个,每个网络能容纳65534主机

            C类IP地址:
                一个C类IP地址由3字节的网络地址和1字节的主机地址组成,网络地址的最高位必须是"110"
                地址范围: 192.0.1.1-223.255.255.254
                C类网络有2097152个,每个网络能容纳254个主机

            D类IP地址:
                D类IP地址第一个字节以"1110"开始,它是一个专门保留的地址
                它并不指向特定的网络,目前这一类地址被用在多点广播(Multicast)中
                用于多点广播,多点广播地址用来一次寻址一组计算机 s 地址范围224.0.0.1-239.255.255.254

            E类IP地址:
                以"1111"开始,为将来使用保留
                E类地址保留,仅作实验和开发用

            1.公有IP地址分类: inter NIC机构分配给注册组织的IP地址

            2.私有IP地址分类: 私有地址(private address)属于非注册地址,专门为非组织机构使用
                在这么多网络IP中,国际规定有一部分IP地址是用于我们的局域网使用,也就是属于私网IP,不在公网中使用的
                私网IP地址范围:
                    10.0.0.0~10.255.255.255
                    172.16.0.0~172.31.255.255
                    192.168.0.0~192.168.255.255

            3.回路测试IP地址: 127.0.0.1~127.255.255.255  # 用于回路测试

6.链路层(Link): 提供链路交换,具体消息发送

        基于以太网卡固定的Mac地址
        数据链路层由来: 单纯的电信号0和1没有任何意义,必须规定电信号多少位一组,每组什么意思
        数据链路层功能: 定义了电信号的分组方式以太网协议,帮我们找到主机
        ARP协议: 通过目标主机的ip地址获取目标主机Mac地址的一个协议
        数据包组成:
            head + data 组成的一个数据包(最短64B,最大1518B)
            head = 发送者mac地址(6B)+接收者mac地址(6B)+数据类型(6B)
            data: 数据包具体内容(最短46B,最大1500B)

        通讯原理: 广播
        物理设备: 网桥,网卡,以太网交换机
        Mac地址: ac:bc:32:bf:6e:25  # 物理地址,全球唯一,前三位表示生产厂家,后三位表示生产厂家生产的那一块网卡

A主机给B主机第一次发包三步

            第一步: 先计算判定A主机和B主机在不在一个子网

            在一个子网内(直接通过交换机转发数据包,ip和mac都不变)
                第二步:
                    A主机先看自己缓存区里也有没有B主机的mac地址,有的话直接到第三步
                    A主机通过arp协议单播发给交换机,交换机收到后在子网内广播(ff:ff:ff)
                    B主机收到广播数据后通过对比ip地址,发现A主机是要拿自己的mac地址
                    B主机通过单播回送给交换机包含自己的mac地址的包,交换机缓存B主机的ip和mac
                    交换机再把包通过单播发送给A主机
                    此时A主机成功的拿到B主机的mac地址,并将B主机的mac地址缓存到本地
                第三步: A主机由单播方式发包给交换机,交换机再单播把包发送给B主机

            不在一个子网内(通过交换机和路由器转发数据包,ip不变,mac改变)
                第二步:
                    A主机先看自己缓存区里也有没有A主机所在子网路由器的mac地址,有的话直接到第三步
                    A主机通过arp协议单播发给交换机,此时目标ip是A主机所在子网内路由器的网关ip(例如: 192.168.1.1)
                    A主机所在的交换机没有缓存A主机所在子网路由器的ip和mac
                        A主机所在的交换机收到包后会在子网内广播(ff:ff:ff)
                        A主机所在的路由器收到广播数据后通过对比ip地址,发现A主机是要拿自己的mac地址
                        A主机所在的路由器通过单播回送给交换机包含自己的mac地址的包
                        此时A主机所在的交换机会缓存A主机所在的路由器的ip和mac信息
                    A主机所在的交换机缓存了A主机所在子网路由器的ip和mac
                        A主机所在的交换机收到包后会单播发送给A主机所在子网的路由器
                        A主机所在的路由器通过单播回送给交换机包含自己的mac地址的包
                    A主机所在的交换机再把包通过单播发送给A主机
                    此时A主机成功的拿到A主机所在子网的路由器的mac地址,并将mac地址缓存到本地
                第三步:
                    1.A主机的数据包在A主机子网内的过程
                        A主机通过arp协议单播发给交换机,此时目标ip是B主机ip,而目标mac是A主机所在子网的路由器的mac地址
                        交换机收到A主机的包后将通过单播发送给A主机所在子网内的路由器
                    2.A主机的数据包在路由间的过程
                        A主机的包由A主机子网内的路由器转发到中间路由
                        中间路由再把A主机的包发到B主机所在子网的路由器
                        注: 中间路由的转发次数由实际A主机和B主机间的路由设备来决定
                    3.A主机的数据包在B主机子网内的过程
                        B主机所在子网的路由器将A的包发给B主机所在的交换机
                        B主机所在的交换机没有缓存B主机的ip和mac信息
                            B主机所在的交换机收到A主机的包后在B主机所在的子网内广播(ff:ff:ff)
                            B主机收到广播数据后通过对比ip地址,发现是A主机给自己的包
                        B主机所在的交换机缓存了B主机的ip和mac信息
                            B主机所在的交换机通过单播把A主机的数据包发送给B主机

            补充:
                1.如果是通过集线器发包,那么即使A主机拿到了B主机的mac地址依然是在一个通过广播方式发包
                2.可以通过命令查看本地缓存的mac地址: arp -a

arp攻击-中间人攻击

            正常来说A主机要给B主机发包会经历发包三步
            但是在A主机给B主机发包之前,C主机先回一个基于arp协议的包告诉A主机B主机的mac地址是自己的mac地址
            此时A主机会在缓存记录B主机的mac地址实际是C主机的mac地址,此时A主机向B主机发包会发给C主机
            B主机等待A主机发包,但是C主机先回一个基于arp协议的包告诉B主机A主机的mac地址是自己的mac地址
            此时A主机开始给B主机发包,C主机在收到A主机的包时在本地拷贝一份数据,再将数据包发送给B主机

7.物理层(Physical Layer): 物理硬件,接口

        基于物理层面的链接
        物理层由来: 计算机之间的物理连接网,如光纤,电缆,双绞线,无线电波
        物理层功能: 主要基于电器特性发送高低电压(电信号)高电压对应数字1,低电压对应数字0
        物流设备: 集线器,网线,光纤
        双绞线(网线)线序
            1->T568A: 绿白 绿 橙白 蓝 蓝白 橙 棕白 棕
            2->T568B: 橙白 橙 绿白 蓝 蓝白 绿 棕白 棕
            交叉线: T568A----T568B 用于同种设备连接(交换机连交换机)
            直通线: T568A----T568A(T568B----T568B) 不同设备连接(PC机连交换机)

2.OSI五层模型(TCP/IP模型)

    应用层: 应用层,表示层,会话层

    传输层: 传输层

    网络层: 网络层

    链路层: 链路层

    物理层: 物理层

3.OSI四层模型

    应用层: 应用层,表示层,会话层

    传输层: 传输层

    网络层: 网络层

    物理链路层: 链路层,物理层

4.什么是协议

    网络协议概述: 网络通信中,各方必须遵守规定,包括建立连接,如何识别,消息结构等

    应用层: FTP, TFTP, HTTP, HTTPS, SMTP, DNS

    传输层: TCP, UDP

    网络层: IP

    数据链路层: ARP协议

    物理层: 传输电信号

    TCP/IP协议族中各协议之间的关系流程图: https://www.processon.com/view/link/5efdf74e07912929cb6e292d

    TCP/IP协议传输流程图: https://www.processon.com/view/link/5efdfba1f346fb1ae58de263

5.主机,IP,PORT,网段,子网掩码,DNS,字节序

    1.主机: 计算机的名称(本机 localhost)

获取主机名
    In [1]: import socket

    In [2]: socket.gethostname()
    Out[2]: 'MacBook-Pro.local'
通过主机名解析IP
    In [3]: socket.gethostbyname('MacBook-Pro.local')
    Out[3]: '127.0.0.1'

    In [4]: socket.gethostbyname('localhost')
    Out[4]: '127.0.0.1'
获取服务器别名和地址
    In [5]: socket.gethostbyaddr('www.baidu.com')
    # 返回的元祖第一项是服务器的主机名称,第二项是服务器别名,第三项是服务器地址
    Out[5]: ('www.baidu.com', ['38.177.215.14.in-addr.arpa'], ['14.215.177.38'])

    In [6]: socket.gethostbyaddr('14.215.177.38')
    Out[6]: ('www.baidu.com', ['38.177.215.14.in-addr.arpa'], ['14.215.177.38'])

    2.IP地址
        IPv4: 点分十进制,三个点分为四个部分,每个部分范围是 0-255
            示例: 192.168.1.2
                127.0.0.1: 本地回环地址(本地测试ip)
                0.0.0.0: 局域网可用IP
                192.168.1.0: 表是网段
                192.168.1.1: 网关
                192.168.1.255: 广播地址
        IPv6: ip地址更多

将IP地址转换为二进制:
    In [5]: socket.inet_aton('192.168.1.2')
    Out[5]: b'\xc0\xa8\x01\x02'

将二进制转换为点分十进制:
    In [6]: socket.inet_ntoa(b'\xc0\xa8\x01\x02')
    Out[6]: '192.168.1.2'

指定以v4协议还是v6协议转换 inet_pton & inet_ntop:
    In [7]: socket.inet_pton(socket.AF_INET, '192.168.1.2')
    Out[7]: b'\xc0\xa8\x01\x02'
    In [8]: socket.inet_ntop(socket.AF_INET, b'\xc0\xa8\x01\x02')
    Out[8]: '192.168.1.2'
    # socket.AF_INET 表示IPv4
    # socket.AF_INET6 表示IPv6

    3.PORT端口
        定义: 端口号是地址的组成部分,在一个系统中用于区分应用程序
        端口取值范围1-65535
            1-255: 众所周知的端口
            256-1023: 系统端口
            1024-65535: 动态端口
        获取一个应用的端口

In [9]: socket.getservbyname('mysql')
Out[9]: 3306

In [10]: socket.getservbyname('http')
Out[10]: 80

In [11]: socket.getservbyname('https')
Out[11]: 443

In [12]: socket.getservbyname('ssh')
Out[12]: 22

In [13]: socket.getservbyname('ftp')
Out[13]: 21

    4.网段: 一个局域网内ip地址的范围

    5.子网掩码: 和ip地址进行&运算,得出计算计算机网段

    6.DNS: 域名解析

    7.字节序:
        在不同的设备上针对数据类型存储的方式不同
        大端序: 高字节存在低地址,例如数值14对应二进制1110按大端序存储为: 1110
        小端序: 低字节存在低地址,例如数值14对应二进制1110按小端序存储为: 0111
        网络字节序: 在消息的发送和接收程中都按照网络字节序的方式进行解析,其实就是采用了大端序将字节发送方式统一

6.网络通信中的单工,半双工,全双工

    单工: 单项通信,要么只能收, 要么只能发,例如收音机
    半双工: 发的时候不能收, 收的时候不能发,例如对讲机
    全双工: 发的时候可以收, 收的时候可以发,例如电话,socket

7.多任务

    CPU的调度算法: 时间片轮转,优先级调度
    并行:真的多任务,cup数>=任务数,任务真的是一起执行的
    并发:假的多任务,cup数<任务数,通过操作系统的各种任务调度算法,实现用多个任务一起执行
        实际上总有一些任务不在执行,因为切换任务的速度相当快,看上去一起执行而已

8.静态URL

    静态URL类似 域名/news/2012-5-18/110.html 我们一般称为真静态URL,每个网页有真实的物理路径,也就是真实存在服务器里的
    优点: 网站打开速度快,因为它不用进行运算,另外网址结构比较友好利于记忆
    缺点: 最大的缺点是如果是中大型网站,则产生的页面特别多,不好管理
    SEO影响: 静态URL对SEO肯定有加分的影响,因为打开速度快,这个是本质

9.动态URL

    动态URL类似 域名/DaiKuan.php?id=17,带有?号的URL,一般称为动态网址,每个URL只是一个逻辑地址,并不是真实物理存在服务器硬盘里的
    优点: 适合中大型网站,修改页面很方便,因为是逻辑地址,所以占用硬盘空间要比纯静态网站小
    缺点: 因为要进行运算所以打开速度稍慢,目前有服务器缓存技术可以解决速度问题,最大的缺点是URL结构稍稍复杂不利于记忆
    SEO影响: 目前百度SE已经能够很好的理解动态URL,所以对SEO没有什么减分的影响(特别复杂的URL结构除外)

10.伪静态URL

    伪静态URL类似 域名/course/74.html 这个URL和真静态URL类似,他是通过伪静态规则把动态URL伪装成静态网址,也是逻辑地址不存在物理地址
    优点: URL比较友好,利于记忆,非常适合大中型网站,是个折中方案
    缺点:
        1.设置麻烦,服务器要支持重写规则,另外进行了伪静态网站访问速度并没有变快
        2.因为实质上它会额外的进行运算解释,反正增加了服务器负担,速度反而变慢
        3.还有可能会造成动态URL和静态URL都被搜索引擎收录,不过可以用robots禁止掉动态地址
    SEO影响: 和动态URL一样,对SEO没有什么减分影响

 

posted @ 2020-08-19 22:46  唐雪成  阅读(378)  评论(0编辑  收藏  举报