网络

2017-10-18  本文已影响0人  哲逗年

话说两台电脑要通讯就必须遵守共同的规则,就好比两个人要沟通就必须使用共同的语言一样。一个只懂英语的人,和一个只懂中文的人由于没有共同的语言(规则)就没办法沟通。两台电脑之间进行通讯所共同遵守的规则,就是网络协议。

网络协议介绍

国际标准化组织(ISO)定义了网络协议的基本框架,被称为OSI模型。
OSI模型制定了七层标准模型,分别是:

物理层

它就是把电脑连接起来的物理手段(光缆、电缆、双绞线、无线电波等)。它主要规定了网络的一些电气特性,作用是负责传送0和1的电信号。

链路层

单纯的0和1没有任何意义,必须规定解读方式:多少个电信号算一组?每个信号位有何意义?这就是“链路层”的功能,确定了0和1的分组方式。
早期的是,每家公司都有自己的电信号分组方式,逐渐的,一种叫做“以太网”的协议,占据了主导地位。
以太网规定,一组电信号构成一个数据包,叫做“帧”。每一帧分成两个部分,首部(Head)和数据(Data)。

由此可以看出,整个“帧”的最小长度为64字节,最长为1518字节。如果数据很长,就必须分割成多个帧进行发送。

链路层-MAC地址

MAC地址就是数据包的发送地址和接收地址。以太网规定,连入网络的所有设备,都必须具有“网卡”接口。数据包必须是从一块网卡传送到另外一块网卡。网卡的地址就是数据包的发送地址和接收地址,这也叫做MAC地址。
每块网卡出厂的时候,都有一个全世界独一无二的MAC地址,长度是48个二进制位,通常用12个十六进制数表示。(00-B0-D0-86-BB-F7),前6个是该厂商的网卡流水号,有了MAC地址,就可以定位网卡和数据包的路径了。

链路层-广播

有了MAC地址后,系统怎么才能把数据包准确传送到接收方?以太网采用了一种很原始的方式,它不是把数据包准确送到接收方,而是向本网络内所有计算机发送,让每台计算机自己判断,是否为接收方。这种发送方式就叫做“广播”。
有了数据包的定义,网卡的MAC地址、广播的发送方式,“链路层”就可以在多台计算机之间传送数据了。

网络层

网络层-由来

以太网以广播方式发送数据包,所有成员人手一“包”,不仅效率低,而且局限在发送者所在的子网络。也就是说,如果两台计算机不在同一个子网络,广播是传不过去的。因为,必须找到一种方法,能够区分哪些MAC地址属于同一个子网络,哪些不是,如果是同一个子网络,就以广播方式发送,否则就采用“路由”方式发送。遗憾的是,MAC地址本身无法做到这一点,它只与厂商有关,与所处网络无关。

这就导致了“网络层”的诞生,它的作用是引进一套新的地址,使得我们能够区分不同的计算机是否属于同一个子网络。这套地址就叫做“网络地址”,简称“网址”。

于是,网络层出现以后,每台计算机就有了两种地址,一种是MAC地址,另一种是网络地址。两种地址之间没有任何联系,MAC地址是绑定在网卡上的,网络地址则是管理员分配的,他们只是随机组合在一起。
网络地址帮助我们确定计算机所在的子网络,MAC地址则将数据包发送到该子网络中的目标网卡。因此,从逻辑上可以推断,必定是先处理网络地址,然后再处理MAC地址。

网络层-IP协议

规定网络地址的协议,叫做IP协议。它所定义的地址,就被称为IP地址。目前,广泛采用的是IP协议第四版,简称IPv4。这个版本规定,网络地址由32个二进制位组成,例如172.16.254.1==10101100.00010000.11111110.00000001。

习惯上,我们用分成四段的十进制数表示IP地址,从0.0.0.0一直到255.255.255.255。

互联网上的每一台计算机,都会分配到一个IP地址。这个地址分成两部分,前一部分代表网络,后一部分代表主机。比如,IP地址172.16.254.1,这是一个32位的地址,假定它的网络部分是前24位(172.16.254),那么主机部分就是后8位(最后的一个1)。处于同一个子网络的电脑,他们IP地址的网络部分必定是相同的,也就是说172.16.254.2应该与172.16.254.1处在同一个子网络。

但是怎么区分网络部分和主机部分是哪几位,怎样才能从IP地址,判断两台计算机是否属于同一个子网络呢?这就是需要“子网掩码”来识别。

