话说两台电脑要通讯就必须遵守共同的规则,就好比两个人要沟通就必须使用共同的语言一样。一个只懂英语的人,和一个只懂中文的人由于没有共同的语言(规则)就没办法沟通。两台电脑之间进行通讯所共同遵守的规则,就是网络协议。
网络协议介绍
国际标准化组织(ISO)定义了网络协议的基本框架,被称为OSI模型。
OSI模型制定了七层标准模型,分别是:
- 应用层
- 表示层
- 会话层
- 传输层
- 网络层
- 数据链路层
- 物理层
物理层
它就是把电脑连接起来的物理手段(光缆、电缆、双绞线、无线电波等)。它主要规定了网络的一些电气特性,作用是负责传送0和1的电信号。
链路层
单纯的0和1没有任何意义,必须规定解读方式:多少个电信号算一组?每个信号位有何意义?这就是“链路层”的功能,确定了0和1的分组方式。
早期的是,每家公司都有自己的电信号分组方式,逐渐的,一种叫做“以太网”的协议,占据了主导地位。
以太网规定,一组电信号构成一个数据包,叫做“帧”。每一帧分成两个部分,首部(Head)和数据(Data)。
- 首部:固定长度为18字节。包含数据包的一些说明项,比如发送者、接受者、数据类型等等;
- 数据:最短为46字节,最长为1500字节。就是数据包的具体内容
由此可以看出,整个“帧”的最小长度为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数据包也分为“首部”和“数据”两个部分。
- 首部:主要包含版本、长度、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协议:它的格式几乎就是在数据前面,加上端口号。也是有首部和数据两部分组成,首部部分主要定义了发出端口和接收端口,数据部分就是具体的内容。然后把整个UDP数据包放入IP数据包的数据部分,所以整个以太网数据包变成了这样:
UDP数据包非常简单,“标头”部分一共只有8个字节,总长度不超过65535字节,即不大于64K,正好放进一个IP数据包。
- TCP协议:数据包和UDP数据包一样,都是内嵌在IP数据包的数据部分。TCP数据包没有长度限制,理论上可以无限长,但是为了保证网络的效率,通常TCP数据包的长度不会超过IP从数据包的长度,以确保单个TCP数据包不必再分割。
应用层的协有很多,每一个协议代表一种类型服务。HTTP协议,万维网服务。FTP协议,文件传送服务。POP3,邮件服务。SOAP协议,webService服务。
小结
其实我们知道,网络通信就是交换数据包。数据包的结果基本上是这样:
发送这个包,需要知道两个地址:对方的MAC地址和对方的IP地址
有了这两个地址,数据包才能准确送到接受者手中。但是,前面有说过,MAC地址有局限性,如果两台电脑不在同一个子网络,就无法知道对方的MAC地址,必须通过网关(gateway)转发。
上图中,1号电脑要向4号电脑发送一个数据包。它先判断4号电脑是否在同一个子网络,结果发现不是,于是就把这个数据包发到网关A。网关A通过路由协议,发现4号电脑位于子网络B,又把数据包发送给网关B,网关B再转发到4号电脑。
1号电脑把数据包发到网关A,必须知道网关A的MAC地址。所以数据包的目标地址,实际上分为两种情况:
- 同一个子网络:数据包地址(对方的MAC地址和对方的IP地址)
- 非同一个子网络:数据包地址(网关的MAC地址和对方的IP地址)
用户的上网设置
静态IP地址
刚连网线上网的时候,通常要做一些设置,通常是下面4个参数需要填入操作系统,这四个参数缺一不可(不管是静态IP地址还是动态IP地址),计算机就能上网了,由于它们是给定的,计算机每次开机,都会分到同样的IP地址,所以这种情况被称作“静态IP地址上网”。
- 1、本机的IP地址
- 2、子网掩码
- 3、网关的IP地址
- 4、DNS的IP地址
但是,这样的设置很专业,普通用户望而生畏,而且如果一台电脑的IP地址保持不变,其他电脑就不能使用这个地址,不够灵活。处于这两个原因,大多数用户使用“动态IP地址上网”。
动态IP地址
所谓动态IP地址,指计算机开机后,会自动分配到一个IP地址,不用人为设定。它使用的协议叫做DHCP协议。
这个协议规定,每一个子网络中,有一台计算机负责管理本网络的所有IP地址,他它叫做【DHCP服务器】。新的计算机加入网络,必须向【DHCP服务器】发送一个【DHCP请求】数据包,申请IP地址和相关的网络参数。
DHCP协议
首先,它是由一种应用层协议,建立在UDP协议之上,所以整个数据包是这样的:
- 1、最前面的“以太网标头”(也就是14字节首部),设置发出方(本机)的MAC地址和接收方(DHCP服务器)的MAC地址。前者就是本机网卡的MAC地址,后者这时不知道,就填入一个广播地址:FF-FF-FF-FF-FF-FF。
- 2、后面的“IP标头”,设置发出方的IP地址和接收方的IP地址。这时,对于这两者,本机都不知道。于是,发出方的IP地址就设为0.0.0.0,接收方的IP地址设为255.255.255.255
- 3、最后的“UDP标头”,设置发出方的端口和接收方的端口。这一部分是DHCP协议规定号的,发出方是68端口,接收方是67端口。
这个数据包构造完成后,就可以发出了。以太网是广播发送,同一个子网络的每台计算机都收到了这个包。因为接收方的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端口)。
然后,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协议,他的整个数据包构造是这样的:
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
服务器端响应
经过多个网关的转发,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。
套接字之间的连接过程分为三个步骤:服务器监听,客户端请求,连接确认。
- 服务器监听:服务器端套接字并不定位具体的客户端套接字,而是处于等待连接的状态,实时监控网络状态,等待客户端的连接请求。
- 客户端请求:指客户端的套接字提出连接氢气u,要连接的目标是服务器端的套接字。为此,客户端的套接字必须首先描述它要连接的服务器的套接字,指出服务器端套接字的地址和端口号,然后就向服务器套接字提出连接请求。
- 连接确认:当服务器端套接字监听到或者说接收到客户端套接字的连接请求时,就响应客户端套接字的请求,建立一个新的线程,把服务器端套接字的描述发给客户端,一旦客户端确认了此描述,双方就正式建立连接。而服务器端套接字继续处于监听状态,继续接受其他客户端套接字的连接请求。
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请求。在这一步,客户端主要向服务器提供以下信息。
- 支持的协议版本,比如SSL 1.0版
- 一个客户端生成的随机数,稍后用于生成“对话密钥”。
- 支持的加密方法,比如RSA公钥加密。
- 支持的压缩方法
2、服务器确定本次通信采用的版本和加密套件,并通过Server Hello消息通知客服端。在这一步,服务器主要向客户端提供以下信息。
- 确认使用的加密通信协议版本,比如SSL 1.0版本。如果浏览器和服务器支持的版本不一致,服务器关闭加密通信。
- 一个服务器生成的随机数,稍后用于生成“对话密钥”。
- 确认使用的加密方法,比如RSA公钥加密。
- 服务器证书。
3、客户端收到服务器回应以后,首先验证服务器证书。如果证书不是可信机构颁布、或者证书中的域名与实际域名不一致、或者证书已经过期,就会向访问者先显示一个警告,由其选择是否还要继续通信。
如果证书没有问题,客户端就会从证书中取出服务器的公钥。然后,向服务器发送下面三项信息。
- 一个随机数。该随机数用服务器公钥加密,防止被窃听。
- 客户端发送Change Clipher Spec消息,通知服务器后续报文将采用协商好的秘钥和加密套件进行加密和MAC计算。
- 客户端计算已交互的握手消息(除Change Cipher Spec消息外所有已交互的消息)的Hash值,利用协商好的秘钥和加密套件处理Hash值(计算并添加MAC值、加密等),服务器利用同样的方法计算已交互的握手消息的Hash值,并与Finished消息的解密结果比较,如果二者相同,且MAC值验证成功,则证明秘钥和加密套件协商成功。