Python基础在介绍异常处理时已经圆满结束了,有了一定的编程基础后,一起来学习一下网络编程,介绍单机计算机如何和其他计算机进行沟通。
C/S & B/S机构互联网通信软件有两种模式,分别是C/S架构和B/S架构。
C/S架构指的是Client-Server,分别有一个客户端软件和一个服务端软件,比如说计算机上安装的QQ、WeChat、Youku等都属于C/S架构的网络通信软件,需要安装客户端软件。B/S架构指的是Brower-Server,B/S架 构本质上也是C/S架构,B指的就是浏览器,在这种架构中浏览器就是客户端,比如访问百度,百度就是服务端 ,访问优酷网页端,优酷网页端就是服务端。计算机之间进行通信从根本上来说还是基于计算机硬件,计算机硬件之间通过物理介质进行通信。
网络通信介绍网络存在的意义就是跨地域传输数据,也称为通信;互联网的本质就是一系列的网络协议,这些协议规定了计算机如何接入Internet以及接入Internet的标准。比如说中国人和中国人打电话说的是中文,美国人和美国人打电话说的是英文。
因此可以说网络 = 物理链接介质 + 互联网通信协议。
网络通信协议互联网的核心就是由一堆协议组成,目前来讲世界上通用的语言是英语,如果将计算机比作人的话,互联网协议就是计算机界的英语,如果所有计算机都遵守互联网协议,那么所有的计算机都可以按照统一的标准进行收发信息从而完成通信。这些协议规定了计算机如何接入Internet以及接入Internet的标准。
互联网协议按照功能不同分为osi七层协议或者tcp/ip五层协议或者tcp/ip四层协议。OSI七层协议是国际标准化组织ISO提出的,但由于是市场原因和该协议本身的缺点(协议实现过于复杂等)导致起初市场上大规模使用的并不是该协议,而是因特网。所以有这样一个现象:得到最广泛应用的不是法律上的国际标准OSI,而是非国际标准TCP/IP五层协议。这样TCP/IP五层成为了事实上的国际标准。
TCP/IP五层协议将应用层、表示层、会话层合并为应用层,接下来我们就从TCP/IP五层协议的角度介绍每层的功能,理解互联网通信原理。
用户感知到的只有最上面一层协议即应用层,自上而下每层都依赖下一层,因此从最下面一层-物理层还是介绍,每层都有特定的协议,越往上越靠近用户,越往下越靠近硬件。
计算机之间想要一起happy,就必须接入Internet,就是计算机之间必须完成组网。物理层的主要功能就是发送电信号,一组物理层的数据称为位,单纯的电信号没有任何数据意义,必须对电信号进行分组才能使这些电信号具有数据意义。问题就是如何对这些电信号进行分组呢?这就是数据链路层的作用。
由于计算机之间通信的底层是基于电信号的,电信号只有两种状态0和1,但是单纯的电信号没有任何意义,必须对这些电信号进行分组,每组表示什么意义。因此数据链路层的主要作用就是定义电信号的分组方式。
以太网协议对电信号的分组方式以前是不统一的,后来形成统一的标准后,就是现在的以太网协议,因此,以太网协议规定了数据链路层对电信号的分组方式。
以太网协议规定,一组电信号构成一个数据包,叫做帧,每一个数据帧分成报头head和数据data两部分。
head – 固定包含18个字节 |
data – 46~1500字节 |
发送者/源地址:6个字节
接收者/目标地址:6个字节
数据类型:6个字节 |
电信号数据包的具体内容 |
每个数据帧包含的数据最短为64字节,最长为1518字节,如果超过最大限制就分片发送。
mac地址报头中发送者和接收者的地址又是如何来的呢?以太网协议规定接入Internet的设备都必须具备网卡,发送者和接收者的地址就是指网卡的地址,即mac地址。每块网卡在出场的时候就会被刻上世界上唯一的mac地址。
广播有了mac地址标识不同的计算机,同一网络内的两台计算机就可以通信了(一台计算机通过ARP协议获取另一台计算机的mac地址),以太网协议采用最原始的方式—广播进行通信,理论上只要有数据链路层就可以实现全世界的网络通信,但是这是非常不合理的,因为全世界的计算机不可能存在于同一个广播域。以太网协议广播的这种通信方式,会产生一个问题,就是发送者发送一个数据包时,在同一个网络中的其他计算机也可以收到这个数据包,数据量太大。
为了解决以太网协议的这种广播靠吼产生的问题,网络层就有了解决方案 — 将计算机放到不同的广播域中。
通过以太网协议,理论上来说世界上的计算机都可以进行彼此通信,但是世界上的互联网是由一个个彼此隔离的小的局域网组成的,如果所有的通信都采用以太网协议的这种广播进行信息发送,那么一台计算机发送的数据包全世界都能收得到,这已经不只是效率的问题了。因此必须找到一种方式来区分哪些计算机属于同一个广播域,在同一个广播域中的计算机可以通过广播的方式进行数据包的传输。网络层引入了一套新的地址来区分不同的广播域(子网),这套地址就是网络IP地址。
IP协议IP协议规定了网络地址,该地址称为IP地址,目前多数还是使用的v4版本ipv4,范围是0.0.0.0~255.255.255.255,一个IP地址通常写成四段十进制数比如112.162.78.49.
IP协议同时规定,一组数据称为一个数据包,数据包分成两部分,头和数据,头包含源IP地址和目标IP地址,数据是传输层发送过来的数据。IP地址分为两部分,一部分是网络部分,用来标识局域网(子网),另一部分是主机部分,用来标识主机,单纯的ip地址段只是标识了IP地址的种类,从网络部分或主机部分都无法辨识一个ip所处的子网。比如112.162.78.49和112.162.78.94并不能说明这两个IP地址属于同一个局域网。一个合法的ipv4地址组成部分应当是:IP地址 /子网掩码地址。
子网掩码子网掩码是表示局域网(子网)特征的一个参数,在形式上等同于IP地址,是一个32位二进制数字,网络部分全部为1,主机部分全部为0。比如,IP地址为172.16.10.1,如果已知网络部分是前24位,主机部分是后8位,那么该网络的子网掩码就是:
11111111.11111111.11111111.00000000,写成十进制就是255.255.255.0
子网掩码的功能就是用来判断任意两个IP地址是否处于同一个子网(局域网),判断两个IP 地址是否属于同一个局域网的方法就是将两个IP地址与子网掩码分别进行与运算(两个数位都为1,运算结果为1,否则为0)。如果比较结果相同,如果相同就表明它们在同一个子网中,否则不在。 判断两个计算机是否属于同一个局域网,比如:
# IP地址和子网掩码配合到一起会计算出一个广播域地址/子网地址/局域网地址
# 计算方式:将IP地址和子网掩码地址转换为二级制 --- 按位与运算
计算机1
172.16.10.1:10101100.00010000.00001010.00000001
255.255.255.0 11111111.11111111.11111111.00000000
计算结果:172.16.10.0:10101100.00010000.00001010.00000000
计算机2
172.16.10.2:10101100.00010000.00001010.00000010
255.255.255.0 11111111.11111111.11111111.00000000
计算结果:172.16.10.0:10101100.00010000.00001010.00000000
如果两个计算机处于同一个局域网,直接靠广播的方式进行数据包的传输,如果不属于同一个局域网,需要通过网关,将数据包输出到公网,根据IP协议传输给另一个网络地址。
ARP协议计算机通信基本靠吼,即广播的方式,所有上层的包到最后都要封装上以太网头,然后通过以太网协议发送,在谈及以太网协议时候,我们了解到通信是基于mac的广播方式实现,计算机在发包时,获取自身的mac是容易的,如何获取目标主机的mac,就需要通过ARP协议。
ARP协议是通过获取目标计算机的IP地址,从而获取获取其mac地址。
网络层的IP地址可以区分计算机属于哪个局域网,数据链路层的mac地址可以标识独一无二的计算机,那么如何对计算机上的应用程序进行标识呢?因为计算机发送的数据可能是由不同的应用程序发送,比如QQ、youku,标识计算机上的应用程序就需要靠端口,端口是应用程序与网卡关联的编号,端口的范围是0-65535,0-1023位系统占用端口。传输层的功能就是建立端口到端口的通信。传输层有两种协议分别是TCP协议和UDP协议。
TCP协议TCP协议也被称为好人协议,是可靠传输的,TCP数据包没有长度限制,理论上可以无限长,但是为了保证网络的效率,通常TCP数据包的长度不会超过IP数据包的长度,以确保单个TCP数据包不必再分割。
基于TCP协议的通信,客户端与服务端必须建立一个双向通信的通道,客户端和服务端在建立双向连接时需要进行三次握手,断开连接时则需要四次挥手。三次握手下图是客户端与服务端建立双向连接时进行三次握手的图解:
1 客户端向服务端发送一段TCP报文—请求连接 标记位:SYN,表示请求建立连接 序号:seq=x 客户端进入SYN_SENT阶段2 服务端从半连接池中取出来自客户端的连接请求,结束LISTEN状态,返回一段TCP报文给客户端:标记位:ACK=x+1:表示确认收到了客户端的连接序列号seq=x,并将x+1作为确认号返回给客户端 标记位:SYN(seq=y):确认收到连接请求的同时,向客户端发送连接请求,序号为seq=y 客户端进入EATABLISHED阶段,服务端进入SYN_RCVD阶段3 客户端接收到从服务端发送的确认收到收到请求的结果(ACK=x+1)及服务端发起的连接请求(SYN seq=y),并向服务端发送确认连接。标记位:ACK=y+1,表示确认收到了服务端的连接请求seq=y,并建立连接,将y+1作为确认号返回给服务端 服务端进入EATABLISHED阶段
如果你觉得上述描述不是很容易理解,我们可以与日常生活中的实际例子进行对比理解,比如将把客户端比作男孩,服务器比作女孩。用他们的交往来说明“三次握手”过程:(1)男孩喜欢女孩,于是写了一封信告诉女孩:我爱你,请和我交往吧!;写完信之后,男孩焦急地等待,因为不知道信能否顺利传达给女孩。(2)女孩收到男孩的情书后,心花怒放,原来我们是两情相悦呀!于是给男孩写了一封回信:我收到你的情书了,也明白了你的心意,其实,我也喜欢你!我愿意和你交往!; 写完信之后,女孩也焦急地等待,因为不知道回信能否能顺利传达给男孩。(3)男孩收到回信之后很开心,因为发出的情书女孩收到了,并且从回信中知道了女孩喜欢自己,并且愿意和自己交往。然后男孩又写了一封信告诉女孩:你的心意和信我都收到了,谢谢你,还有我爱你!女孩收到男孩的回信之后,也很开心,因为发出的情书男孩收到了。由此男孩女孩双方都知道了彼此的心意,之后就快乐地交流起来了~~客户端与服务端建立连接时为什么需要进行三次握手来建立双向通信连接呢?
为了防止服务器端开启一些无用的连接增加服务器开销以及防止已失效的连接请求报文段突然又传送到了服务端,因而产生错误。也可以这样理解:“第三次握手”是客户端向服务器端发送数据,这个数据就是要告诉服务器,客户端有没有收到服务器“第二次握手”时传过去的数据。若发送的这个数据是“收到了”的信息,接收后服务器就正常建立TCP连接,否则建立TCP连接失败,服务器关闭连接端口。由此减少服务器开销和接收到失效请求发生的错误。由于网络传输是有延时的(要通过网络光纤和各种中间代理服务器),在传输的过程中,比如客户端发起了SYN=1创建连接的请求(第一次握手)。如果服务器端就直接创建了这个连接并返回包含SYN、ACK和Seq等内容的数据包给客户端,这个数据包因为网络传输的原因丢失了,丢失之后客户端就一直没有接收到服务器返回的数据包。客户端可能设置了一个超时时间,时间到了就关闭了连接创建的请求。再重新发出创建连接的请求,而服务器端是不知道的,如果没有第三次握手告诉服务器端客户端收的到服务器端传输的数据的话, 服务器端是不知道客户端有没有接收到服务器端返回的信息的。
四次挥手
四次挥手对应的是客户端与服务端的连接断开,断开连接由哪一方先提出都可以,如下图所示:
1 首先客户端想要断开连接,向服务器端发送一段TCP报文–请求断开连接标记位:FIN,表示请求断开连接序号:seq=x+2客户端此时处于FIN_WAIT_1阶段,即半关闭状态,停止客户端向服务端发送数据,但是服务端仍然能够向客户端发送数据。2 服务端接收到从客户端发出的TCP报文即断开连接请求,服务端会返回确认收到客户端想要关闭连接标记位:ACK:表示收到客户端的断开连接请求序号:ACK=x+3服务端由ESTABLISHED状态进入CLOSE_WAIT半关闭状态,并开始准备释放服务端到客户端的连接 客户端结束FIN_WAIT_1阶段,进入FIN_WAIT_2阶段3 服务端向客户端传输数据已完成,再次向客户端发送断开连接的请求
标记位:FIN
序号:seq=y+1
服务端结束CLOSE_WAIT状态,进入LAST_ACK状态,并停止服务端到客户端的数据传输,但是客户端可以向服务端传输数据(前提是客户端通向服务端的连接没有关闭)
4 客户端接收从服务端发出的TCP报文,确认了服务端已经做好断开连接的准备,向服务端发送确认断开连接的报文
标记位:ACK:表示接收到服务端断开连接的请求
序号:ACK=y+2
客户端结束FIN_WAIT_2阶段,进入TIME_WAIT阶段,随后客户端开始在TIME_WAIT阶段等待2MSL 服务器端收到从客户端发出的TCP报文之后结束LAST-ACK阶段,进入CLOSED阶段。由此正式确认关闭服务器端到客户端方向上的连接。
客户端等待完2MSL之后,结束TIME-WAIT阶段,进入CLOSED阶段,由此完成“四次挥手”。
如果还用男生女生谈恋爱来通俗的表示四次挥手的过程,则可以通俗的理解为:
把客户端比作男孩,服务器比作女孩。通过他们的分手来说明“四次挥手”过程。
“第一次挥手”:日久见人心,男孩发现女孩变成了自己讨厌的样子,忍无可忍,于是决定分手,随即写了一封信告诉女孩。
“第二次挥手”:女孩收到信之后,知道了男孩要和自己分手,怒火中烧,心中暗骂:你算什么东西,当初你可不是这个样子的!于是立马给男孩写了一封回信:分手就分手,给我点时间,我要把你的东西整理好,全部还给你!男孩收到女孩的第一封信之后,明白了女孩知道自己要和她分手。随后等待女孩把自己的东西收拾好。
“第三次挥手”:过了几天,女孩把男孩送的东西都整理好了,于是再次写信给男孩:你的东西我整理好了,快把它们拿走,从此你我恩断义绝!
“第四次挥手”:男孩收到女孩第二封信之后,知道了女孩收拾好东西了,可以正式分手了,于是再次写信告诉女孩:我知道了,这就去拿回来!这里双方都有各自的坚持。女孩自发出第二封信开始,限定一天内收不到男孩回信,就会再发一封信催促男孩来取东西!男孩自发出第二封信开始,限定两天内没有再次收到女孩的信就认为,女孩收到了自己的第二封信;若两天内再次收到女孩的来信,就认为自己的第二封信女孩没收到,需要再写一封信,再等两天…..
倘若双方信都能正常收到,最少只用四封信就能彻底分手!这就是“四次挥手”。
四次挥手时客户端必须在TIME-WAIT状态下等待2MSL,原因就是要确认服务器端是否收到客户端发出的ACK确认报文,当客户端发出最后的ACK确认报文时,并不能确定服务器端能够收到该段报文。所以客户端在发送完ACK确认报文之后,会设置一个时长为2MSL的计时器。MSL指的是Maximum Segment Lifetime:一段TCP报文在传输过程中的最大生命周期。2MSL即是服务器端发出为FIN报文和客户端发出的ACK确认报文所能保持有效的最大时长。服务器端在1MSL内没有收到客户端发出的ACK确认报文,就会再次向客户端发出FIN报文;如果客户端在2MSL内,再次收到了来自服务器端的FIN报文,说明服务器端由于各种原因没有接收到客户端发出的ACK确认报文。客户端再次向服务器端发出ACK确认报文,计时器重置,重新开始2MSL的计时;否则客户端在2MSL内没有再次收到来自服务器端的FIN报文,说明服务器端正常接收了ACK确认报文,客户端可以进入CLOSED阶段,完成“四次挥手”。所以,客户端要经历时长为2SML的TIME-WAIT阶段;这也是为什么客户端比服务器端晚进入CLOSED阶段的原因。
UDP协议UDP协议是不可靠传输的,发送数据之前不需要建立连接,同理发送数据结束也没有连接可以释放,这极大减少了资源开销,但是UDP协议不保证数据的可靠交付,只负责将数据尽可能快的发出去。
用户使用的都是应用程序,都工作在应用层,互联网是开放的,大家都可以开发自己的应用程序,数据多种多样,就必须规定好应用层的数据的组织形式,因此应用层的功能就是规定应用程序的数据格式。TCP协议可以为各种各样的程序传递数据,比如邮件、文件等,因此就必须有不同的协议来规定邮件、网页、文件等数据的格式,这些应用程序的协议就构成了应用层,这些协议就包括HTTP协议、SMTP、FTP等协议。
网络通信流程下面这张图片很好地总结了这几层协议数据传输的封包和解包过程:
计算机想要实现网络通信,每台计算机需要具备四种要素:本机IP地址子网掩码网关的IP地址DNS的IP地址
在互联网中其实没有类似于www.baidu.com这种域名的概念,而应该是IP地址,比如百度的IP地址是112.112.112.0,在浏览器中应该输入此IP地址,也可以访问百度,但是如今网站的数量数不胜数,如果要记住这么多网站的IP地址实在是一个非常大的挑战,所以DNS就出出现了。这里并不对DNS进行详细的介绍,如果有想要详细的了解DNS的小伙伴,可以自行搜索相关知识,这对我们正常编程影响不大。这里只需要知道,DNS的主要作用就是将IP地址解析为域名,比如将112.112.112.0解析为www.baidu.com。
我们知道基于网络通信的软件有两种:BS架构、CS架构。不同之处在于BS架构没有客户端软件,它依赖浏览器(特殊的客户端)。在网络通信流程方面的不同之处在于,BS架构的软件在客户端(浏览器网址输入栏)多一个DNS域名解析过程。在浏览器的网址输入栏上输入一个网址,按回车键到获取页面响应信息发生了以下几件事情:在浏览器的url输入框中输入想访问的地址.(1) 在发送http请求之前,需要进行域名解析得到目标服务器的IP地址,查询请求会先找到本地 DNS 服务器来查询是否包含 IP 地址,如果本地 DNS 无法查询到目标 IP 地址,就会向根域名服务器发起一个 DNS 查询用户需要访问的IP地址。(2) 浏览器和目标服务器建立TCP连接。(3) 建立连接之后浏览器会向目标服务器发起http请求,请求数据包。(4) 如果目标服务器是一个简单的页面,就会直接返回。对于需要的重定向的页面,浏览器在获取了重定向响应后,找到重定向地址,重复第一步操作,然后浏览器重新发送请求,携带新的 URL,目标服务器返回数据。
转载请注明:XAMPP中文组官网 » 计算机语言基础知识之网络通信协议