TCP/IP协议族按层次分别分为以下 4 层:应用层、传输层、网络层和数据链路层。
利用TCP/IP协议族进行网络通信时,会通过分层顺序与对方进行通信。发送端从应用层往下走,接收端则往应用层往上走。以HTTP举例来说明,首先作为发送端的客户端在应用层(HTTP协议)发出一个想看某个Web页面的HTTP请求。
接着,为了传输方便,在传输层(TCP协议)把从应用层处收到的数据(HTTP请求报文)进行分割,并在各个报文上打上标记序号及端口号后转发给网络层。
在网络层(IP协议),增加作为通信目的地的MAC地址后转发给链路层。这样一来,发往网络的通信请求就准备齐全了。接收端的服务器在链路层接收到数据,按序往上层发送,一直到应用层。当传输到应用层,才能算真正接收到由客户端发送过来的HTTP请求。
发送端在层与层之间传输数据时,每经过一层时必定会被打上一个该层所属的首部信息。反之,接收端在层与层传输数据时,每经过一层时会把对应的首部消去。
(1)首先,每个主机都会在自己的ARP缓冲区中建立一个ARP列表,以表示IP地址和MAC地址之间的对应关系。
(2)当源主机要发送数据时,首先检查ARP列表中是否有对应IP地址的目的主机的MAC地址,如果有,则直接发送数据,如果没有,就向本网段的所有主机发送ARP数据包,该数据包包括的内容有:源主机IP地址,源主机MAC地址,目的主机的IP地址。
(3)当本网络的所有主机收到该ARP数据包时,首先检查数据包中的IP地址是否是自己的IP地址,如果不是,则忽略该数据包,如果是,则首先从数据包中取出源主机的IP和MAC地址写入到ARP列表中,如果已经存在,则覆盖,然后将自己的MAC地址写入ARP响应包中,告诉源主机自己是它想要找的 MAC地址。
(4)源主机收到ARP响应包后。将目的主机的IP和MAC地址写入ARP列表,并利用此信息发送数据。如果源主机一直没有收到ARP响应数据包,表示ARP查询失败。
广播发送ARP请求,单播发送ARP响应。
ICMP(InternetControl Message Protocol),因特网控制报文协议。它是TCP/IP协议族的一个子协议,用于在IP主机、路由器之间传递控制消息。控制消息是指网络通不通、主机是否可达、路由器是否可用等网络本身的消息。这些控制消息虽然并不传输用户数据,但是对于用户数据的传递起着重要的作用。ICMP报文有两种:差错报告报文和询问报文。
动态主机配置协议,是一种让系统得以连接到网络上,并获取所需要的配置参数手段。通常被应用在大型的局域网络环境中,主要作用是集中的管理、分配IP地址,使网络环境中的主机动态的获得IP地址、Gateway地址、DNS服务器地址等信息,并能够提升地址的使用率。
逆地址解析协议,作用是完成硬件地址到IP地址的映射,主要用于无盘工作站,因为给无盘工作站配置的IP地址不能保存。
SMTP(Simple Mail Transfer Protocol)即简单邮件传输协议,它是一组用于由源地址到目的地址传送邮件的规则,由它来控制信件的中转方式。
按层次分,IP(Internet Protocol)网际协议位于网络层。
IP协议的作用是把各种数据包传送给对方。而要保证确实传送到对方,则需要满足各类条件。其中两个重要的条件是IP地址和MAC地址。
IP地址指明了节点被分配到的地址,MAC地址是指网卡所属的固定地址。IP地址可以和MAC地址进行配对。IP地址可变换,但MAC地址基本上不会更改。
IP间的通信依赖MAC地址。在网络上,通信的双方在同一局域网(LAN)内的情况是很少的,通常是经过多台计算机和网络设备中转才能连接到对方。而在进行中转时,会利用下一站中转设备的MAC地址来搜索下一个中转目标。这时,会采用ARP协议(Address Resolution Protocol)。ARP是一种用以解析地址的协议,根据通信方的IP地址就可以反查出对应的MAC地址。
DNS(Domain Name System)服务是和HTTP协议一样位于应用层的协议。它提供域名到IP地址之间的解析服务。
DNS协议提供通过域名查找IP地址,或逆向从IP地址反查域名的服务。
按层次分,TCP位于传输层,提供可靠的字节流服务。
字节流服务是指,为了方便传输,将大块数据分割成以报文段为单位的数据包进行管理。而可靠的传输服务是指,能够把数据准确可靠地传给对方。简而言之,TCP协议为了更容易传送大数据才把数据分割,而且TCP协议能够确认数据最终是否送达到对方。
为了准确无误地将数据送达目标处,TCP协议采用了三次握手策略。
HTTP协议是一种无状态协议
。HTTP协议自身不对请求和响应之间的通信状态进行保存。也就是说在HTTP这个级别,协议对于发送过的请求或响应都不做持久化处理。
用于HTTP协议交互的信息被称为HTTP报文。请求端(客户端)的HTTP报文叫做请求报文,响应端(服务器端)的叫做响应报文。HTTP报文本身是由多行数据构成的字符串文本。
HTTP报文大致可分为报文首部和报文主体两块。两者由最初出现的空行来划分。通常,并不一定要有报文主体。
请求报文(上)和响应报文(下)的结构:
请求报文和响应报文的首部内容由以下数据组成:
1)请求行:包含用于请求的方法,请求URI和HTTP版本。
2)状态行:包含表明响应结果的状态码,原因短语和HTTP版本。
3)首部字段:包含表示请求和响应的各种条件和属性的各类首部。一般有4种首部,分别是:通用首部、请求首部、响应首部和实体首部。
4)其他:可能包含HTTP的RFC里未定义的首部(Cookie等)。
HTTP请求报文由请求行、请求头部、空行和请求数据4个部分组成。
请求行:(get/post方法,url中的path路径,http版本)。
请求头部:由键值对组成。
HTTP响应报文由四个部分组成:
状态码
:描述了响应的状态。可以用来检查是否成功的完成了请求。请求失败的情况下,状态码可用来找出失败的原因。HTTP头部
:它们包含了更多关于响应的信息。比如:头部可以指定认为响应过期的过期日期,或者是指定用来给用户安全的传输实体内容的编码格式。空行
。主体
:它包含了响应的内容。它可以包含HTML代码、图片等。主体是由传输在HTTP消息中紧跟在头部后面的数据字节组成的。HTTP协议的请求和响应报文,都包含HTTP首部。
HTTP 首部字段是由首部字段名和字段值构成的,中间用冒号“:” 分隔。示例:
首部字段名: 字段值
比如在HTTP首部中,以Content-Type这个字段来表示报文主体的对象类型:
Content-Type: text/html
同时,字段值对应单个HTTP首部字段可以有多个值。示例:
Keep-Alive: timeout=15, max=100
当HTTP报文首部中出现了两个或两个以上具有相同首部字段名时,浏览器内部处理逻辑的不同,结果可能并不一致。有些浏览器会优先处理第一次出现的首部字段,而有些则会优先处理最后出现的首部字段。
1. Cache-Control
Cache-Control: private, max-age=0, no-cache
列举一些常见的字段:
#明确表明其他用户也可利用缓存
Cache-Control: public
#只有特定的用户可以利用缓存
Cache-Control: private
#客户端发送的请求中如果包含 no-cache 指令,则表示客户端将不会接收缓存过的响应。
#如果服务器返回的响应中包含 no-cache 指令,那么缓存服务器不能对资源进行缓存。
Cache-Control: no-cache
#由服务器返回的响应中,若报文首部字段Cache-Control中对no-cache字段名具体指定
#参数值,那么客户端在接收到这个被指定参数值的首部字段对应的响应报文后,就不能
#使用缓存。换言之,无参数值的首部字段可以使用缓存。
Cache-Control: no-cache=Location
#该指令规定缓存不能在本地存储请求或响应的任一部分。
Cache-Control: no-store
#当客户端发送的请求中包含max-age指令时,如果判定缓存资源的缓存时间数值比指定
#时间的数值更小,那么客户端就接收缓存的资源。另外,当指定max-age值为0,那么
#缓存服务器通常需要将请求转发给源服务器。
#当服务器返回的响应中包含 max-age 指令时,缓存服务器将不对资源的有效性再作确
#认,而 max-age 数值代表资源保存为缓存的最长时间。
Cache-Control: max-age=604800(单位:秒)
2. Connection
Connection字段具备如下两个作用:1、控制不再转发给代理的首部字段;2、管理持久连接。使用示例:
Connection: 不再转发的首部字段名
#HTTP/1.1版本的默认连接都是持久连接。为此,客户端会在持久连接上连续发送请求。
#当服务器端想明确断开连接时,则指定Connection首部字段的值为 Close。
Connection: close
#维持持续连接
Connection: Keep-Alive
3. Date
首部字段Date表明创建HTTP报文的日期和时间。不同格式的日期示例:
Date: Tue, 03 Jul 2012 04:40:59 GMT
Date: Tue, 03-Jul-12 04:40:59 GMT
Date: Tue Jul 03 04:40:59 2012
1. Accept
#文本文件
#text/html, text/plain, text/css ...
#图片文件
#image/jpeg, image/gif, image/png ...
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Charset: iso-8859-5, unicode-1-1;q=0.8
2. Accept-Encoding
Accept-Encoding首部字段用来告知服务器用户代理支持的内容编码及内容编码的优先级顺序。可一次性指定多种内容编码。示例:
Accept-Encoding: gzip, deflate
3. Authorization
Authorization字段是用来告知服务器,用户代理的认证信息。
1. Age
Age: 600
2. Location
使用首部字段Location可以将响应接收方引导至某个与请求URI位置不同的资源。基本上,该字段会配合3xx :Redirection的响应,提供重定向的URI。
1. Content-Encoding
Content-Encoding: gzip
2. Content-Language
实体主体使用的自然语言。示例:
Content-Language: zh-CN
3. Content-Length
实体主体部分的大小(单位是字节)。示例:
Content-Length: 15000
4. Content-Type
实体主体内对象的媒体类型。和首部字段Accept一样,字段值用type/subtype形式赋值。示例:
Content-Type: text/html; charset=UTF-8
gzip(GNU zip)
compress(UNIX 系统的标准压缩)
deflate(zlib)
identity(不进行编码)
HTTP状态码负责表示客户端HTTP请求的返回结果、标记服务器端的处理是否正常、通知出现的错误等工作。也就是说,状态码的职责是当客户端向服务器端发送请求时,描述返回的请求结果。借助状态码,用户可以知道服务器端是正常处理了请求,还是出现了错误。
状态码的类别:
2XX的响应结果表明请求被正常处理了。
3XX响应结果表明浏览器需要执行某些特殊的处理以正确处理请求。
4XX的响应结果表明客户端是发生错误的原因所在。
5XX的响应结果表明服务器本身发生错误。
Connection:keep-alive
。在使用长连接的情况下,当一个网页打开完成后,客户端和服务器之间用于传输HTTP数据的TCP连接不会关闭,客户端再次访问这个服务器时,会继续使用这一条已经建立的连接。转发是服务器行为,重定向是客户端行为。
HTTP在安全性方面存在着一些问题:
- 通信使用明文(不加密),内容可能会被窃听;
- 不验证通信方的身份,因此有可能遭遇伪装;
- 无法证明报文的完整性,所以有可能已遭篡改。
HTTP+加密+认证+完整性保护=HTTPS,即添加了加密及认证机制的HTTP称为HTTPS。
HTTPS并非是应用层的一种新协议。只是HTTP通信接口部分用SSL和TLS协议代替而已。通常,HTTP直接和TCP通信。当使用SSL时,则演变成先和SSL通信,再由SSL和TCP通信了。简言之,所谓HTTPS,其实就是身披SSL协议这层外壳的HTTP。
多数浏览器开发商发布版本时,会事先在内部植入常用认证机关的公开密钥。
1)HTTP的连接是无状态的,不安全的;HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,比HTTP协议安全。
2)在OSI网络模型中,HTTP工作于应用层,而HTTPS工作在传输层。
3)HTTP无需加密,而HTTPS对传输的数据进行加密。
4)HTTP无需证书,而HTTPS需要认证证书。
1)A与B通过TCP建立链接,初始化SSL层。
2)进行SSL握手,A发送https请求,传送客户端SSL协议版本号、支持的加密算法、随机数等。
3)服务器B把CA证书(包含B的公钥),把自己支持的加密算法、随机数等回传给A。
4)A接收到CA证书,验证证书有效性。
5)校验通过,客户端随机产生一个字符串作为与B通信的对称密钥,通过CA证书解出服务器B的公钥,对其加密,发送给服务器。
6)B用私钥解开信息,得到随机的字符串(对称密钥),利用这个密钥作为之后的通信密钥。
7)客户端向服务器发出信息,指明后面的数据使用该对称密钥进行加密,同时通知服务器SSL握手结束。
8)服务器接收到信息,使用对称密钥通信,通知握手接收。
9)SSL握手结束,使用对称密钥加密数据。
图中从左到右的标识字段为:URG、ACK、PSH、RST、SYN、FIN。
ACK:设置为1,标识前面的确认(ack)是有效的。
PSH:表示要求对方在接到数据后立即请求递交给应用程序,而不是缓冲起来直到缓冲区收满为止。
RST:当该值为1时,表示当前TCP连接出现严重问题,必须要释放重连。
SYN:用来建立连接。
FIN:用来释放连接。
URG:当URG字段被置1,表示本数据报的数据部分包含紧急信息,此时紧急指针有效。紧急数据一定位于当前数据包数据部分的最前面,紧急指针标明了紧急数据的尾部。
窗口的大小,可以指定从被确认的字节算起,可以发送多少个字节。
校验和:校验范围包括TCP头、数据报内容等。