04.Python修炼之路【08-网络通信】2018.04.25

关键字:Packet Tracer、DNS(Domain Name System)、Switch(交换机)、Router(路由器)、Netmask(掩码)、Sub  Netmask(子网掩码)


一、Packet Tracer介绍

         Packet Tracer 是由Cisco(著名网络公司,思科)公司发布的一个辅助学习工具,
为学习思科网络课程的初学者去设计、配置、排除网络故障提供了网络模拟环境。
用户可以在软件的图形用户界面上直接使用拖曳方法建立网络拓扑,并可提供数据包在网络中行进的详细处理过程,观察网络实时运行情况。

             

                                 

二、一些问题汇总

         0. 两台电脑之间能互相通信的前提是什么?

             在同一网段内。若两台电脑通过网络掩码与ip地址按位与之后,得到的网络地址一致,则说明在同一网段内。

         1. 多台电脑之间为什么不能把网线剪开连接在一块?

             数据是通过电信号来发送的,若多个电信号一起发送,一起接收,会导致网络堵塞甚至瘫痪,所以不能。

         2. 链接多台电脑的hub(集线器)有什么作用?

             实现多台电脑连接在一起,能够组成一个小型的局域网

         3. 集线器和交换机的区别?

             集线器收到的数据包都会以广播的方式发送,交换机是自动完成信息交换功能的设备,具有转发过滤和学习功能,功能强大、效率高。

三、协议类型(均隶属于网络层)

ICMP:Internet Control Message Protocol(Internet控制消息协议)

           检查网络通不通ping一台电脑

 ARP:Address Resolution Protocol(地址解析协议)

           获取一台电脑上的网卡号,就是MAC地址;根据IP找MAC(物理地址,MAC工作在数据链路层)

           ARP缓存是用来储存IP地址和MAC地址的缓冲区,其本质就是一个IP地址-->MAC地址的对应表                

 RARP:Reverse Address Resoultion Protocol  (反向地址解析协议)

            获取对方电脑的IP,根据MAC找IP


四、交换机、路由器功能以及区别

         交换机:只连接在同一网段的物理设备

                       工作在数据链路层

         路由器:连接不同网段的网络,使他们彼此之间能够相互通信,采用三层交换机的方式进行通信

                       工作在网络层

五、IP与MAC的功能以及不同

       IP:IP地址在整个通信过程中不会发生变化;标记的是逻辑上的地址

       MAC:在两个设备之间通信时,在动态的变化;标记的是实际转发数据的设备地址

       netmask:与ip地址一起确定网络号

       默认网关:如果发送一方的ip地址与目的ip地址不在同一网段内,那么会把这个数据先发送给,发送一方本地电脑的默认网关上,通过默认网关将数据发送给路由器,路由器再根据自己的路由协议,选择一个比较合适的路径转发数据给目的网关,目的网关将数据发送给DNS服务器,DNS服务器再将查询得到的ip地址原路返回给请求这个域名的client。

       DNS: 域名系统,一般网络通信过程中,是通过获取对方ip来进行连接通信,但是ip不便于记忆,于是便出现了像www.baidu.com等便于记忆的域名。(使用UDP协议)

       DHCP:(Dynamic Host Configuration Protocol,动态主机配置协议)通常被应用在大型的局域网络环境中,主要作用是集中的管理、动态分配IP地址,使网络环境中的主机动态的获得IP地址、Gateway地址、DNS服务器地址等信息,并能够提升地址的使用率。

六、访问百度的具体通信过程(根据域名寻找IP地址)

  1、第一,先解析出baidu.com对应的ip地址

       0. 首先,要知道默认网关的MAC地址(使用ARP获取默认网关的MAC地址)

       1. 组织数据发送给默认网关(ip为DNS服务器的ip,但是MAC地址是默认网关的MAC地址)

       2. 默认网关拥有转发数据的能力,并把数据转发给路由器

       3. 路由器根据自己的路由协议,选择一个合适的比较快的路径转发数据给目的网关

       4. 目的网关(DNS服务器所在的网关),把数据转发给DNS服务器

       5. DNS服务器查询解析出baidu.com对应的ip地址,并将它原路返回给请求这个域名的client

   2、得到了baidu.com对应的ip地址之后,会发送TCP的三次握手,进行连接

   3、使用http协议发送请求数据给web服务器

   4、web服务器收到请求数据之后,通过查询自己的服务器得到相应的结果,将数据原路返回给浏览器

   5、浏览器接收到数据之后,通过浏览器自己的渲染功能来显示这个网页

   6、浏览器关闭TCP连接,即四次挥手

    完成整个访问过程

     

七、长连接、短连接

  TCP短连接

模拟一种TCP短连接的情况:

1. client 向 server 发起连接请求

2. server 接到请求,双方建立连接

3. client 向 server 发送消息

4. server 回应 client

