计算机网络的发展

早期 : 联机

 以太网 : 局域网与交换机

软件开发的架构

1.C/S架构

C/S即:Client与Server ,中文意思:客户端与服务器端架构,这种架构也是从用户层面(也可以是物理层面)来划分的。

这里的客户端一般泛指客户端应用程序EXE,程序需要先安装后,才能运行在用户的电脑上,对用户的电脑操作系统环境依赖较大。

2.B/S架构

B/S即:Browser与Server,中文意思:浏览器端与服务器端架构,这种架构是从用户层面来划分的。

Browser浏览器,其实也是一种Client客户端,只是这个客户端不需要大家去安装什么应用程序,只需在浏览器上通过HTTP请求服务器端相关的资源(网页资源),客户端Browser浏览器就能进行增删改查。

解耦分治的思想 —— 统一入口

b/s架构是c/s架构的关系:b/s架构是c/s架构的一种

想要实现通信:网卡和网线,网卡上有全球唯一的mac地址

三.网络基础

1.一个程序如何在网络上找到另一个程序

ip地址+端口:

'''
IP地址是一个32位的二进制数,通常被分割为4个“8位二进制数”(也就是4个字节)
IP地址通常用“点分十进制”表示成(a.b.c.d)的形式,其中,a,b,c,d都是0~255之间的十进制整数。例:点分十进IP地址(100.4.5.6),实际上是32位二进制数(01100100.00000100.00000101.00000110)
"端口"是英文port的意译,可以认为是设备与外界通讯交流的出口
因此ip地址精确到具体的一台电脑,而端口精确到具体的程序

规定网络地址的协议叫ip协议,它定义的地址称之为ip地址,广泛采用的v4版本即ipv4,它规定网络地址由32位2进制表示
范围0.0.0.0-255.255.255.255
一个ip地址通常写成四段十进制数,例:172.16.10.1
保留字段192.168. . 
127.0.0.1 本地的回环地址

在计算机上 每一个需要的网络通信的程序 都会开一个端口
在同一时间只会有一个程序占用一个端口
不可能在同一时间同一个计算机上有两个程序 占用同一个端口
端口的范围:0-65535
一般情况下 8000 之后的端口
ip --确定唯一一台机器
端口 -- 确定唯一的一个程序
ip+端口 找到唯一的一台机器上的唯一的一个程序
'''

2.广播风暴

  主机之间“一对所有”的通讯模式,网络对其中每一台主机发出的信号都进行无条件复制并转发,所有主机都可以接收到所有信息(不管你是否需要),由于其不用路径选择,所以其网络成本可以很低廉。有线电视网就是典型的广播型网络,我们的电视机实际上是接受到所有频道的信号,但只将一个频道的信号还原成画面。在数据网络中也允许广播的存在,但其被限制在二层交换机的局域网范围内,禁止广播数据穿过路由器,防止广播数据影响大面积的主机。

3.mac地址

  head中包含的源和目标地址由来:ethernet规定接入internet的设备都必须具备网卡,发送端和接收端的地址便是指网卡的地址,即mac地址。

  mac地址:每块网卡出厂时都被烧制上一个世界唯一的mac地址,长度为48位2进制,通常由12位16进制数表示(前六位是厂商编号,后六位是流水线号)

4.arp协议 ——查询IP地址和MAC地址的对应关系 

  地址解析协议,即ARP(Address Resolution Protocol),是根据IP地址获取物理地址的一个TCP/IP协议。
  主机发送信息时将包含目标IP地址的ARP请求广播到网络上的所有主机,并接收返回消息,以此确定目标的物理地址。
  收到返回消息后将该IP地址和物理地址存入本机ARP缓存中并保留一定时间,下次请求时直接查询ARP缓存以节约资源。
  地址解析协议是建立在网络中各个主机互相信任的基础上的,网络上的主机可以自主发送ARP应答消息,其他主机收到应答报文时不会检测该报文的真实性就会将其记入本机ARP缓存;由此攻击者就可以向某一主机发送伪ARP应答报文,使其发送的信息无法到达预期的主机或到达错误的主机,这就构成了一个ARP欺骗。ARP命令可用于查询本机ARP缓存中IP地址和MAC地址的对应关系、添加或删除静态对应关系等。相关协议有RARP、代理ARP。NDP用于在IPv6中代替地址解析协议。 