所谓“子网掩码”,就是表示子网络特征的一个参数。它在形式上等同于IP地址,也就是一个32位二进制数字,它的网络部分全部位1,主机部分全部0。比如,IP地址172.16.254.1,如果已知网络部分是前24位,主机部分是后8位,那么子网络掩码就是11111111.11111111.11111111.00000000,写成十进制就是255.255.255.0。

知道“子网掩码”,我们就能判断,任意两个IP地址是否处在同一个子网络。方法是将两个IP地址和子网掩码分别进行AND运算(两个数位都位1,运算结果位1,否则为0),然后比较结果是否相同,如果是的话,就表明他们在同一个子网络中,否则就不是。

比如,已知IP地址172.16.254.1和172.16.254.233的子网掩码都是255.255.255.0,请问它们是否在同一个子网络?两者与子网掩码分别进行AND运算,结果都是172.16.254.0,因此它们处在同一个子网络。

总计一下,IP协议的作用主要有两个,一个是为每一台计算机分配IP地址,另一个是确定哪些地址在同一个子网络。

网络层-IP数据包

根据IP协议发送的数据,就叫做IP数据包。不难想象,其中必定包含IP地址信息。但是前面说过,以太网数据包只包含MAC地址,并没有IP地址的栏位。那么是否需要修改数据定义,再添加一个栏位呢?

回答是不需要,我们可以把IP数据包直接放进以太网数据包的“数据”部分,因此完全不用修改以太网的规格。

具体来说,IP数据包也分为“首部”和“数据”两个部分。

网络层-ARP协议

因为IP数据包是放在以太网数据包里发送的,所以我们必须同时知道两个地址,对方的MAC地址和IP地址,通常情况下,对方的IP地址是已知的,但是我们不知道它的MAC地址。
所以我们需要一种机制,能够从IP地址得到MAC地址。

这里又分为两种情况。第一种情况,如果两台主机不在同一个子网络,那么事实上没有办法得到对方的MAC地址,只能把数据包传送到两个子网络连接处的“网关”,让网关去处理。

第二种情况,如果两台主机在同一个子网络,那么我们可以用ARP协议,得到对方的MAC地址。ARP协议也是发出一个数据包(包含在以太网数据包中),其中包含它所有查询主机的IP地址,在对方的MAC地址这一栏的,填的是FF:FF:FF:FF:FF:FF,表示这是一个“广播”地址。它所在子网络的每一台主机,都会收到这个数据包,从中取出IP地址,与自身的IP地址进行比较。如果两者相同,都做出回复,向对方报告自己的MAC地址,否则就丢弃这个包。

总之,有了ARP协议后,我们就可以得到同一个子网络内的主机MAC地址,可以把数据包发送到任意一台主机上了。

传输层

有了MAC地址和IP地址,我们已经可以在互联网上任意两台主机上建立通信。接下来的问题是,同一台主机上有许多程序都需要用到网络,比如,你一边浏览网页,一边与朋友在线聊天。当一个数据包从互联网上发来的时候,你怎么知道,它是表示网页的内容,还是表示在线聊天的内容?

也就是说,我们还需要一个参数,表示这个数据包到底供哪个程序(进程)使用。这个参数就叫做"端口"(port),它其实是每一个使用网卡的程序的编号。每个数据包都发到主机的特定端口,所以不同的程序就能取到自己所需要的数据。

"端口"是0到65535之间的一个整数,正好16个二进制位。0到1023的端口被系统占用,用户只能选用大于1023的端口。不管是浏览网页还是在线聊天,应用程序会随机选用一个端口,然后与服务器的相应端口联系。

"传输层"的功能,就是建立"端口到端口"的通信。相比之下,"网络层"的功能是建立"主机到主机"的通信。只要确定主机和端口,我们就能实现程序之间的交流。因此,Unix系统就把主机+端口,叫做"套接字"(socket)。有了它,就可以进行网络应用程序开发了。

传输层-TCP/IP协议

虽然国际标准化组织制定了这样一个网络协议的模型,但是实际上互联网通讯使用的网络协议是TCP/IP协议。
TCP/IP是一个协议族,也是按照层次划分。共四层:

TCP/IP协议和OSI模型的区别:
OSI网络协议模型,是一个参考模型,而TCP/IP协议是事实上的标准。TCP/IP协议参考了OSI模型,但是并没有严格按照OSI规定的七层去划分标准,而只划分了四层。

其实这两者并不冲突,TCP/IP协议中的应用层就对应于OSI中的应用层/表示层/会话层,就相当于一个部门做三个部门的事,本质上没有区别。

TCP/IP中有两个重要的协议,传输层的TCP协议和互联网络层的IP协议,因此就拿这两个协议做代表,来命名整个协议族了,在说TCP/IP协议时,是指整个协议族。