5. 一次读写完成,此时双方任何一个都可以发起 close 操作

在第 步骤5中,一般都是 client 先发起 close 操作。当然也不排除有特殊的情况。

从上面的描述看,短连接一般只会在 client/server 间传递一次读写操作!

   TCP长连接

       再模拟一种长连接的情况:

1. client 向 server 发起连接

2. server 接到请求,双方建立连接

3. client 向 server 发送消息

4. server 回应 client

5. 一次读写完成,连接不关闭

6. 后续读写操作...

7. 长时间操作之后client发起关闭请求

TCP长/短连接操作过程

  短连接的操作步骤是:

建立连接——数据传输——关闭连接...建立连接——数据传输——关闭连接


长连接的操作步骤是:

建立连接——数据传输...(保持连接)...数据传输——关闭连接


 TCP长/短连接的优点和缺点

  • 长连接可以省去较多的TCP建立和关闭的操作,减少浪费,节约时间。

    对于频繁请求资源的客户来说,较适用长连接。

  • client与server之间的连接如果一直不关闭的话,会存在一个问题,

    随着客户端连接越来越多,server早晚有扛不住的时候,这时候server端需要采取一些策略,

    如关闭一些长时间没有读写事件发生的连接,这样可以避免一些恶意连接导致server端服务受损;

    如果条件再允许就可以以客户端机器为颗粒度,限制每个客户端的最大长连接数,

    这样可以完全避免某个蛋疼的客户端连累后端服务。

  • 短连接对于服务器来说管理较为简单,存在的连接都是有用的连接,不需要额外的控制手段。
  • 但如果客户请求频繁,将在TCP的建立和关闭操作上浪费时间和带宽。

TCP长/短连接的应用场景

  • 长连接多用于操作频繁,点对点的通讯,而且连接数不能太多情况。

    每个TCP连接都需要三次握手,这需要时间,如果每个操作都是先连接,

    再操作的话那么处理速度会降低很多,所以每个操作完后都不断开,

    再次处理时直接发送数据包就OK了,不用建立TCP连接。

    例如:数据库的连接用长连接,如果用短连接频繁的通信会造成socket错误,

    而且频繁的socket 创建也是对资源的浪费。

  • 而像WEB网站的http服务一般都用短链接,因为长连接对于服务端来说会耗费一定的资源,

    而像WEB网站这么频繁的成千上万甚至上亿客户端的连接用短连接会更省一些资源,

    如果用长连接,而且同时有成千上万的用户,如果每个用户都占用一个连接的话,

    那可想而知吧。所以并发量大,但每个用户无需频繁操作情况下需用短连好。

--------------------------------第二天-2018.04.27----------------------------

九、TCP的2MSL问题

    

 TTL:Time To Live

      该字段指定IP包被路由器丢弃之前允许通过的最大网段数量。TTL是IPv4包头的一个8 bit字段。

      TTL的作用是限制IP数据包在计算机网络中的存在的时间。TTL的最大值是255,TTL的一个推荐值是64。

      TTL字段由IP数据包的发送者设置,在IP数据包从源到目的的整个转发路径上,每经过一个路由器,路由器都会修改这个TTL字段值,具体的做法是把该TTL的值减1,然后再将IP包转发出去。如果在IP包到达目的IP之前,TTL减少为0,路由器将会丢弃收到的TTL=0的IP包并向IP包的发送者发送 ICMP time exceeded消息。

      TTL的主要作用是避免IP包在网络中的无限循环和收发,节省了网络资源,并能使IP包的发送者能收到告警消息。


2MSL:  2 Maximum  Segment Lifetime

2MSL即两倍的MSL,TCP的TIME_WAIT状态也称为2MSL等待状态

当TCP的一端发起主动关闭,在发出最后一个ACK包后,

即第3次挥手完成后发送了第四次挥手的ACK包后就进入了TIME_WAIT状态,

     必须在此状态上停留两倍的MSL时间,

     等待2MSL时间主要目的是怕最后一个 ACK包对方没收到

     那么对方在超时后将重发第三次挥手的FIN包,

     主动关闭端接到重发的FIN包后可以再发一个ACK应答包。

在TIME_WAIT状态,时两端的端口不能使用,要等到2MSL时间结束才可继续使用。

当连接处于2MSL等待阶段时任何迟到的报文段都将被丢弃。

不过在实际应用中可以通过设置 SO_REUSEADDR选项达到不必等待2MSL时间结束再使用此端口。

2MSL即两倍的MSL,TCP的TIME_WAIT状态也称为2MSL等待状态

当TCP的一端发起主动关闭,在发出最后一个ACK包后,

即第3次挥手完成后发送了第四次挥手的ACK包后就进入了TIME_WAIT状态,

必须在此状态上停留两倍的MSL时间,

等待2MSL时间主要目的是怕最后一个 ACK包对方没收到

