美文网首页
网络总结

网络总结

作者: Dalvik_ | 来源:发表于2019-01-25 11:03 被阅读0次

    常见的网络攻击

    1.tcp半链接攻击(DoS 拒绝服务式攻击)
    无限发送SYN而不响应ACK
    2.DNS攻击
    查看域名解析的ip地址方法

    nslookup 域名
    例如:
    nslookup baidu.com
    

    3.ARP攻击

    NAT

    网络地址转换器
    国内的路由器(集线器 路由器)

    服务器

    Web服务器使用多线程、多进程的原因:
    如果没有多进程或者多线程,那么任务是单任务的
    1.多进程服务器

    from socket import *
    from multiprocessing import *
    from time import sleep
    
    # 处理客户端的请求并为其服务
    def dealWithClient(newSocket,destAddr):
        while True:
            recvData = newSocket.recv(1024)
            if len(recvData)>0:
                print('recv[%s]:%s'%(str(destAddr), recvData))
            else:
                print('[%s]客户端已经关闭'%str(destAddr))
                break
    
        newSocket.close()
    
    
    def main():
    
        serSocket = socket(AF_INET, SOCK_STREAM)
        serSocket.setsockopt(SOL_SOCKET, SO_REUSEADDR  , 1)
        localAddr = ('', 7788)
        serSocket.bind(localAddr)
        serSocket.listen(5)
    
        try:
            while True:
                print('-----主进程,,等待新客户端的到来------')
                newSocket,destAddr = serSocket.accept()
    
                print('-----主进程,,接下来创建一个新的进程负责数据处理[%s]-----'%str(destAddr))
                client = Process(target=dealWithClient, args=(newSocket,destAddr))
                client.start()
    
                #因为已经向子进程中copy了一份(引用),并且父进程中这个套接字也没有用处了
                #所以关闭
                newSocket.close()
        finally:
            #当为所有的客户端服务完之后再进行关闭,表示不再接收新的客户端的链接
            serSocket.close()
    
    if __name__ == '__main__':
        main()
    

    2.多线程服务器

    from socket import *
    from threading import Thread
    from time import sleep
    
    # 处理客户端的请求并执行事情
    def dealWithClient(newSocket,destAddr):
        while True:
            recvData = newSocket.recv(1024)
            if len(recvData)>0:
                print('recv[%s]:%s'%(str(destAddr), recvData))
            else:
                print('[%s]客户端已经关闭'%str(destAddr))
                break
    
        newSocket.close()
    
    
    def main():
    
        serSocket = socket(AF_INET, SOCK_STREAM)
        serSocket.setsockopt(SOL_SOCKET, SO_REUSEADDR  , 1)
        localAddr = ('', 7788)
        serSocket.bind(localAddr)
        serSocket.listen(5)
    
        try:
            while True:
                print('-----主进程,,等待新客户端的到来------')
                newSocket,destAddr = serSocket.accept()
    
                print('-----主进程,,接下来创建一个新的进程负责数据处理[%s]-----'%str(destAddr))
                client = Thread(target=dealWithClient, args=(newSocket,destAddr))
                client.start()
    
                #因为线程中共享这个套接字,如果关闭了会导致这个套接字不可用,
                #但是此时在线程中这个套接字可能还在收数据,因此不能关闭
                #newSocket.close() 
        finally:
            serSocket.close()
    
    if __name__ == '__main__':
        main()
    

    3.单进程服务器-非阻塞式

    from socket import *
    import time
    
    # 用来存储所有的新链接的socket
    g_socketList = []
    
    def main():
        serSocket = socket(AF_INET, SOCK_STREAM)
        serSocket.setsockopt(SOL_SOCKET, SO_REUSEADDR  , 1)
        localAddr = ('', 7788)
        serSocket.bind(localAddr)
        #可以适当修改listen中的值来看看不同的现象
        serSocket.listen(1000)
        #将套接字设置为非堵塞
        #设置为非堵塞后,如果accept时,恰巧没有客户端connect,那么accept会
        #产生一个异常,所以需要try来进行处理
        serSocket.setblocking(False)
    
        while True:
    
            #用来测试
            #time.sleep(0.5)
    
            try:
                newClientInfo = serSocket.accept()
            except Exception as result:
                pass
            else:
                print("一个新的客户端到来:%s"%str(newClientInfo))
                newClientInfo[0].setblocking(False)
                g_socketList.append(newClientInfo)
    
            # 用来存储需要删除的客户端信息
            needDelClientInfoList = []
    
            for clientSocket,clientAddr in g_socketList:
                try:
                    recvData = clientSocket.recv(1024)
                    if len(recvData)>0:
                        print('recv[%s]:%s'%(str(clientAddr), recvData))
                    else:
                        print('[%s]客户端已经关闭'%str(clientAddr))
                        clientSocket.close()
                        g_needDelClientInfoList.append((clientSocket,clientAddr))
                except Exception as result:
                    pass
    
            for needDelClientInfo in needDelClientInfoList:
                g_socketList.remove(needDelClientInfo)
    
    if __name__ == '__main__':
        main()
    

    select服务器

    import select
    import socket
    import sys
    
    
    server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    server.bind(('', 7788))
    server.listen(5)
    
    inputs = [server, sys.stdin]
    
    running = True
    
    while True:
    
        # 调用 select 函数,阻塞等待
        # inputs 检测列表中的套接字是否可以收数据
        # [] 检测列表中的套接字是否可以发数据
        # [] 检测列表中的套接字是否产生异常
        readable, writeable, exceptional = select.select(inputs, [], [])
    
        # 数据抵达,循环
        for sock in readable:
    
            # 监听到有新的连接
            if sock == server:
                conn, addr = server.accept()
                # select 监听的socket
                inputs.append(conn)
    
            # 监听到键盘有输入
            elif sock == sys.stdin:
                cmd = sys.stdin.readline()
                running = False
                break
    
            # 有数据到达
            else:
                # 读取客户端连接发送的数据
                data = sock.recv(1024)
                if data:
                    sock.send(data)
                else:
                    # 移除select监听的socket
                    inputs.remove(sock)
                    sock.close()
    
        # 如果检测到用户输入敲击键盘,那么就退出
        if not running:
            break
    
    server.close()
    

    epoll服务器

    select----->套接字上限1024----->轮训的方式进行检测
    poll------>解决了套接字上限问题----->轮询检测
    epoll----->解决了套接字上限的问题---->通知机制

    import socket
    import select
    
    # 创建套接字
    s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    
    # 设置可以重复使用绑定的信息
    s.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
    
    # 绑定本机信息
    s.bind(("",7788))
    
    # 变为被动
    s.listen(10)
    
    # 创建一个epoll对象
    epoll=select.epoll()
    
    # 测试,用来打印套接字对应的文件描述符
    # print s.fileno()
    # print select.EPOLLIN|select.EPOLLET
    
    # 注册事件到epoll中
    # epoll.register(fd[, eventmask])
    # 注意,如果fd已经注册过,则会发生异常
    # 将创建的套接字添加到epoll的事件监听中
    epoll.register(s.fileno(),select.EPOLLIN|select.EPOLLET)
    
    
    connections = {}
    addresses = {}
    
    # 循环等待客户端的到来或者对方发送数据
    while True:
    
        # epoll 进行 fd 扫描的地方 -- 未指定超时时间则为阻塞等待
        epoll_list=epoll.poll()
    
        # 对事件进行判断
        for fd,events in epoll_list:
    
            # print fd
            # print events
    
            # 如果是socket创建的套接字被激活
            if fd == s.fileno():
                conn,addr=s.accept()
    
                print('有新的客户端到来%s'%str(addr))
    
                # 将 conn 和 addr 信息分别保存起来
                connections[conn.fileno()] = conn
                addresses[conn.fileno()] = addr
    
                # 向 epoll 中注册 连接 socket 的 可读 事件
                epoll.register(conn.fileno(), select.EPOLLIN | select.EPOLLET)
    
    
            elif events == select.EPOLLIN:
                # 从激活 fd 上接收
                recvData = connections[fd].recv(1024)
    
                if len(recvData)>0:
                    print('recv:%s'%recvData)
                else:
                    # 从 epoll 中移除该 连接 fd
                    epoll.unregister(fd)
    
                    # server 侧主动关闭该 连接 fd
                    connections[fd].close()
    
                    print("%s---offline---"%str(addresses[fd]))
    

    网络层级

    应用层:解决要传递什么数据
    传输层:解决如何传输数据
    网络层:IP 可以理解为地理坐标
    链路层:具体的传输工具

    socket是解决传输层一下的逻辑

    相关文章

      网友评论

          本文标题:网络总结

          本文链接:https://www.haomeiwen.com/subject/hddsjqtx.html