TCP/IP协议分为四个层次,但我们并不需要了解所有层次的协议,主要了解应用层和传输层的协议就可以了。拿寄送邮件举例,A寄邮件给B,A关心的是用什么格式写什么内容给B(应用层内容),是寄挂号信还是寄平台(传输层内容),但是A是不会去关注邮件传送过程中采用了哪条路线,邮递员是如何把信件递到B手里的(互联网络层,网络接口层)。

传输层&&应用层

传输层有多个协议,但最主要的是TCP和UDP协议。两者的区别在于TCP协议需要接收方反馈,UDP协议不需要接收方反馈。

TCP就像挂号信,A电脑发信息给B电脑后,需要得到B电脑的反馈,这样A电脑就能知道B电脑是否已经收到信息。UDP就像平信,A电脑发送给B电脑后,B电脑并不给A电脑反馈,A电脑发送信息出去后并不知道B电脑是否已经接收到。因此,TCP传输比UDP传送更可靠,但是TCP传输的效率就不入UDP了。至于,在传送过程中具体选择哪种传送方式,需要具体问题具体分析。在不可靠的网络传送过程中一般选择TCP传送方式。在讲究效率,或者不在乎传送失误的情况下可以选择UDP方式来提高传送速率。

UDP数据包非常简单,“标头”部分一共只有8个字节,总长度不超过65535字节,即不大于64K,正好放进一个IP数据包。

应用层的协有很多,每一个协议代表一种类型服务。HTTP协议,万维网服务。FTP协议,文件传送服务。POP3,邮件服务。SOAP协议,webService服务。

小结

其实我们知道,网络通信就是交换数据包。数据包的结果基本上是这样:


image.png

发送这个包,需要知道两个地址:对方的MAC地址和对方的IP地址
有了这两个地址,数据包才能准确送到接受者手中。但是,前面有说过,MAC地址有局限性,如果两台电脑不在同一个子网络,就无法知道对方的MAC地址,必须通过网关(gateway)转发。


image.png
上图中,1号电脑要向4号电脑发送一个数据包。它先判断4号电脑是否在同一个子网络,结果发现不是,于是就把这个数据包发到网关A。网关A通过路由协议,发现4号电脑位于子网络B,又把数据包发送给网关B,网关B再转发到4号电脑。
1号电脑把数据包发到网关A,必须知道网关A的MAC地址。所以数据包的目标地址,实际上分为两种情况:

用户的上网设置

静态IP地址

刚连网线上网的时候,通常要做一些设置,通常是下面4个参数需要填入操作系统,这四个参数缺一不可(不管是静态IP地址还是动态IP地址),计算机就能上网了,由于它们是给定的,计算机每次开机,都会分到同样的IP地址,所以这种情况被称作“静态IP地址上网”。

image.png

但是,这样的设置很专业,普通用户望而生畏,而且如果一台电脑的IP地址保持不变,其他电脑就不能使用这个地址,不够灵活。处于这两个原因,大多数用户使用“动态IP地址上网”。

动态IP地址

所谓动态IP地址,指计算机开机后,会自动分配到一个IP地址,不用人为设定。它使用的协议叫做DHCP协议。

这个协议规定,每一个子网络中,有一台计算机负责管理本网络的所有IP地址,他它叫做【DHCP服务器】。新的计算机加入网络,必须向【DHCP服务器】发送一个【DHCP请求】数据包,申请IP地址和相关的网络参数。

DHCP协议

首先,它是由一种应用层协议,建立在UDP协议之上,所以整个数据包是这样的:


image.png

这个数据包构造完成后,就可以发出了。以太网是广播发送,同一个子网络的每台计算机都收到了这个包。因为接收方的MAC地址是FF-FF-FF-FF-FF-FF,看不出是发给谁的,所以每台收到这个包的计算机,还必须分析这个包的IP地址,才能确定是不是发给自己的。当看到发出方的地址0.0.0.0,接收方是255.255.255.255,于是DHCP服务器知道“这个包是发给我的”,而其他计算机就可以丢弃这个包。

接下来,DHCP服务器读出这个包的数据内容,分配好IP地址,发送回去一个“DHCP响应”数据包。这个响应包的结果也是类似的,以太网标头的MAC地址是双方的网卡地址,IP标头的IP地址是DHCP服务器的IP地址(发出方)和255.255.255.255(接收方),UDP标头的端口是67(发出方)和68(接收方),【分配给请求端的IP地址和本网络的具体参数则包含在Data部分】。