5.广域网与路由器

  路由器(Router),是连接因特网中各局域网、广域网的设备,它会根据信道的情况自动选择和设定路由,以最佳路径,按前后顺序发送信号。 路由器是互联网络的枢纽,"交通警察"。目前路由器已经广泛应用于各行各业,各种不同档次的产品已成为实现各种骨干网内部连接、骨干网间互联和骨干网与互联网互联互通业务的主力军。路由和交换机之间的主要区别就是交换机发生在OSI参考模型第二层(数据链路层),而路由发生在第三层,即网络层。这一区别决定了路由和交换机在移动信息的过程中需使用不同的控制信息,所以说两者实现各自功能的方式是不同的。
  路由器(Router)又称网关设备(Gateway)是用于连接多个逻辑上分开的网络,所谓逻辑网络是代表一个单独的网络或者一个子网。当数据从一个子网传输到另一个子网时,可通过路由器的路由功能来完成。因此,路由器具有判断网络地址和选择IP路径的功能,它能在多网络互联环境中,建立灵活的连接,可用完全不同的数据分组和介质访问方法连接各种子网,路由器只接受源站或其他路由器的信息,属网络层的一种互联设备。
  局域网(Local Area Network,LAN)是指在某一区域内由多台计算机互联成的计算机组。一般是方圆几千米以内。局域网可以实现文件管理、应用软件共享、打印机共享、工作组内的日程安排、电子邮件和传真通信服务等功能。局域网是封闭型的,可以由办公室内的两台计算机组成,也可以由一个公司内的上千台计算机组成。
  所谓”子网掩码”,就是表示子网络特征的一个参数。它在形式上等同于IP地址,也是一个32位二进制数字,它的网络部分全部为1,主机部分全部为0。比如,IP地址172.16.10.1,如果已知网络部分是前24位,主机部分是后8位,那么子网络掩码就是11111111.11111111.11111111.00000000,写成十进制就是255.255.255.0。
  知道”子网掩码”,我们就能判断,任意两个IP地址是否处在同一个子网络。方法是将两个IP地址与子网掩码分别进行AND运算(两个数位都为1,运算结果为1,否则为0),然后比较结果是否相同,如果是的话,就表明它们在同一个子网络中,否则就不是。
比如,已知IP地址172
.16
.10
.1
和172
.16
.10
.2
的子网掩码都是255
.255
.255
.0,请问它们是否在同一个子网络?两者与子网掩码分别进行AND运算,

172.16
.10
.1:10101100.00010000
.00001010
.000000001
255.255
.255
.0: 11111111.11111111
.11111111
.00000000
AND运算得网络地址结果:10101100.00010000
.00001010
.000000001->172.16
.10
.0

172.16
.10
.2:10101100.00010000
.00001010
.000000010
255.255
.255
.0: 11111111.11111111
.11111111
.00000000
AND运算得网络地址结果:10101100.00010000
.00001010
.000000001->172.16
.10
.0
结果都是172
.16
.10
.0,因此它们在同一个子网络。
'''
其位运算
将数字转换成等价的二进制形式后在进行处理数据
&      x&y(按位与)    如果两个操作数的相应均为1,则该位的结果为1
|       x|y(按位或)    如果两个操作数的相应为有一个为1,则该位的结果为1
~      ~x(按位取反)  讲操作数按位取反(0->1和1->0)
^       ^x(按位异或)  如果参数运算的两个操作数的相应同号,则结果为0,异号为1
<<     x<<2(左移2位) 左端(高位)溢出部分舍弃,右端低位补0
>>     x>>2(右移2位) 右端(低位)溢出部分舍弃,左端根据符号补0或者1,无符号或整数补0,负数补1
按位运算中需要将要运算的数值转换为补码的形式,然后考虑是32位还是64位,比如右移的情况下
-5    原码  1000 0101  //中间的零根据32位还是64位变换多位
       反码  1111 1010
       补码  1111 1011  //补码在右侧加1,同时补上符号位
左移的情况下
1000 1111
左移一位,
0001 1110
只需要右边补0就行
'''