那么对方在超时后将重发第三次挥手的FIN包,

主动关闭端接到重发的FIN包后可以再发一个ACK应答包。

在TIME_WAIT状态,时两端的端口不能使用,要等到2MSL时间结束才可继续使用。

当连接处于2MSL等待阶段时任何迟到的报文段都将被丢弃。

不过在实际应用中可以通过设置 SO_REUSEADDR选项达到不必等待2MSL时间结束再使用此端口。

十、listen的队列长度

服务器端运行

#coding=utf-8
from socket import *
from time import sleep
# 创建socket
tcpSerSocket = socket(AF_INET, SOCK_STREAM)
# 绑定本地信息
address = ('', 7788)
tcpSerSocket.bind(address)
connNum = int(raw_input("请输入要最大的链接数:"))
# 使用socket创建的套接字默认的属性是主动的,使用listen将其变为被动的,这样就可以接收别人的链接了
for i in range(10):
print(i)
sleep(1) 
tcpSerSocket.listen(connNum)


#在这个期间,如果有20个客户端调用了connect连接服务器,那么这个服务器的Linux底层会自动维护2个队列(半连接和已连接);

其中,半连接和已连接的总数为listen中的值,如果这个值为5,那么意味着此时最多只有5个客户端能够连接成功,而剩余的15个则会堵塞在connect函数

for i in range(10):

    print(i)
    sleep(1)

print("延时结束....")


while True:
    # 如果有新的客户端来链接服务器,那么就产生一个新的套接字专门为这个客户端服务器

    #如果服务器调用了accept,那么Linux底层中的那个半连接和已连接中的客户端个数就会少一个,因此,此时那15个因为connect堵塞的客户端又会再一次进行连接,来争抢这个空出来的位置

   newSocket, clientAddr = tcpSerSocket.accept()

    print clientAddr
    sleep(1)

客户端运行

#coding=utf-8
from socket import *

connNum = raw_input("请输入要链接服务器的次数:")
for i in range(int(connNum)):
    s = socket(AF_INET, SOCK_STREAM)
    s.connect(("192.168.1.102", 7788))
    print(i)

总结

  • listen中的black表示已经建立链接和半链接的总数
  • 如果当前已建立链接数和半链接数以达到设定值,那么新客户端就不会connect成功,而是等待服务器


十、常见网络攻击案例

    1. tcp半链接攻击

tcp半链接攻击也称为:SYN Flood (SYN洪水)

是种典型的DoS (Denial of Service,拒绝服务) 攻击

效果就是服务器TCP连接资源耗尽,停止响应正常的TCP连接请求



2. dns攻击

2.1 dns服务器被劫持

我们知道一个域名服务器对其区域内的用户解析请求负责,

但是并没有一个机制去监督它有没有真地负责。

也就是说域名服务器的权力并没有被关在笼子里,

所以它既可以认真地“为人民服务”,也可以“指鹿为马”。

于是有些流氓的域名服务器故意更改一些域名的解析结果,

将用户引向一个错误的目标地址。这就叫作 DNS 劫持,主要用来阻止用户访问某些特定的网站,或者是将用户引导到广告页面。


2.2 dns欺骗

DNS 欺骗简单来说就是用一个假的 DNS 应答来欺骗用户计算机,

让其相信这个假的地址,并且抛弃真正的 DNS 应答。

在一台主机发出 DNS 请求后,它就开始等待应答,

如果此时有一个看起来正确(拥有和DNS请求一样的序列号)的应答包,

它就会信以为真,并且丢弃稍晚一点到达的应答。


2.3 查看域名解析的ip地址方法

    nslookup 域名

    例如:
    nslookup baidu.com


3. arp攻击

       ARP攻击就是通过伪造IP地址和MAC地址实现ARP欺骗,能够在网络中产生大量的ARP通信量使 网络阻塞,攻击者只要持续不断的发出伪造的ARP响应包就能更改目标 主机ARP缓存中的IP-MAC条目,造成网络中断或 中间人攻击

攻击者向电脑A发送一个伪造的ARP响应,告诉电脑A:电脑B的IP地址192.168.0.2对应的MAC地址是00-aa-00-62-c6-03,电脑A信以为真,将这个对应关系写入自己的ARP缓存表中,以后发送数据时,将本应该发往电脑B的数据发送给了攻击者。同样的,攻击者向电脑B也发送一个伪造的ARP响应,告诉电脑B:电脑A的IP地址192.168.0.1对应的MAC地址是00-aa-00-62-c6-03,电脑B也会将数据发送给攻击者。

至此攻击者就控制了电脑A和电脑B之间的流量,他可以选择被动地监测流量,获取密码和其他涉密信息,也可以伪造数据,改变电脑A和电脑B之间的通信内容。







猜你喜欢

转载自blog.csdn.net/youyouwuxin1234/article/details/80079870
今日推荐