新加入的加算计收到这个响应包,于是就知道了自己的IP地址、子网掩码、网关地址、DNS服务器等参数。

DNS协议

我们知道,发送数据包,必须要知道对方的IP地址。但是,现在,我们只知道网址www.google.com,不知道它的IP地址。

DNS协议可以帮助我们,将这个网址转换成IP地址。已知DNS服务器为8.8.8.8,于是我们向这个地址发送一个DNS数据包(53端口)。


image.png

然后,DNS服务器作出响应,告诉我们Google的IP地址是172.194.72.105。于是,我们知道了对方的IP地址。

子网掩码

接下来,我们要判断,这个IP地址是不是在同一个子网络,这就要用到子网掩码。

已知子网掩码是255.255.255.0,本机用它对自己的IP地址192.168.1.100,做一个二进制的AND运算,计算结果为192.168.1.0,然后对Google的IP地址172.194.72.105也做一个AND运算,计算结果为172.194.72.0。这两个结果不想等,所以结论是,Google与本机不在同一个子网络,

因此,我们要向Google发送数据包,必须通过网关192.1.8.1.1转发,也就是说,接收方的MAC地址将是网关的MAC地址。

应用层协议

浏览网页用的是HTTP协议,他的整个数据包构造是这样的:


image.png

HTTP部分的内容,类似于下面这样:

GET / HTTP/1.1
    Host:www.google.com
    Connection:keep-alive
    User-Agent:Mozilla/5.0 (Windows NT 6.1) ……
    Accept:text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
    Accept-Encoding:gzip,deflate,sdch
    Accept-Language:zh-CN,zh;q=0.8
    Accept-Charset:GBK,utf-8;1=0.7,*;q=0.3
    Cookie:……

我们假定这个部分的长度为4960字节,它会被嵌在TCP数据包中。

TCP协议

TCP数据包需要设置端口,接收方(Google)的HTTP端口默认是80,发送方(本机)的端口是一个随机生成的1024-65535之间的整数,假定为51775.
TCP数据包的标头长度为20字节,加上嵌入HTTP的数据包,总长度变为4980字节。

IP协议

然后,TCP数据包再嵌入IP数据包。IP数据包需要设置双方的IP地址,这是已知的,发送方是192.168.1.100(本机),接收方是172.194.72.105(Google)。

IP数据包的标头长度为20字节,加上嵌入的TCP数据包,总长度变为5000字节。

以太网协议

最后,IP数据包嵌入以太网数据包。以太网数据包需要设置双方的MAC地址,发送方为本机网卡MAC地址,接收方为网关192.168.1.1的MAC地址(通过ARP协议得到)。

以太网数据包的数据部分,最大长度为1500字节,而现在的IP数据包长度为5000字节。因此,IP数据包必须分割成四个包。因为每个包都有自己的IP标头(20字节),所以四个包的IP数据包的长度分别为1500、1500、1500、560


image.png
服务器端响应

经过多个网关的转发,Google的服务器172.194.72.105,收到了这四个以太网数据包。

根据IP标头的序号,Google将这四个包拼起来,取出完整的TCP数据包,然后读出里面的“HTTP请求”,接着作出“HTTP响应”,再用TCP协议发回来。

本机收到HTTP响应后,就可以将网页显示出来,完成一次网络通信。

什么是socket?

网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket。

建立网络通信连接至少要一对端口号(socket)。socket本质是编程接口(API),对TCP/IP的封装,TCP/IP也要提供可供程序员做网络开发所用的接口,这就是Socket编程接口;HTTP是轿车,提供了封装或者显示数据的具体形式;Socket是发动机,提供了网络通信的能力。

Socket的英文原义是“孔”或“插座”。作为BSD UNIX的进程通信机制,取后一种意思。通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄,可以用来实现不同虚拟机或不同计算机之间的通信。在Internet上的主机一般运行了多个服务软件,同时提供几种服务。每种服务都打开一个Socket,并绑定到一个端口上,不同的端口对应于不同的服务。Socket正如其英文原意那样,像一个多孔插座。一台主机犹如布满各种插座的房间,每个插座有一个编号,有的插座提供220伏交流电, 有的提供110伏交流电,有的则提供有线电视节目。 客户软件将插头插到不同编号的插座,就可以得到不同的服务。

建立socket链接

建立socket连接至少需要一对套接字,其中一个运行于客户端,成为ClientSocket,另一个运行于服务器端,成为ServerScoket。
套接字之间的连接过程分为三个步骤:服务器监听,客户端请求,连接确认。

Socket连接与TCP连接

