美文网首页
网络总结

网络总结

作者: 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是解决传输层一下的逻辑

相关文章

  • iOS开发·网络请求方法总结复习(下)

    iOS开发·网络请求方法总结复习(下) iOS开发·网络请求方法总结复习(下)

  • 网络总结

    概述

  • 网络总结

    开启超级终端 enbleconfig terminal 开启端口/接口 no shutdown 设置IP地址 ip...

  • 网络总结

    1.UDP(⽤用户数据报协议) 只管发送,不不确认对⽅方是否接收到 将数据及源和⽬目的封装成数据包中,不不需要建⽴...

  • 网络总结

    常见的网络攻击 1.tcp半链接攻击(DoS 拒绝服务式攻击)无限发送SYN而不响应ACK2.DNS攻击查看域名解...

  • iOS网络总结

    iOS网络总结

  • 2019-04-25 第六周作业

    1. 总结IP地址规划 有类地址网络ID固定 无类地址网络ID不固定 2. 总结常见网络管理命令 ifconfig...

  • iOS知识体系总结-网络相关

    注意:更新内容会同步到GitHub iOSWiki-知识体系总结 总结-网络相关 iOS知识点/网络相关 #iOS...

  • 网络课总结

    改变的力量,在网络课的环境下悄然发生。方式变了,手段变了,我们也在变。 一学期的彩虹花晨读又迈步走过了。回悟思考,...

  • 面试总结--网络

    OSI与TCP/IP各层的结构与功能,都有哪些协议 物理层:在物理媒体上传输原始的数据比特流。 数据链路层:将数据...

网友评论

      本文标题:网络总结

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