6.tcp协议和udp协议

TCP协议

当应用程序希望通过 TCP 与另一个应用程序通信时,它会发送一个通信请求。这个请求必须被送到一个确切的地址。在双方“握手”之后,TCP 将在两个应用程序之间建立一个全双工 (full-duplex) 的通信。

  这个全双工的通信将占用两个计算机之间的通信线路,直到它被一方或双方关闭为止。

tcp协议:是可靠地面向连接的 是全双工的

全双工 双方都可以收发信息

建立连接三次握手 断开连接四次挥手

一方发起请求另一方同意请求

tcp协议是全双工的 必须双方同意

UDP协议(不需要建立连接 快并且不占连接)

  当应用程序希望通过UDP与一个应用程序通信时,传输数据之前源端和终端不建立连接。

  当它想传送时就简单地去抓取来自应用程序的数据,并尽可能快地把它扔到网络上。

tcp和udp的对比

TCP---传输控制协议,提供的是面向连接、可靠的字节流服务。当客户和服务器彼此交换数据前,必须先在双方之间建立一个TCP连接,之后才能传输数据。TCP提供超时重发,丢弃重复数据,检验数据,流量控制等功能,保证数据能从一端传到另一端。 
UDP---用户数据报协议,是一个简单的面向数据报的运输层协议。UDP不提供可靠性,它只是把应用程序传给IP层的数据报发送出去,但是并不能保证它们能到达目的地。由于UDP在传输数据报前不用在客户和服务器之间建立一个连接,且没有超时重发等机制,故而传输速度很快。

7.互联网协议

我们开发其主要运用中间五层

 

socket概念

套接字(socket)的发展史

套接字家族的名字:AF_UNIX

unix一切皆文件,基于文件的套接字调用的就是底层的文件系统来取数据,两个套接字进程运行在同一机器,可以通过访问同一个文件系统间接完成通信。

套接字家族的名字:AF_INET

(还有AF_INET6被用于ipv6,还有一些其他的地址家族,不过,他们要么是只用于某个平台,要么就是已经被废弃,或者是很少被使用,或者是根本没有实现,所有地址家族中,AF_INET是使用最广泛的一个,python支持很多种地址家族,但是由于我们只关心网络编程,所以大部分时候我么只使用AF_INET)。

基于TCP协议的socket

server端

import socket
sk = socket.socket()
#sk.bind(('ip','port'))
sk.bind(('127.0.0.1',8898))  #把地址绑定到套接字
sk.listen()          #监听链接
conn,addr = sk.accept() #接受客户端链接
ret = conn.recv(1024)  #接收客户端信息
print(ret)       #打印客户端信息
conn.send(b'hi')        #向客户端发送信息
conn.close()       #关闭客户端套接字
sk.close()        #关闭服务器套接字(可选)

client端

import socket
sk = socket.socket()           # 创建客户套接字
sk.connect(('127.0.0.1',8898))    # 尝试连接服务器
sk.send(b'hello!')
ret = sk.recv(1024)         # 对话(发送/接收)
print(ret)
sk.close()            # 关闭客户套接字
#加入一条socket配置,重用ip和端口
import socket
from socket import SOL_SOCKET,SO_REUSEADDR
sk = socket.socket()
sk.setsockopt(SOL_SOCKET,SO_REUSEADDR,1) #就是它,在bind前加
sk.bind(('127.0.0.1',8898))  #把地址绑定到套接字
sk.listen()          #监听链接
conn,addr = sk.accept() #接受客户端链接
ret = conn.recv(1024)   #接收客户端信息
print(ret)              #打印客户端信息
conn.send(b'hi')        #向客户端发送信息
conn.close()       #关闭客户端套接字
sk.close()        #关闭服务器套接字(可选)

 

posted on 2018-01-25 21:04  Kindergarten_Panda  阅读(147)  评论(0编辑  收藏  举报