创建Socket连接时,可以指定使用的传输层协议,Socket可以支持不同的传输层协议(TCP或UDP),当使用TCP协议进行连接时,该Scoket连接就是一个TCP连接。

Socket连接与HTTP连接

由于通常情况下Socket连接就是TCP连接,因此Socket连接一旦建立,通信双方即可开始相互发送数据内容,直到双方连接断开。但在实际网络应用中,客户端到服务器之间的通信往往需要穿越多个中间节点,例如路由器、网管、防火墙等,大部分防火墙默认会关闭长时间处于非活跃状态的连接而导致Socket连接断连,因此需要通过轮询告诉网络,该连接处于活跃状态。
而HTTP连接使用的是“请求-响应”的方式,不仅在请求时需要先建立连接,而是需要客户端向服务器发出请求后,服务器端才能回复数据。

很多情况下,需要服务器端主动向客户端推送数据,保持客户端与服务器数据的实时与同步。此时若双方建立的是Socket连接,服务器就可以直接将数据传送给客户端;若双方建立的是HTTP连接,则服务器需要等到客户端发送一次请求后才能将数据传回给客户端,因此,客户端定时向服务器端发送连接请求,不仅可以保持在线,同时也是在询问“服务器是否有新的数据,如果有就将数据传给客户端”。

http中文译名问题

HTTP 在中国大陆被翻译为“超文本传输协议”,因为“transfer”在中文里有“传输”的含意。但依据 HTTP 定制者之一的 Roy Fielding博士的论文[1](6.5.3节),作者专门强调“transfer”表示的是“(表述状态的)转移” (Representational State Transfer),而不是“传输”(transport)。故其中文译名“超文本传输协议”恰恰引种反映了这种误解。更符合原义的译名应该为“超文本转 移协议”。
总结:http是应用层的协议。

SOAP可以使用HTTP协议进行传输吗?

在了解SOAP协议的过程中,看到介绍说soap可以通过tcp,udp,http协议来传送。这也是让人困惑的描述。一看这句话,就会感觉http怎么 和tcp,udp协议并列了呢?难道http还是属于传输层的协议?再加上http中文译名的问题,名字听上去像传输层,初学者又要开始头大了。

事实上,http是应用层的协议,这一点可以毫无怀疑。那么现在新的问题来了。soap和http都是应用层协议,怎么说soap能用http协议来传输呢?应用层的协议可以用应用层的协议传送吗?

我查阅了资料,是这样一回事情,soap将信息进行XML的序列化后,再用http协议的方式再打包进行传送,传送的方式还是tcp或者udp。做个比喻 就好理解了。tcp 和 udp 都是公路,暂且把tcp认为是一般公路,udp高速公路,soap和http就都是汽车,那么soap和http都可以在tcp和udp上跑。说soap 可以通过http来传送,实际就是说soap是小轿车,http是装轿车的卡车,把soap的信息装到http里面,然后再运输,当然走的道路还是tcp 或udp。

说soap可以通过http协议来传输,这句话不太准确,比较准确第说法是:soap信息可以通过http协议包装后通过tcp或udp传输。

HTTPS

HTTPS其实就是HTTP + SSL,SSL是由网景公司设计的用于对HTTP传输数据进行加密的协议 ,相对于HTTP的明文传输,HTTPS是加密的,所以更安全,但是因为建立连接需要更多的会话,所以效率略低。
SSL依靠证书来验证身份。验证身份可以是只验证服务器的身份,也可以是双方互相验证身份;取决于双方是否携带证书。
HTTP建立连接,通常HTTP请求是使用HTTP协议作应用层协议,以封装HTTP文本信息,然后使用TCP/IP做传输层协议来传输数据;
HTTP的握手过程也就是TCP的握手过程,使用三次TCP握手确认建立一个HTTP连接。

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状态,完成三次握手。

SSL握手过程

1、首先,客户端先向服务器发送加密通信的请求,这被叫走Client Hello请求。在这一步,客户端主要向服务器提供以下信息。

2、服务器确定本次通信采用的版本和加密套件,并通过Server Hello消息通知客服端。在这一步,服务器主要向客户端提供以下信息。

3、客户端收到服务器回应以后,首先验证服务器证书。如果证书不是可信机构颁布、或者证书中的域名与实际域名不一致、或者证书已经过期,就会向访问者先显示一个警告,由其选择是否还要继续通信。
如果证书没有问题,客户端就会从证书中取出服务器的公钥。然后,向服务器发送下面三项信息。

这篇文章是原样搬过来的,看到后比较形象而且容易理解,就把它搬下来作为笔记,原文在这里这里

上一篇 下一篇

猜你喜欢

热点阅读