Python课程回顾(day26)网络编程
一 客户端/服务端架构(C/S架构)
在了解互联网协议之前我们需要先了解一个知识点,即C/S与B/S架构
所谓的CS架构指的就是client(客户端)与server(服务器)结合的一种结构,是服务端根据需求给客户端提供服务的一种架构
而B/S架构指的就是browser(浏览器)与server结合的一种结构,而B/S架构也是C/S架构的一种
我们要学的网络编程就是为了要完成C/S架构的开发!
OSI七层协议
我们首先要知道,我们的计算机都是分为硬件、操作系统、应用程序这三层的,有了这三层我们才可以使用计算机来进行一系列的工作,不过这些工作都只能是一些单机程序,即只能自己跟自己玩,既不能与其他计算机通信,也不能访问其他计算机的数据:
那么如果你想要实现这些功能,那就必需接入互联网
而互联网又是什么呢?
互联网的本质就是一堆协议,你想,我们人类之间通信必须要建立在一个语言标准之上,那么计算机又何尝不是,假设每台计算机都有自己的一个标准,那么想要通讯是不是首先知道并学习对方的标准呢?而OSI七层协议做的就是这个事情,将计算机与计算机之间的通讯标准给统一了起来,统一起来之后所有的计算机都按照这个标准去收发信息就可以完成通信。
人们按照分工的不同将互联网协议从逻辑上划分了等级,这就是OSI七层协议。
如图:
每层运行时常见的物理设备:
从上图我们可以看出,其实应用层、表示层、会话层其实都属于应用层的范围,我们平时操作的都是应用层,越往下越靠近硬件,但其实这五层协议从上到下,每一层都依赖于下一层。所以我们从最底层开始了解,只要搞清楚了每层协议的主要内容,就理解了互联网通信的基本原理。
1.物理层
上面提到:计算机如果想要与其他计算机通讯就必须要链接到internet,那么物理层就是以一些物理链接介质来将所有计算机都链接到internet这个大家庭中,而这些介质的主要功能则是基于电的特性发送高低电压或电信号,高电压对应数字1,低电压对应数字0。
2.数据链路层
其实单纯的只发送高低电信号是没有任何意义的,而数据链路层的功能就是将电信号进行了一系列的分组,即多少电信号位为一组,每组又代表着什么意思。而在早期,每个公司的计算机都有着自己的分组方式,这代表着计算机只能在公司内之间相互通讯,发到另外一个计算机是没有用的。这在很大程度上阻碍了计算机的发展。所以就有了以太网协议
以太网协议:
每一组电信号构成一个数据报,也叫做‘帧’
而每一组数据报则分为报头与数据两个部分
head中包含了固定的18个字节,指的就是对数据报的描述。
发送者名称|发送者地址,占用6个字节
接收者名称|接收者地址,占用6个字节
数据的类型,占用6个字节
data中则包含数据报的具体内容:
最短46个字节最长1500字节的数据报内容
若要发送的数据报总体长度超过head与data规定的范围内,那就分片发送
源地址与目标地址的由来:
但凡接入Internet的计算机都必须具备一个唯一的地址,即我们的网卡,也称之为mac地址,而发送端与接收端消息的传递就是基于mac地址进行通信的,而mac地址则是在计算机出厂时就有的一个全世界唯一的地址,长度为48位2进制,通常由12位16进制数表示(前六位是厂商地址,后六位是流水线号)。
其实有了mac地址,同一网络内的两台主机就可以实现通信了,而以太网采用的通信方式非常古老,即通信基本靠吼:
3.网络层
基于以太网规定的协议,我们又有了mac地址,其实目前已经可以实现世界上所有的计算机都可以通信了,但问题是互联网是由一个个隔离的小的局域网组成的,如果所有的通信都采用以太网的广播方式,那么一台机器发送的包全世界都会收到,如果世界上所有的计算机同时发包,那么没有任何一台计算机是可以存储这么大的信息量的,这就不仅仅是效率的问题了,如图:
从图中我们可以得出结论:若所有的计算机都将数据包发送到Internet,那所有人都会收到一份,不仅计算机会卡死,数据若想要找到具体的mac地址就不知道需要多久了。
所以我们必须找到一种方法来区分哪些计算机在同一个局域网,哪些计算机不在同一个局域网,如果在,那就使用广播的方式发送数据,如果不在,那就使用向不同广播域分发数据包的方式(也称为路由方式)发送数据。而网络层的功能就是引入一套新的地址用来区分不同的广播域、子网,这套地址就称为网络地址(IP协议)。
IP协议:
IP协议中所定义的网络地址统称为IP地址,广泛采用的是IPv4版本,它规定的网络地址由32位二进制数表示
IP协议规定的网络地址范围:0.0.0.0 ---> 255.255.255.255
每个IP通常以四段十进制数来表示: 例如 --> 192.168.10.1
IP地址:
每个IP地址都分为两个部分:
网络部分:标识子网
主机部分:标识主机
需要强调的是:单纯的IP地址只是标识了IP地址的种类,该种类无论从网络部分还是主机部分都无法识别一个IP所处的子网
例:不要单纯的以为 172.16.10.1 与 172.16.10.2 是处于同一子网内的
子网掩码
子网掩码指的其实就是网络特征的一个参数,它在形式上等同于IP地址,也是一个32位的二进制数字,它的网络部分全部为1,主机部分全部为0。而知道了子网掩码其实我们就能判断任意两个IP地址是否处于同一个子网,方法是将两个IP地址与子网掩码分别进行AND运算(两个数位都为1,运算结果才为1,否则为0),然后比较结果是否相同,如果是的话,就表明他们在同一子网内,否则就不是。总的来说,IP协议的主要作用有两个,一是为每一台计算机分配网络地址,二是确定哪些计算机在同一子网。
IP数据包
IP数据包也分为报头和数据两部分,无须为IP包定义单独的栏位,直接放入以太网的数据部分。报头的长度为20到60字节,数据的长度为0到65515字节。但以太网协议规定的数据最长字节长度为1500,所以如果数据长度超过1500,就需要分割成几个以太网数据包分开发送。
ARP协议
上面提到过,目前计算机的通信都是以广播的方式进行通信的,而所有上层的包到最后都要封装上以太网的报头,然后再通过以太网协议进行发送,而以太网协议的通信又是基于mac地址的广播方式进行实现的,所以计算机在发包的时候,获取自身mac地址是很容易的,但如何获取目标主机的mac地址呢?那么ARP协议的作用就是帮助我们获取对方主机mac地址的。
ARP协议工作原理
一:ARP协议首先通过IP地址和子网掩码区分出自己所处的子网地址。
二:分析本机的IP地址与对方的IP地址是否处于同一子网,若不是同一子网,则或获取当前子网的网关地址,再由网关地址发送到目标IP所在的网关地址。
三:若处于同一子网内,这个包则会以广播的方式在发送端所处的子网内进行传输,所有子网的主机都会进行拆包,若发现目标为自己的计算机,则响应并返回自己的mac地址,ARP协议收到地址后会记录当前计算机的mac地址以便于下一次发送。
4.传输层
虽然网络层的IP地址帮我们来区分子网,以太网层的mac地址又帮助我们找到主机,但大家在进行计算机的一系列操作时使用的都是应用程序,即我们电脑上的各种软件(QQ,微信,各种播放APP等等),那么我们在找到了一台特定的主机之后,又如何标识这台计算机之上的应用程序呢?答案就是端口,端口是每个应用程序与网卡关联的唯一编号。而传输层的功能就是建立服务器端口到客户端端口的通信链接。端口范围为0到6535,其中0到1024大大多数是给系统提供的,不建议使用。而传输层又细分为两层协议,分别为TCP协议与UPD协议。
TCP协议
TCP协议传输又称为可靠传输与TCP流式协议,TCP的数据长度是没有具体限制的,理论上来说是可以无限延长的,但为了保证数据在网络中传输的效率,通常TCP的数据长度不会超过IP数据包的长度,以确保单个TCP数据包不需要再进行分割。而可靠传输则是由于以TCP协议进行数据传输时,传输成功会收到来自客户端的一个确认信息,不成功的话服务端则会在一段时间内再次进行发送,直到收到客户端回应的确认收到信息。
TCP的报文
TCP的三次握手与四次挥手
Client:客户端
Server:服务端
SYN_SENT(connect()):发送的链接请求
LISTEN(listen()):监听发送的链接请求,可以设置一个半链接池,即同一时间可以接收的最大请求数。
SYN_RCVD:
ESTABLISHED:建立成功的结果
FIN_WAIT:
CLOSE_WAIT:
LAST_ACK:
TIME_WAIT:
syn,seq:发送链接请求,并自带一个序号seq
ack:回应请求,是基于seq序号的回应
UDP协议
UDP协议传输又称为不可靠传输,首先UDP的报头部分一共就只有8个字节,总长度不会超过65535个字节,正好可以放进一个IP数据包。不可靠则指的是基于UDP协议进行的传输是不会等待也不需要客户端的回应信息的,数据发出去之后就不会管客户端有没有收到。而UDP可以确保数据完整的字节数仅仅只有512个字节。
5.应用层