网络编程

网络概述丶udp

1.什么是网络

    网络就是一种辅助双方或者多方能够连接在一起的工具

      如果没有网络可想单机的世界是多么的孤单

2.使用网络的目的        

 就是为了联通多方然后进行通信用的,即把数据从一方传递给另外一方
 前面的学习编写的程序都是单机的,即不能和其他电脑上的程序进行通信

 为了让在不同的电脑上运行的软件,之间能够互相传递数据,就需要借助网络的功能

3.总结

     使用网络能够把多方链接在一起,然后可以进行数据传递

     所谓的网络编程就是,让在不同的电脑上的软件能够进行数据传递,即进程之间的通信

tcp/ip简介

1.什么是协议

现规定国际通用语言是英语,这就是一个规定,这就是协议,就像说不同语言的人沟通一样,只要有一种大家都认可都遵守的协议即可,那么这个计算机都遵守的网络通信协议叫做TCP/IP协议

2.TCP/IP协议(族)

为了把全世界的所有不同类型的计算机都连接起来,就必须规定一套全球通用的协议,为了实现互联网这个目标,互联网协议簇(Internet Protocol Suite)就是通用协议标准。

因为互联网协议包含了上百种协议标准,但是最重要的两个协议是TCP和IP协议,所以,大家把 互联网的协议简称TCP/IP协议,注意TCP/IP协议不是只有两种协议

3.网络分层

四层:链路层(网络接口层),网络层(网际层),传输层,应用层

七层:物理层,数据链路层,网络层,传输层,会话层,表示层,应用层

4.解释网络分层

应用层:解决要传送什么数据,为用户的进程直接提供服务(网关)(防火墙)

                传输层:解决如何传送数据,为两个主机的不同端口之间的通信提供服务(防火墙)

                网络层:IP可以理解为地理坐标位置,为两个主机之间提供通信服务(路由器)

                接口层:具体的传输工具,负责相邻物理设备之间的信息传输(集线器)(交换机)(网桥)(调制解调器)

链路(接口)层的协议分析

1.接口层的作用(包含ARP地址解析协议,RARP逆地址解析协议)  

  • 为IP模块发送和接收IP数据报
  • 为ARP模块发送ARP请求和接收ARP应答
  • 为RARP模块发送RARP请求和接收RARP应答

    目前使用最广泛的链路层协议有以太网,串行接口链路等

    MAC地址:48位(6字节)的目标地址和源地址

2.ARP协议工作过程

  • 首先在自己的ARP告诉缓存中找这个IP地址个MAC地址的映射关系
  • 如果找不到,则ARP就发送一份ARP请求给以太网上的每个主机,这个过程称为ARP广播
  • 目的主机的ARP层收到了这份ARP广播后,识别出发送方在询问他的地址,于是就发送一个包含IP地址及对应物理地址的ARP应答发送给发送方
  • 收到ARP应答后,发送方就可以传IP数据报了

3.免费ARP和代理ARP

  • 免费ARP是一种特殊的ARP,用于在系统网络发生变化或系统重置时保持ARP地址解析的有效性
  • 代理ARP是路由器用一个接口的物理地址来对其他网络地址的ARP请求进行应答。主机ARP高速缓存中多个IP地址被映射到同一个MAC地址就是代理ARP的标志,ARP欺骗主要就是利用了代理ARP的机制

4.RARP协议

            RARP用于支持误判工作站在引导或启动时获得自身的IP地址(无盘指没有存放有引导所需操作文件的辅助存储器),经常和TFTP(简单文件传输协议)一起使用,即通过RARP获得IP地址

  • 从接口卡读取唯一的物理地址(MAC地址)
  • 发送一份RARP请求某个RARP服务器响应该无盘系统的IP地址,在网络上广播,请求响应IP地址的响应
  • 如果网络上有RARP服务器收到请求,就发送一个RARP应答,包含无盘主机分配的IP地址,通常是单播传送的
  • 假如网络上没有RARP服务器,无盘主机会按一定的时间间隔持续地发送RARP请求到网络上

 网络层的协议分析

1.网络层的作用(包含IP网际协议,ICMP网际控制报文协议,IGMP网际组管理协议)

2.IP数据报:也称IP分组,是指IP层传输的数据单元及其格式,同时也是指IP层的无连接数据报传输机制和无连接服务

3.ICMP协议

  • ICMP可提供有关网络可连接性的信息,提供可达性,交互错误,路由错误报告及控制信息等IP不能够提供的信息,并把信息返回给发送方,是TCP/IP网络层的重要协议
  • ICMP虽然也是网络层的协议,但却封装在IP报文中,从这个意义上看,ICMP信息不过是特殊格式的IP数据报,与一般网络流量中其他IP数据报受到相同的限制
  • IP负责把数据从一个网络传送到另一个网络,而IP协议本身没有差错控制机制,如果在传递过程中出现因某种原因不能发送的IP数据,ICMP将被用来传递差错报文及其他需要注意的信息

4.IP协议

  • IP协议(网际协议)是TCP/IP协议族中最核心的协议,所有的TCP,UDP,ICMP及IGMP数据都是IP数据报格式传输的
  • IP层主要负责路由,即数据包选路,使通过由路由器连接的互联网络传输数据报
5.IP层的传输特点
  • IP提供的是不可靠,无连接的数据报传送
  • 不可靠的意思是不能保证IP数据报能成功地到达目的地,IP仅提供尽力传送服务,负责数据的路由与传输,却并不处理数据报的内容
  • 无连接是IP并不维护任何关于后续数据报的状态信息,每个数据报的处理是相互独立的,这也说明,IP数据报不按顺序发送顺序接收

