运输层为应用程序提供端到端的会话,但不同的网络应用和应用进程之间,还需要不同的通信规则,因此在运输层之上还需要有应用层。
比如浏览器这个应用程序需要 HTTP、HTTPS 协议,而 XShell 应用需要 SSH 协议
常见的协议如下 :
域名系统 DNS 是互联网使用的命名系统,用来便于人们使用的机器名字转换成 IP 地址DNS 的互联网标准是 RFC 1034, 1035
文件传输协议 FTP 是互联网上使用的最广泛的文件传输协议
TCP/IP协议族还有一个简单文件传送协议 TFTP,他是一个很小且易于实现的文件传输协议
TELNET 是一个简单的远程终端协议
万维网并非某种特殊的计算机网络,万维网是一个很大规模的,联机式的信息储藏所,英文简称 Web
同一资源标识符 URI,统一资源定位符 URL ,URL 是 URI 的子集,URL 是用来表示从互联网上得到的资源位置和访问这些资源的方法, URL 一般由以下四部分组成
<协议>://<主机>:<端口号>/<路径>
可以简单这样理解,我们都知道马云是中国首富,但是我们不知道马云住哪,这里的 URI 相当于马云 (是要说出马云,就知道它是中国首富,根据 URI 就能标识),而 URL 就可以表示马云的所住地,具体哪条街哪栋房(根据 URL 就能准确定位)
我们经常输入的网址就属于 URL
HTTP 是超文本传输协议。它定义了浏览器怎样向服务器请求页面及服务器怎样数据把传送给浏览器。 HTTP 连接最显著的特点是客户端发送的每次请求都需要服务器回送响应,在请求结束后,会主动释放连接。从建立连接到关闭连接的过程称为“一次连接”。
目前使用最广泛的 HTTP 版本为 1.1,它于 1997 年发布,HTTP 传送的数据一般是就是 HTML,使用的默认端口为 80
位于应用层的 HTTP 协议使用的运输层协议是 TCP ,保证数据的可靠性(但是不保证数据的安全性)
HTTP 协议是无状态的,也就是说,同一个客户端第二次访问同一个服务器上的页面时,服务器的响应和第一次被访问的的相同(因为服务不记得来自同一客户端的访问)
可以使用其他技术实现有状态,比如 Cookie, Session
HTTP/1.0 的主要缺点,就是每请求一个页面档就需要两倍往返时间开销,这种非持续连接会使服务器的负担很重
HTTP/1.1 的出现很好的解决了这个问题,它使用了持续连接,所谓的持续连接就是服务器再发送响应后仍然在一段时间内保持这条连接,使同一客户端(浏览器)和该服务器可以继续在这条连接上传送后续的 HTTP 请求报文和响应报文
HTTP/1.1 的持续连接存在两种工作方式:非流水线方式和流水线方式
HTTP 有两类报文,请求报文和响应报文
请求方法 : GET,POST,PUT,DELETE (RESTful 风格 URL)一个完整的 HTTP 请求报文例子
GET http://www.haha.com/ HTTP/1.1
Host: www.haha.com
Connection: close
User-Agent: Mozilla/5.0
Accept-Language: cn
如果需要实现长连接就需要在首部行中加入 : Connector:Keep-Alive
与请求报文不同的是请求行,包含协议版本,状态码,短语
其中状态码都是三位的,最常用的状态码有:200 ,404,500,比如:
HTTP/1.1 200 OK
HTTP/1.1 404 Not Found
// 301 表示重定向
HTTP/1.1 301 Moved Permanently
Location: https://www.baidu.com
由于 HTTP 是面向文本的,因此在报文中每一个字段都是一些 ASCII 码,因而各个字段的长度都是不确定的
用于区分是请求报文还是响应报文,CR 表示回车, LF 表示换行
用来说明浏览器,服务器或报文主题的一些信息,首部可以有好几行,但是也可以不使用
每个首部行中都有首部字段名和它对应的值,每一行在结束的地方都要有 “回车换行” 用于与实体主体分开
在请求报文中一般不用这个字段,而在响应报文中也可能没有这个字段
一般将开始行和首部行称为请求头 Request Header(或响应头),实体主体称为请求体 Body(或响应体)
为了方便理解,可以认为浏览器存在一个缓存数据库,用于存储缓存数据。缓存规则分为两大类,强制缓存和对比缓存
两类缓存可以同时存在,强制缓存优先级高于对比缓存,也就是说,当执行强制缓存的规则时,如果缓存生效,不在执行对比缓存
根据缓存失效时间判断是否使用缓存
响应头(Response Header)中会有两个字段来标明失效规则
Expires:它是 HTTP 1.0 的玩意,现在浏览器默认使用的是 HTTP 1.1,它的作用基本忽略
Cache-Control : 常见的取值有(可以存在多个值)
打开 Chrome 查看响应报文:
可以清楚的看到,该服务器使用不使用缓存,每次都从服务器获取最新的值
根据资源修改时间判断是否使用缓存
缓存标识在请求头和响应头间传递,一共分为两种标识传递 :
Last-Modified/If-Modified-Since 和 Etag/If-None-Match ,后者优先级更高
第一种,时间比对
Last-Modified:服务器在响应的时候,告诉浏览器资源的最后修改时间
If-Modified-Since:再次请求服务器时,浏览器将 Last-Modified 的值,放入请求头中,如果服务器发现请求头中有 If-Modified-Since 字段,则与被请求资源的最后修改时间进行比对
如果最后修改时间大于 If-Modified-Since ,说明资源被修改过,则响应最新的数据,状态码为 200
否则,响应状态码 304 ,告知浏览器继续使用保存的缓存
第二种,唯一标识比对
Etag :服务器响应时,告诉浏览器当前资源在服务器的唯一标识(生成规则由浏览器决定)
If-None-Match:再次请求服务器的时候,同样带上该字段,如果服务器发现请求头中存在 If-None-Match 字段,将该字段的值与被请求资源的唯一标识进行比对
如果不同,说明资源被修改过,则响应最新的数据,状态码为 200
否则,响应状态码 304 ,告知浏览器继续使用保存的缓存
HTTPS 同样是安全超文本传输协议,它是一个安全通信通道。HTTPS 在应用层和传输层之间,增加了一个安全套接层 SSL。即 HTTP + SSL = HTTPS
是用于互联网两台计算机之间用于身份验证和加密的一种协议。 想要建立 HTTPS 连接, 必须从受信任的证书颁发机构 CA 购买 SSL 证书(贵的一批)
使用非对称加密相对于对称加密时间开销较大
这就是中间人问题
HTTPS = 对称加密 + 非对称加密 + hash 散列算法 + CA 认证
网站在使用 HTTPS 之前,需要向 CA 机构申请一份 SSL 证书(不如说是购买),CA 机构拥有非对称加密的私钥和公钥,CA 对证书明文信息进行 hash 散列,对 hash 散列后的值用私钥加密,得到数字签名,明文信息和数字签名组成了 SSL 证书
明文信息包含:证书的发布机构,证书的有效期,绑定的域名,公钥,证书所有者等等
建立连接后,服务器发起请求,服务端直接将 SSL 证书发送给客户端(私钥保存在服务端)
客户端对这个 SSL 证书的明文信息验证,包含证书所有者,有效期 ……
接着验证数字签名,先从 OS 中获得此 CA 机构的公钥,对数字签名进行解密,得到一个值 A
许多操作系统中内置了 CA 机构的公钥
接着采用相同的 hash 散列算法对明文信息进行 hash 散列得到一个值 B,将 B 与 A 比对,如果相等,说明证书有效
此时,客户端就能得到证书中的公钥了,用于后续加密了
不可能的,兄弟
A
许多操作系统中内置了 CA 机构的公钥
接着采用相同的 hash 散列算法对明文信息进行 hash 散列得到一个值 B,将 B 与 A 比对,如果相等,说明证书有效
此时,客户端就能得到证书中的公钥了,用于后续加密了
不可能的,兄弟