6.IP路由选择

当目的主机与源主机不是直接相连或处在同一个共享网络上,那么IP数据报就不能直接送到目的主机上,而需要路由器来转发数据报,通常主机把数据报发往一个默认的路由器上,由路由器决定怎么发送数据报

7.IP选路机制

  • 搜索匹配的主机地址
  • 搜索匹配的网络地址
  • 搜索默认路由
  • 如果路由表中没有默认项,而又没有找到匹配项,这时如果数据报是由本地主机产生的,那么可能返回“主机不可达差错”,“网络不可达差错”

动态选路协议(网络层)

1.静态选路和动态选路
  • 静态选路:就是在配置接口时,以默认的方式生成路由表项,并通过ICMP报文来更新表项
  • 动态选路:管理员不需要像静态路由一样,对路由表进行手工维护,而是在每台路由器上运行一个路由表管理程序

2.动态选路特征:

                        不改变选路机制,仍是按(主机,网络,默认路由)

                        改变选路策略:路由项目由守护程序动态增加或删除

                        动态选路由守护程序完成

3.RIP协议(由UDP传输的动态选路协议或动态路由协议)

  • RIP是最 广泛使用的动态选路协议,协议采用距离向量算法,即相邻的路由器之间互相交换整个路由表并进行矢量的叠加,最终获得整个网络的路由信息
  • RIP以跳数作为路由器之间距离的度量,所有直连接口的跳数为1,每增加一个路由器,可达到的网络跳数加1,为限制路由收敛的时间,RIP规定跳数取值为0~15,大于等于16跳数表示目的不可达,某种程度上限制了网络的大小

4.OSRF协议(内部网关协议和链路状态协议)

  • OSRF协议是除RIP之外的另一个内部网关协议,与采用距离向量的RIP不同的是,OSRF是一个链路状态协议,因而客服了RIP的所有限制,OSRF在实现上直接使用IP协议而不再使用传输层协议,如UDP
  • 链路状态包括路由器链路的端口地址,网络掩码,此链路互联的网络及网络类型等,它构成了路由器的链路状态数据库,是路由器进行路由决策主要依据

端口

1. 什么是端口

端口就好一个房子的门,是出入这间房子的必经之路

在linux系统中,端口可以有65536(2的16次方)个之多!既然有这么多,操作系统为了统一管 理,所以进行了编号,这就是端口号

2.端口号

端口是通过端口号来标记的,端口号只有整数,范围是从0到65535

3.端口是怎样分配的

端口号不是随意使用的,而是按照一定的规定进行分配。

端口的分类标准有好几种,我们这里不做详细讲解,只介绍一下知名端口和动态端口

知名端口(Well Known Ports):

知名端口是众所周知的端口号,范围从0到1023
80端口分配给HTTP服务

21端口分配给FTP服务

动态端口(Dynamic Ports):

动态端口的范围是从1024到65535
之所以称为动态端口,是因为它一般不固定分配某种服务,而是动态分配。

动态分配是指当一个系统进程或应用程序进程需要网络通信时,它向主机申请一个端口,主机从可用的端口号中分配一个供它使用。

当这个进程关闭时,同时也就释放了所占用的端口号

怎样查看端口 ?

用“netstat -an”查看端口状态

4.总结

端口有什么用呢 ? 我们知道,一台拥有IP地址的主机可以提供许多服务,比如HTTP(万维网服 务)、FTP(文件传输)、SMTP(电子邮件)等,这些服务完全可以通过1个IP地址来实现。那么, 主机是怎样区分不同的网络服务呢?显然不能只靠IP地址,因为IP地址与网络服务的关系是一对多的 关系。实际上是通过“IP地址+端口号”来区分不同的服务的。 需要注意的是,端口并不是一一对应的。 比如你的电脑作为客户机访问一台WWW服务器时,WWW服务器使用“80”端口与你的电脑通信,但你的电脑则可能使用“3457”这样的端口。 

IP地址

1.什么是Ip地址

网络地址是一个网络层概念,是互联网上的主机在网络中具有的逻辑地址,Internet上采用的IP地址表示网络地址

2.IP地址的作用

IP地址:用来在网络中标记一台电脑的一串数字,比如192.168.1.1;在本地局域网上是惟一的

3.IP地址的分类


每一个IP地址包括两部分:网络地址和主机地址

                A类网络号:主机数2^24-2,子网数2^22

                B类网络号:主机数2^16-2,子网数2^14

                C类网络号:主机数2^8-2,子网数2^6

私有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(但是最大的代表广播地址,最小的代表网络号,不允许使用,也就是在局域网中,Ip地址最大是254,最小是1)

4.域名

由于IP地址由纯数字组成,很难让人记忆,且不能表达功能,地理位置等附加含义,所以在TCP/IP网络形成不久,标准化组织就定义了这种主机地址表达方式

域名是一个应用层概念,是由一串用点分隔的名字组成的Internet上某台计算机或计算机组的名字,用于在数据传输时标志计算机的电子方位(有时也指地理位置,地理上的域名或有行政自主权的一个地方区域)

域名其实就是IP地址的“面具”,熟知的有www.baidu.com

4.ipv4和ipv6

因为ipv4已经被瓜分殆尽,所以出现了新的ipv6,ipv4有四个字节的地址,

2的10次方为k,2的20次方为M,2的30次方为G

5.子网掩码

                子网掩码不能单独存在,它必须结合IP地址一起使用

                子网掩码只有一个作用,就是将某个IP地址划分成网络地址和主机地址两部分子网掩码的设定必须遵循一定的规则

             与IP地址相同,子网掩码的长度也是32位,

  • 左边是网络位,用二进制数字“1”表示;
  • 右边是主机位,用二进制数字“0”表示。

                网络掩码与ip地址相与就是网络号,假设IP地址为“192.168.1.1”子网掩码为“255.255.255.0”,那么此网络号就是192.168.1.0

6.tcp和端口

                IP地址是网络层的寻址方式,端口是传输层的寻址方式

socket(插口,套接字)简介

1.本地的进程间通信(IPC)有很多种方式
  •  队列
  • 同步(互斥锁、条件变量等)
         以上通信方式都是在一台机器上不同进程之间的通信方式,那么问题来了

网络中进程之间如何通信

2.网络中进程之间如何通信

网络层的“ip地址”可以唯一标识网络中的主机,而传输层的“协议+端口”可以唯一标识主机中 的应用程序(进程)。

这样利用ip地址,协议,端口就可以标识网络的进程了,网络中的进程通信就可以利用这个标志与其它进程进行交互

3.什么是socket

                socket(套接字)接口是应用程序与TCP/IP协议栈的接口,它定义了一组函数或例程来支持TCP/IP网络应用程序开发

socket(简称 套接字) 是进程间通信的一种方式,它与其他进程间通信的一个主要不同是:
它能实现不同主机间的进程间通信,我们网络上各种各样的服务大多都是基于 Socket 来完成通信的

例如我们每天浏览网页、QQ 聊天、收发 email 等等

4.创建socket

在 Python 中 使用socket 模块的函数 socket 就可以完成:socket.socket(AddressFamily, Type)

说明:函数 socket.socket 创建一个 socket,返回该 socket 的描述符,该函数带有两个参数:

    Address Family:可以选择 AF_INET(用于 Internet 进程间通信) 或者 AF_UNIX( 用于同一台机器进程间通信),实际工作中常用AF_INET

    Type:套接字类型,可以是 SOCK_STREAM(流式套接字,主要用于 TCP 协议)或 者 SOCK_DGRAM(数据报套接字,主要用于 UDP 协议)

例如:

创建一个tcp socket(tcp套接字)
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
print 'Socket Created'

创建一个udp socket(udp套接字)
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
print 'Socket Created'

udp介绍

1.udp介绍

                udp采用无连接的方式来提供通信服务,是传输层中最简单的协议

2.udp特点

  •  udp是一个简单的,面向数据报的传输层协议,无连接协议,简单地把TCP/IP应用层得到的消息打包到数据板中
  • udp没有提供任何类型的内置出错检查或重传能力来提高可靠性,这种方法称为尽最大能力努力交付
  • 由于通讯不需要连接,所以可以实现广播发送
  •  UDP传输数据时有大小限制,每个被传输的数据报必须限定在64KB之内

适用情况:

UDP是面向消息的协议,通信时不需要建立连接,数据的传输自然是不可靠的,UDP一般用于多点通信和实时的数据业务,比如:

  • 语音广播
  •  视频
  •  QQ
  •  TFTP(简单文件传送)
  •  SNMP(简单网络管理协议)
  • RIP(路由信息协议,如报告股票市场,航空信息)
  • DNS(域名解释)

UDP操作简单,而且仅需要较少的监护,因此通常用于局域网高可靠性的分散系统中client/server 应用程序。例如视频会议系统,并不要求音频视频数据绝对的正确,只要保证连贯性就可以了,这种情 况下显然使用UDP会更合理一些。

3.udp网络程序-发送数据

创建一个udp客户端程序的流程是简单,具体步骤如下:
    创建客户端套接字
    发送/接收数据:udpSocket.sendto(sendData, sendAddr)

    关闭套接字

4.udp网络程序-接收数据

recvData = udpSocket.recvfrom(1024) # 1024表示本次接收的最大字节数

5.udp网络程序-端口问题

在同一个OS中,端口不允许相同,即如果某个端口已经被使用了,那么在这个进程释放这个端口 之前,其他进程不能使用这个端口

原因:端口用来区分一个进程,如果要是相同,那么就不能把数据发送给正确的进程,因此不允许 相同

6.udp绑定信息

一般情况下,在一天电脑上运行的网络程序有很多,而各自用的端口号很多情况下不知道,为了不 与其他的网络程序占用同一个端口号,往往在编程中,udp的端口号一般不绑定,但是如果需要做成一 个服务器端的程序的话,是需要绑定的

bindAddr = ('', 7788) # ip地址和端口号,ip一般不用写,表示本机的任何一个ip

udpSocket.bind(bindAddr)

7.udp网络通信过程

8.udp特性总结:
  • 数据可以随时发送、接收,没有建立、断开连接的过程,因此主机不需要维护复杂的连接状态
  • udp不保证数据的可靠传输,仅仅尽最大可能进行发送
  • 没有拥塞控制算法控制收发速率,程序需在应用层自行控制
  • 发送方的udp对应用程序交付的报文,在添加首部后就向下交付给ip层。既不拆分,也不合并。因此,应用程序需要选择合适的报文大小

9.DNS(域名系统,使用UDP协议工作)

DNS(Domain Name System,域名系统),万维网上作为域名和IP地址相互映射的一个分布式数据库,能够使用户更方便的访问互联网,而不用去记住能够被机器直接读取的IP数串。通过域名,最终得到该域名对应的IP地址的过程叫做域名解析(或主机名解析)。DNS协议运行在UDP协议之上,使用端口号53。

        功能:每个IP地址都可以有一个主机名,主机名由一个或多个字符串组成,字符串之间用小数点隔开。有了主机名,就不要死记硬背每台IP设备的IP地址,只要记住相对直观有意义的主机名就行了。这就是DNS协议的功能

        主机名到IP地址的 映射有两种方式:
  • 静态映射,每台设备上都配置主机到IP地址的映射,各设备独立维护自己的映射表,而且只供本设备使用;
  • 动态映射,建立一套域名解析系统(DNS),只在专门的DNS服务器上配置主机到IP地址的映射,网络上需要使用主机名通信的设备,首先需要到DNS服务器查询主机所对应的IP地址

10.DHCP协议(动态主机配置协议,使用UDP协议工作)

  • 动态主机配置协议(DHCP)是在TCP/IP网络上使计算机获得它所需要的所有配置信息的协议,不仅允许计算机快读动态地获取IP地址和子网掩码,还可以获取其他网络配置信息,如DSN服务器
  • DHCP采用UDP作为传输协议,DHCP服务器使用67号端口,客户机使用68端口

11.SNMP协议(简单网络管理协议,使用UDP协议工作)

  •  最早提出的网络管理协议,也是最早提出的网络管理协议,其前身是简单网关监控协议,用来对通信线路进行管理
  • 简单网络管理协议(SNMP),由一组网络管理的标准组成,包含一个应用层协议(application layer protocol)、数据库模型(database schema)和一组资源对象。该协议能够支持网络管理系统,用以监测连接到网络上的设备是否有任何引起管理上关注的情况

udp应用

1.聊天室

from socket import *

from time import ctime

#1. 创建套接字

udpSocket = socket(AF_INET, SOCK_DGRAM)

#2. 绑定本地的相关信息
bindAddr = ('', 7788) # ip地址和端口号,ip一般不用写,表示本机的任何一个ip

udpSocket.bind(bindAddr)

                while True:

    #3. 等待接收对方发送的数据
    recvData = udpSocket.recvfrom(1024) # 1024表示本次接收的最大字节数
    #4. 打印信息

    print('【%s】%s:%s'%(ctime(),recvData[1][0],recvData[0]))

                #5. 关闭套接字

                udpSocket.close()

2.echo服务器
from socket import *

#1. 创建套接字
udpSocket = socket(AF_INET, SOCK_DGRAM)

#2. 绑定本地的相关信息
bindAddr = ('', 7788) # ip地址和端口号,ip一般不用写,表示本机的任何一个ip
udpSocket.bind(bindAddr)

num = 1
while True:

    #3. 等待接收对方发送的数据
    recvData = udpSocket.recvfrom(1024) # 1024表示本次接收的最大字节数

    #4. 将接收到的数据再发送给对方
    udpSocket.sendto(recvData[0], recvData[1])

    #5. 统计信息
    print('已经将接收到的第%d个数据返回给对方,内容为:%s'%(num,recvData[0]))
    num+=1

#6. 关闭套接字
udpSocket.close()

TFTP项目丶TCP编程

1.wireshark抓包工具使用

                只看ip地址为172.16.0.101的数据包:ip.addr==172.16.0.101

                只看端口号为2425的数据包:udp.port==2425

                也可:ip.addr==172.16.0.101 and udp.port==2425

2.CS架构和BS架构

                CS:客户端和服务器都单独开发的

                BS:直接打开浏览器就能访问网址,不需要单独开发

3.tftpd64客户端

  • TFTP协议介绍
                    TFTP(Trivial File Transfer Protocol,简单文件传输协议)
                    是TCP/IP协议族中的一个用来在客户端与服务器之间进行简单文件传输的协议
                    特点:
                    简单
                    占用资源小
                    适合传递小文件
                    适合在局域网进行传递
                    端口号为69

                    基于UDP实现

  • TFTP下载过程
                    TFTP服务器默认监听69号端口
                    当客户端发送“下载”请求(即读请求)时,需要向服务器的69端口发送

                    服务器若批准此请求,则使用一个新的、临时的 端口进行数据传输


                当服务器找到需要现在的文件后,会立刻打开文件,把文件中的数据通过TFTP协议发送给客户端

                如果文件的总大小较大(比如3M),那么服务器分多次发送,每次会从文件中读取512个字节的数据       发送过来因为发送的次数有可能会很多,所以为了让客户端对接收到的数据进行排序,所以在服务器发送那        512个字节数据的时候,会多发2个字节的数据,用来存放序号,并且放在512个字节数据的前面,序号是从1      开始的

                因为需要从服务器上下载文件时,文件可能不存在,那么此时服务器就会发送一个错误的信息过来,        为了区分服务发送的是文件内容还是错误的提示信息,所以又用了2个字节 来表示这个数据包的功能(称为         操作码),并且在序号的前面

                操作码 功能
                1         读请求,即下载
                2         写请求,即上传
                3         表示数据包,即DATA
                4         确认码,即ACK
                5         错误
                为了标记数据已经发送完毕,所以规定,当客户端接收到的数据小于516(2字节操作码+2个字节的序      号+512字节数据)时,就意味着服务器发送完毕了

4.怎么完成下载

  • 创建一个空文件
  • 向里面写数据
  • 关闭

5.怎么发送,怎么接收

                    使用tftp协议

6.什么样的情况下知道了服务器发送完毕

                    如果接收到的数据总长度小于516那么意味着 发送完毕

7.构造下载请求数据

                    cmd_buf = struct.pack("!H8sb5sb",1,"test.jpg",0,"octet",0)

                    解释:!表示大端格式组织(上网),H表示占用两个字节(帮1占坑),8s占用8个字节(帮test.jpg占坑),b占用一个字节(帮0占坑)

tcp编程

 1.tcp相关介绍

      tcp:传输控制协议

   特点:稳定
                              相对于udp而言,要慢一些
                              web服务器都是使用的tcp

           通信模型:udp通信模型中,在通信开始之前,一定要先建立相关的链接,才能发送数据,类似于生         活中,"打电话""

        

       udp:用户数据包协议
                特点:不稳定
                          适当比tcp要快一些

       通信模型:udp通信模型中,在通信开始之前,不需要建立相关的链接,只需要发送数据即可,类似于       生活中,"写信""


2.tcp服务器构建流程

                如果想要完成一个tcp服务器的功能,需要的流程如下:

  • socket创建一个套接字
  • bind绑定ip和port
  • listen使套接字变为可以被动链接
  • accept等待客户端的链接
  • recv/send接收发送数据
                如果接收到的客户端发送的数据长度为0,那么意味着客户端通过调用close下线

3.tcp客户端构建流程

                如果想要完成一个tcp客户端的功能,需要的流程如下:  

  • socket创建一个套接字
  • 连接connect服务器
  • send/recv接收和发送数据(不需要再填写地址了)
  • 关闭套接字      

4.tcp特性总结:

  • 有序性:为每个数据包编排序号,使接收端能够判断先后到达的次序混乱的数据包的原本顺序
  • 正确性:tcp用一个checksum函数来检验数据是否有错误,在发送和接收时都要计算校验和,这使得接收端能够判断数据是否在传输过程中被破坏
  • 可靠性:发送端采用超时重传并有确认机制识别错误或丢失数据,进行重发
  • 可控性:接收端和发送端的网络质量通常不同,tcp采用滑动窗口协议和拥塞控制算法使数据的发送速度达到合理值

5.C/S和B/S

            C/S,即client/server,是当前大多数网络编程所使用的架构模型,它可以将任务合理分配到client端和server端来实现,降低了系统的通信开销,它们常常处在相距很远的两台计算机上,client程序的任务是将用户的要求提交给server程序,再将server程序返回的结果以特定的形式显示给用户,server程序的任务是接收客户程序提出的服务请求,进行相应的处理,再将结果返回给客户程序

            B/S,即Browser/Server,是web兴起后的一种网络架构模式,B/S实验web浏览器作为客户端的应用软件,所以B/S可以看作C/S的一种特殊情况,B/S架构是伴随因特网的兴起而兴起的,是对C/S的一种改进

            如:Django、Tornado、和Flask均是以B/S架构为主要开发目标的框架,Twisted主要面向C/S架构系统

 Packet Tracer介绍

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

2.学习网通信过程的重要性

            在浏览器中输入 www.itcast.cn后,访问的整个过程有哪些?


3.通过集线器组网

  • hub(集线器)能够完成多个电脑的链接
  • 每个数据包的发送都是以广播的形式进行的,容易堵塞网络

4.通过交换机组网

        网络交换机介绍:

        网络交换机(又称“网络交换器”),是一个扩大网络的器材,能为子网络中提供更多的连接端口,以便连接更多的计算机 具有性能价格比高、高度灵活、相对简单、易于实现等特点 以太网技术已成为当今最重要的一种局域网组网技术,网络交换机也就成为了最普及的交换机


           交换机的作用:
            转发过滤:当一个数据帧的目的地址在MAC地址表中有映射时,它被转发到连接目的节点的端口而不是所有端口(如该数据帧为广播帧则转发至所有端口)

            学习功能:以太网交换机了解每一端口相连设备的MAC地址,并将地址同相应的端口映射起来存放在交换机缓存中的MAC地址表中

  • 交换机能够完成多个电脑的链接
  • 每个数据包的发送都是以广播的形式进行的,容易堵塞网络
  • 如果PC不知目标IP所对应的的MAC,那么可以看出,pc会先发送arp广播,得到对方的MAC然后,在进行数据的传送
  • 当switch第一次收到arp广播数据,会把arp广播数据包转发给所有端口(除来源端口);如果以后还有pc询问此IP的MAC,那么只是向目标的端口进行转发数据

5.通过路由器组网

                路由器简介:

                    路由器(Router)又称网关设备(Gateway)是用于连接多个逻辑上分开的网络,作用是连接不同的网络,并且使他们之间能够通信

                    所谓逻辑网络是代表一个单独的网络或者一个子网。当数据从一个子网传输到另一个子网时,可通过路由器的路由功能来完成具有判断网络地址和选择IP路径的功能

                通信过程(pc+switch+router):

                    通过2个router,2个switch,4台pc组成的网络

  • 不在同一网段的pc,需要设置默认网关才能把数据传送过去 通常情况下,都会把路由器默认网关
  • 当路由器收到一个其它网段的数据包时,会根据“路由表”来决定,把此数据包发送到哪个端口;路由表的设定有静态和动态方法
  • 每经过一次路由器,那么TTL值就会减一

                路由器单臂路由配置:

                单臂路由技术原理:是为实现VLAN间通信的三层网络设备路由器,它只需要一个以太接口,通过创建子接口可以承担所有VLAN的网关,而在不同的VLAN间转发数据

6.交换机、路由器、服务器组网

  • DNS服务器用来解析出IP(类似电话簿)
  • DFGATEWAY(默认网关)用来对顶,当发送的数据包的目的ip不是当前网络时,此数据包包转发的目的ip
  • 在路由器中路由表指定数据包的”下一跳”的地址

7.问题

  • 两台电脑之间能通信的前提是什么?处在同一网段(网络号)内
  • 多台电脑为什么不能把网线剪开链接在一起?数据时通过电信号控制的,如果一起发送一起接收容易乱
  • 链接多台电脑的hub(集线器)有什么作用?实现多台电脑连接在一起,实现小型局域网    
  • 集线器和交换机的区别?集线器收到的所有数据包都是以广播的形式发送,交换机有学习的功能,如果是已经通信过的,这些时候就不是广播

8.网络协议

            ICMP:ping一个电脑

            arp:获取一个电脑上的网卡号,就是mac地址(物理地址、硬件地址,数据链路层)

            rarp:根据mac地址找ip

9.把域名解析成ip地址的步骤

  1.先要解析出baidu.com对应的ip地址

  • 先知道默认网关的mac,使用arp获取默认网关的mac地址
  • 组织数据发送给默认网关(ip还是dns服务器的ip,但是mac地址是默认网关的mac地址)
  • 默认网关具有转发数据的能力,让数据转发给路由器
  • 路由器根据自己的路由协议,来选择一个合适的较快的路径转发给目的网关
  • 目的网关(dns服务器所在的网关),把数据转发给dns服务器

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

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

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

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

    6.浏览器关闭tcp连接,即4次挥手

    完成整个访问过程

tcp常见问题

1.tcp三次握手


        三次握手协议指的是在发送数据的准备阶段,服务器端和客户端之间需要进行三次交互:第一次握手:客户端发送syn包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确认;第二次握手:服务器收到syn包,必须确认客户的syn(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态;第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手

2.tcp四次挥手

            

  •  TCP客户端发送一个FIN,用来关闭客户到服务器的数据传送。
  • 服务器收到这个FIN,它发回一个ACK,确认序号为收到的序号加1。和SYN一样,一个FIN将占用一个序号。
  • 服务器关闭客户端的连接,发送一个FIN给客户端。
  • 客户端发回ACK报文确认,并将确认序号设置为收到序号加1。

3.tcp长连接和短连接

                TCP在真正的读写操作之前,server与client之间必须建立一个连接,当读写操作完成后,双方不再需要这个连接时它们可以释放这个连接,连接的建立通过三次握手,释放则需要四次握手,所以说每个连接的建立都是需要资源消耗和时间消耗的

                TCP短连接:

  • client 向 server 发起连接请求
  • server 接到请求,双方建立连接
  • client 向 server 发送消息
  • server 回应 client

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

                TCP长连接:

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

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

  • 长连接可以省去较多的TCP建立和关闭的操作,减少浪费,节约时间。对于频繁请求资源的客户来说,较适用长连接。
  • client与server之间的连接如果一直不关闭的话,会存在一个问题,随着客户端连接越来越多,server早晚有扛不住的时候,这时候server端需要采取一些策略,如关闭一些长时间没有读写事件发生的连接,这样可以避免一些恶意连接导致server端服务受损;如果条件再允许就可以以客户端机器为颗粒度,限制每个客户端的最大长连接数,这样可以完全避免某个蛋疼的客户端连累后端服务。
  • 短连接对于服务器来说管理较为简单,存在的连接都是有用的连接,不需要额外的控制手段。
  • 但如果客户请求频繁,将在TCP的建立和关闭操作上浪费时间和带宽。

4.tcp和udp的区别

            在tcp中,如果有一方收到了方的数据,一定会发送ack确认包给发送方,而在udp中,没有这个过程,因此导致了tcp稳定,udp不稳定

5. tcp的十种状态

                      

6.tcp的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时间结束再使用此端口

7.listen的队列长度

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

常见网络攻击案例

1.tcp半链接攻击

            cp半链接攻击也称为:SYN Flood (SYN洪水),是种典型的DoS (Denial of Service,拒绝服务) 攻击,效果就是服务器TCP连接资源耗尽,停止响应正常的TCP连接请求

            正常链接时的情况:


            半链接攻击时的情况:

        

2. dns攻击

  • dns服务器被劫持

                我们知道一个域名服务器对其区域内的用户解析请求负责,但是并没有一个机制去监督它有没有真地负责。也就是说域名服务器的权力并没有被关在笼子里,所以它既可以认真地“为人民服务”,也可以“指鹿为马”。于是有些流氓的域名服务器故意更改一些域名的解析结果,将用户引向一个错误的目标地址。这就叫作 DNS 劫持,主要用来阻止用户访问某些特定的网站,或者是将用户引导到广告页面。


  • dns欺骗

                DNS 欺骗简单来说就是用一个假的 DNS 应答来欺骗用户计算机,让其相信这个假的地址,并且抛弃真正的 DNS 应答。在一台主机发出 DNS 请求后,它就开始等待应答,如果此时有一个看起来正确(拥有和DNS请求一样的序列号)的应答包,它就会信以为真,并且丢弃稍晚一点到达的应答。


  • 查看域名解析的ip地址方法:如nslookup baidu.com

3.arp攻击


家庭上网解析

            NAT:网络地址转换器

服务器

1.单进程服务器

  • 同一时刻只能为一个客户进行服务,不能同时为多个客户服务
  • 类似于找一个“明星”签字一样,客户需要耐心等待才可以获取到服务
  • 当服务器为一个客户端服务时,而另外的客户端发起了connect,只要服务器listen的队列有空闲的位置,就会为这个新客户端进行连接,并且客户端可以发送数据,但当服务器为这个新客户端服务时,可能一次性把所有数据接收完毕
  • 当recv接收数据时,返回值为空,即没有返回数据,那么意味着客户端已经调用了close关闭了;因此服务器通过判断recv接收数据是否为空 来判断客户端是否已经下线

 2.多进程服务器          

        通过为每个客户端创建一个进程的方式,能够同时为多个客户端进行服务,当客户端不是特别多的时候,这种方式还行,如果有几百上千个,就不可取了,因为每次创建进程等过程需要好较大的资源,可以在创建一个子进程后关闭newSocket

3.多线程服务器

        大体与多进程相似,只是把Process换成了Thread模块而已,与多进程不同的是,多线程不能关闭newSocket,因为多线程是共用一个套接字的,所以关闭了这个套接字,服务器就不能收发数据了

4.serverSocket和newSocket

  • 如果serverSocket不小心被close,那么意味着:不能再接收新的客户端的连接
  • 如果newSocket不小心被关闭了,那么意味着:服务器不能再继续使用recv和send收发数据了   

4. 单进程服务器-非堵塞模式

            非堵塞的重要思想就是用try来运行accept和接收堵塞的程序,如果产生异常就pass

            而且必须有serSocket.setblocking(False)来设置非堵塞

5.select版-TCP服务器

            select 原理:

                    在多路复用的模型中,比较常用的有select模型和epoll模型。这两个都是系统接口,由操作系统提供。当然,Python的select模块进行了更高级的封装。


        优点:select目前几乎在所有的平台上支持,其良好跨平台支持也是它的一个优点。

       缺点:select的一个缺点在于单个进程能够监视的文件描述符的数量存在最大限制,在Linux上一般为1024,可以通过修改宏定义甚至重新编译内核的方式提升这一限制,但是这样也会造成效率的降低。

6.epoll版-TCP服务器

            select——>32位最多1024,64位最多2048,轮询的方式进行检测

            poll——>解决了套接字有上限的问题,轮询检测

            epoll:没有1024的限制(没有上限),事件通知机制

            epoll的优点:

  • 没有最大并发连接的限制,能打开的FD(指的是文件描述符,通俗的理解就是套接字对应的数字编号)的上限远大于1024
  • 效率提升,不是轮询的方式,不会随着FD数目的增加效率下降。只有活跃可用的FD才会调用callback函数;即epoll最大的优点就在于它只管你“活跃”的连接,而跟连接总数无关,因此在实际的网络环境中,epoll的效率就会远远高于select和poll
  • epoll=select.epoll()

7.协程

            协程,又称微线程,纤程。英文名Coroutine

            协程其实可以认为是比线程更小的执行单元。 为啥说他是一个执行单元,因为他自带CPU上下文。这样只要在合适的时机, 我们可以把一个协程 切换到另一个协程。 只要这个过程中保存或恢复 CPU上下文那么程序还是可以运行的

            通俗的理解:在一个线程中的某个函数,可以在任何地方保存当前函数的一些临时变量等信息,然后切换到另外一个函数中执行,注意不是通过调用函数的方式做到的,并且切换的次数以及什么时候再切换到原来的函数都由开发者自己确定

            协程和线程差异:

            线程切换从系统层面远不止保存和恢复 CPU上下文这么简单。 操作系统为了程序运行的高效性每个线程都有自己缓存Cache等等数据,操作系统还会帮你做这些数据的恢复操作。 所以线程的切换非常耗性能。但是协程的切换只是单纯的操作CPU的上下文,所以一秒钟切换个上百万次系统都抗的住。

            协程的问题:

            系统并不感知,所以操作系统不会帮你做切换。 那么谁来帮你做切换?让需要执行的协程更多的获得CPU时间才是问题的关键

            协程的简单实现:

                def A():
                    while True:
                    print("----A---")
                    yield
                    time.sleep(0.5)

                def B(c):
                    while True:
                    print("----B---")
                    c.next()
                    time.sleep(0.5)

                if __name__=='__main__':
                    a = A()

                    B(a)

8.协程-greenlet版

            为了更好使用协程来完成多任务,python中的greenlet模块对其封装,从而使得切换任务变的更加简单,与进程和线程相比,协程可以根据开发者的需求来切换

                  使用如下命令安装greenlet模块: sudo pip3 install greenlet

                def test1():
                    while True:
                    print "---A--"
                    gr2.switch()
                    time.sleep(0.5)

                def test2():
                    while True:
                    print "---B--"
                    gr1.switch()
                    time.sleep(0.5)

                gr1 = greenlet(test1)
                gr2 = greenlet(test2)

                #切换到gr1中运行

                gr1.switch()

9.协程-greenlet版

                greenlet已经实现了协程,但是这个还的人工切换,python还有一个比greenlet更强大的并且能够自动切换任务的模块gevent

                其原理是当一个greenlet遇到IO(指的是input output 输入输出,比如网络、文件操作等)操作时,比如访问网络,就自动切换到其他的greenlet,等到IO操作完成,再在适当的时候切换回来继续执行。

                使用如下命令安装greenlet模块: sudo pip3 install gevent

HTTP协议介绍

1.使用谷歌/火狐浏览器分析

                在Web应用中,服务器把网页传给浏览器,实际上就是把网页的HTML代码发送给浏览器,让浏览器显示出来。而浏览器和服务器之间的传输协议是HTTP,所以:

  • HTML是一种用来定义网页的文本,会HTML,就可以编写网页;

  • HTTP是在网络上传输HTML的协议,用于浏览器和服务器的通信。

2.http的请求方式

            GET(获取数据),POST(修改数据),PUT(保存数据),DELETE(删除),OPTION(询问服务器的某种支持特性),HEAD(返回报文头)

3.浏览器解析过程

            当浏览器读取到新浪首页的HTML源码后,它会解析HTML,显示页面,然后,根据HTML里面的各种链接,再发送HTTP请求给新浪服务器,拿到相应的图片、视频、Flash、JavaScript脚本、CSS等各种资源,最终显示出一个完整的页面。所以我们在Network下面能看到很多额外的HTTP请求

4. HTTP请求

            步骤1:浏览器首先向服务器发送HTTP请求,请求包括:

  • 方法:GET还是POST,GET仅请求资源,POST会附带用户数据;
  • 路径:/full/url/path;
  • 域名:由Host头指定:Host: www.sina.com
  • 以及其他相关的Header;
  • 如果是POST,那么请求还包括一个Body,包含用户数据

            步骤2:服务器向浏览器返回HTTP响应,响应包括:

  • 响应代码:200表示成功,3xx表示重定向,4xx表示客户端发送的请求有错误,5xx表示服务器端处理时发生了错误;
  • 响应类型:由Content-Type指定;
  • 以及其他相关的Header;
  • 通常服务器的HTTP响应会携带内容,也就是有一个Body,包含响应的内容,网页的HTML源码就在Body中。

            步骤3:如果浏览器还需要继续向服务器请求其他资源,如图片,就再次发出HTTP请求,重复步骤1、2

            Web采用的HTTP协议采用了非常简单的请求-响应模式,从而大大简化了开发。当我们编写一个页面时,我们只需要在HTTP请求中把HTML发送出去,不需要考虑如何附带图片、视频等,浏览器如果需要请求图片和视频,它会发送另一个HTTP请求,因此,一个HTTP请求只处理一个资源(此时就可以理解为TCP协议中的短连接,每个链接只获取一个资源,如需要多个就需要建立多个链接)

            为了分散服务器的压力,所以一个网站往往有多台服务器,比如一台存放图片,一台存放视频等

5.http格式

            每个HTTP请求和响应都遵循相同的格式,一个HTTP包含Header和Body两部分,其中Body是可选的。

HTTP协议是超文本传输文本协议,所以,它的格式也非常简单

  • HTTP GET请求的格式
                 GET /path HTTP/1.1
                Header1: Value1
                Header2: Value2
                Header3: Value3
                每个Header一行一个,换行符是\r\n。
  • HTTP POST请求的格式
                 POST /path HTTP/1.1
                Header1: Value1
                Header2: Value2
                Header3: Value3
                body data goes here...

                当遇到连续两个\r\n时,Header部分结束,后面的数据全部是Body

  • HTTP响应的格式
                200 OK
                Header1: Value1
                Header2: Value2
                Header3: Value3
                body data goes here...

                HTTP响应如果包含body,也是通过\r\n\r\n来分隔的。

                Body的数据类型由Content-Type头来确定,如果是网页,Body就是文本,如果是图片,Body就是图片的二进制数据

6.服务器动态资源请求

  •  浏览器请求动态页面过程
  • WSGI
                 怎么可以不修改服务器和架构代码而确保可以在多个架构下运行web服务器呢?答案就是 Python Web Server Gateway Interface (或简称 WSGI,读作“wizgy”)
                WSGI允许开发者将选择web框架和web服务器分开。可以混合匹配web服务器和web框架,选择一个适合的配对。比如,可以在Gunicorn 或者 Nginx/uWSGI 或者 Waitress上运行 Django, Flask, 或 Pyramid。真正的混合匹配,得益于WSGI同时支持服务器和架构
                web服务器必须具备WSGI接口,所有的现代Python Web框架都已具备WSGI接口,它让你不对代码作修改就能使服务器和特点的web框架协同工作。
                WSGI由web服务器支持,而web框架允许你选择适合自己的配对,但它同样对于服务器和框架开发者提供便利使他们可以专注于自己偏爱的领域和专长而不至于相互牵制。其他语言也有类似接口:java有Servlet API,Ruby 有 Rack
  • 定义WSGI接口
                WSGI接口定义非常简单,它只要求Web开发者实现一个函数,就可以响应HTTP请求。我们来看一个最简单的Web版本的“Hello World!”
                def application(environ, start_response):
                    start_response('200 OK', [('Content-Type', 'text/html')])
                    return 'Hello World!'
                上面的application()函数就是符合WSGI标准的一个HTTP处理函数,它接收两个参数:
                        environ:一个包含所有HTTP请求信息的dict对象;
                        start_response:一个发送HTTP响应的函数
                整个application()函数本身没有涉及到任何解析HTTP的部分,也就是说,把底层web服务器解析部分和应用程序逻辑部分进行了分离,这样开发者就可以专心做一个领域了
                application()函数必须由WSGI服务器来调用。有很多符合WSGI规范的服务器。而我们此时的web服务器项目的目的就是做一个极可能解析静态网页还可以解析动态网页的服务器,两个参数environ和start_response我们没法提供,返回的str也没法发给浏览器

FTP协议

1.文本传输协议FTP提供在网络上的主机之间共享计算机程序或数据,向用户屏蔽不同主机中各文件存储系统的细节,以基于TCP采用面向连接的方式在客户和服务器之间提供可靠和高效的数据传输

2.FTP协议的工作原理

  • FTP工作在TCP/IP模型的应用层,采用TCP面向连接为文件数据的传输提供了可靠的报保证
  • FTP采用客户机-服务器模式,客户端需要安装FTP客户程序,服务器端需要启用FTP服务
  • FTP客户与服务器之间要建立双重连接,一是控制连接,使用TCP端口21,用来传输控制信息,一个是数据连接,使用TCP端口20,用于传递文件数据。FTP建立双重连接的原因在于FTP是一个交互式会话系统,客户端每次调用FTP,便于与服务器建立一个会话,会话以控制连接来维持,控制连接负责传输控制信息
  • Telnet程序是Internet上常用的远程登录工具,使用TCP端口23,其协议工作过程采用了选项协商的方式,Telnet采用的NVT ASCII字符集也用在其他的网络应用中
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值