计算机网络

TCP

TCP三次握手

客户端端首先发送一个带SYN标志的数据包给对方。服务器端收到后,回传一个带有SYN/ACK标志的数据包以示传达确认信息。最后,客户端再回传一个带有ACK标志的数据包,代表握手结束。

若在握手过程中某个阶段莫名中断,TCP协议会再次以相同的顺序发送相同的数据包。

为什么不“两次握手”

发送端发出的第一个连接请求报文段并没有丢失,而是在某个网络节点长时间地滞留了,以至于延误到连接释放后的某个时间点才到达接收端。但接收端收到此失效的连接请求报文段后,会误认为是发送端再次发送的一个新的连接请求,就向发送端发出确认报文段,同意连接。假设不采用“三次握手”,新的连接就建立了。由于采用了“三次握手”,发送端不会理睬接收端的确认,不会发送ACK包,避免了失误。

与HTTP请求/响应关系

先进行TCP三次握手,建立TCP连接,然后发送HTTP请求,HTTP响应,完成后断开TCP连接。

DNS服务

DNS服务是和HTTP协议一样位于应用层的协议。它提供域名到IP地址之间的解析服务,通过域名查找IP地址,或通过IP地址反查域名。

各种协议与HTTP协议的关系

即客户端与服务器通讯的整个过程。因为处于书籍开头,不太详细,暂时不记录。

URI和URL

URI用字符串标识某一互联网资源,而URL表示资源的地点(互联网上所处的位置)。可见URL是URI的子集。——《图解HTTP》

URI 可以进一步分为定位器、名称,或者二者兼具。术语“Uniform Resource Locator” (URL) 涉及的是 URI 的子集,除识别资源外,它还通过描述其最初访问机制(比如它的网络“位置”)来提供定位资源的方法。 术语“Uniform Resource Name” (URN) 在历史上曾用于引用“urn”方案 [RFC2141] 下的 URI,这个 URI 需要是全球惟一的,并且在资源不存在或不再可用时依然保持不变,对于其他任何拥有名称的一些属性的 URI,都需要使用这样的 URI。

对于单独的方案,没有必要将其分为仅仅是一个 “名称”或者是一个“定位器”。 来自任意特定方案的 URI 实例可能有名称或定位器的特征,或两者兼而有之, 这通常取决于标识符分配中的持久性和命名机构对其关注程度, 而不取决于其他方案的质量。未来的规范和相关的文档应当使用通用术语“URI”,而不是使用有更多限制的条目“URL”和“URN” [RFC3305]。——IBM《分清URI、URL和URN》

至此,我的理解是,URI标识的是一个资源,包括资源的名称、位置(但是外表看起来与一个单纯的位置标识是一样的,因此很多时候URL等于URI),而URL意义上仅代表资源的位置,URN意义上仅代表资源的名称,因此说URL、URN是URI的子集。

HTTP

在两台计算机之间使用HTTP协议通信时,在一条通信线路上必然有一端是客户端,一端是服务器端。

客户端发送给服务器的请求报文是由请求方法(如GET)、请求URI(如/index.html)、协议版本(如HTTP/1.1)、可选的请求首部字段(如host、connection、content-type、content-length等)和内容实体(如name=ueno&age=37)构成的。

服务器发送给客户端的响应报文基本上由协议版本、状态码、用以解释状态码的原因短语、可选的响应首部字段和内容实体构成。

报文=报文首部+报文主体

报文实体=实体首部(报文首部的一部分)+实体主体(未进行编码操作时等于报文主体)

通常,报文主体等于实体主体。只有当传输中进行编码操作时,实体主体的内容发生变化,才导致它和报文主体产生差异。

压缩传输的内容编码

内容编码指明应用在实体内容上的编码格式,并保持实体信息原样压缩。内容编码后的实体由客户端接收并负责解码。常用的内容编码:gzip(GUN zip)、compress、deflate、identity。

分割发送的分块传输编码

在传输大容量数据时,通过把数据分割成多块,能够让浏览器逐步显示页面。把实体主体分块的功能称为分块传输编码。

状态码

3XX重定向

301:重定向到新的URI;

302:临时性重定向。尽管RFC标准不允许在重定向时改变请求方法,但现存浏览器基本会将POST请求更改为GET;

303:临时性重定向,重定向时应使用GET获取(如为POST请求,重定向会变成GET);

307:临时性重定向,重定向时不会从POST变成GET。因为302的“不守规则”而诞生;

304:客户端发送附带条件的请求,比如文件在某某时间点后更新过(If-Modified-Since),服务器端允许请求访问资源,但没有满足条件。304状态码返回时,不包括任何响应主体部分。

4XX客户端错误

400 Bad Request:请求报文中存在语法错误;

401 Unauthorized:表示发送的请求需要有通过HTTP认证的认证信息。当浏览器初次接收到401响应,会弹出认证用的对话框。第二次接到表示认证失败;

403 Forbidden:请求的资源被服务器拒绝;

404 Not Found:服务器无法找到请求的资源。

5XX服务器错误

500 Internal Server Error:服务器端在执行请求时发生了错误。可能是Web应用存在的bug或是某些临时的故障;

503 Server Unavailable:服务器暂时处于超负载或正在进行停机维护;

与HTTP协作的Web服务器

用单台虚拟主机实现多个域名

物理层面的一台服务器,使用虚拟主机功能,可以假想具有多个服务器。在互联网上,域名通过DNS服务映射到IP地址(域名解析)之后访问目标网站。可见,当请求发送到服务器时,已经是以IP地址形式访问了。所以,如果一台服务器同时托管了两个域名,就要搞清楚究竟要访问哪个域名。

在相同IP地址下, 由于虚拟主机可以寄存多个不同主机名和域名的Web网站,因此在发送HTTP请求时,必须在首部的Host内完整指定主机名或域名的URI。

通信数据转发程序:代理、网关、隧道

代理

使用代理服务器的理由有:利用缓存技术减少网络带宽的流量,组织内部针对特定网站进行访问控制,以获取访问日志为主要目的等。

缓存代理

代理转发响应时,代理服务器会预先将资源的副本缓存在代理服务器上。当代理再次接到对相同资源的请求时,可以不从源服务器那里获取资源,而是将之前缓存的资源作为响应返回。

透明代理

转发请求或响应时,不对报文做任何加工的代理类型叫做透明代理,对报文内容进行加工的代理叫做非透明代理。

网关

网关的工作机制和代理十分相似。网关能使通信线路上的服务器提供非HTTP协议服务。即利用网关可以将HTTP请求转化为其他协议通信。

利用网关能提高通信的安全性,因为可以在客户端和网关之间的通信线路进行加密以确保连接的安全。

隧道

隧道可按要求建立起一条和其他服务器的通信线路,届时使用SSL等加密手段进行通信。隧道的目的是确保客户端能和服务器进行安全的通信。

隧道本身不会解析HTTP请求,请求按照原样中转给之后的服务器。

保存资源的缓存

缓存是指代理服务器或客户端本地磁盘内保存的资源副本。利用缓存可减少对源服务器的访问,也节省了通信流量和通信时间。

缓存服务器是代理服务器的一种。当代理转发从服务器返回的响应时,代理服务器会保存一份资源的副本。缓存服务器的优势在于利用缓存可以避免多次从源服务器转发资源。因此客户端可就近从缓存服务器上获取资源,而源服务器也不必多次处理相同的请求。

缓存的有效期限

缓存服务器会因为客户端的要求、缓存的有效期等因素,向源服务器确认资源的有效性。若判断缓存失效,缓存服务器会再次从源服务器上获取新的资源。

客户端的缓存

缓存还可存在于浏览器客户端中。如果浏览器中的缓存有效,则不必向服务器请求相同的资源,可以从本地磁盘直接读取。当判定缓存过期后,会向源服务器确认资源的有效性。若判断浏览器缓存失效,浏览器会再次请求新资源。

HTTP首部

HTTP报文首部

响应首部字段Cache-Control: no-cache,到底是缓存服务器可以对响应进行缓存,但每次都要向源服务器确认有效性,还是根本不能够进行缓存。

由服务器返回的响应中,若报文首部字段Cache-Control对no-cache字段名具体指定参数值(no-cache=Location),那么客户端在接收到这个被指定参数值的首部字段对应的响应报文后,就不能使用缓存。换言之,无参数的首部字段可以使用缓存。

Cookie的Expires属性指定浏览器可发送Cookie的有效期。当省略Expires属性时,其有效期仅限于维持浏览器会话时间段内,通常限于浏览器应用程序被关闭之前。

HTTP

通信使用明文可能会被窃听

通信的加密:HTTP协议中没有加密机制,但可以通过和SSL或TLS的组合使用,加密HTTP的通信内容。用SSL建立安全通信线路之后,就可以在这条线路上进行HTTP通信了。与SSL组合使用的HTTP被称为HTTPS。

内容的加密

不验证通信方的身份可能遭遇伪装

在HTTP协议通信中,由于不存在确认通信方的处理步骤,任何人都可以发起请求。另外,服务器只要接收到请求,不管对方是谁都会返回一个响应。虽然使用HTTP无法确定通信方,但使用SSL则可以。SSL不仅提供加密处理,而且还使用了一种被称为证书的手段,可用于确定方。

无法证明报文的完整性,可能已遭篡改

HTTP+加密+认证+完整性保护=HTTPS

HTTPS并非应用层的一种新协议,只是HTTP通信接口部分用SSL和TLS协议代替而已。通常,HTTP直接和TCP通信。当使用SSL时,则演变为先和SSL通信,再由SSL和TCP通信了。简而言之,HTTPS就是身披SSL协议这层外壳保护的HTTP。

HTTPS握手过程

  1. (Client)Client Hello:客户端向服务端发送Client Hello消息,消息中包含一个客户端生成的随机数Random1、客户端支持的加密套件和SSL Version等信息;
  2. (Server)Server Hello:服务器向客户端发送Server Hello消息,从Client Hello传过来的加密套件中确定一份,再生成一个随机数Random2;
  3. (Server)Certificate:服务器端将自己的证书下发给客户端。
  4. (Server)Server Hello Done:通知客户端Server Hello过程结束;
  5. (Client)Certificate Verify:接到证书的客户端可使用数字证书认证机构的公开密钥对证书上的数字签名进行认证,验证后取出证书中的服务器公钥,再生成一个随机数Random3,利用公钥对Random3加密,生成PerMaster Key;
  6. (Client)Client Key Exchange:将PerMaster Key传给服务器,服务器再利用私钥解出PerMaster Key得到Random3。客户端和服务器都根据同样的算法,使用Random1+Random2+Random3生成一份秘钥,握手结束后的应用层数据都根据这个秘钥进行对称加密。
  7. (Client)Change Cipher Spec:客户端通知服务器,之后再发出的消息都会用之前协商出的秘钥进行加密;
  8. (Client)HandShake: Finished:客户端将前面的握手消息生成摘要再用协商好的秘钥进行加密,服务端接收后会用秘钥进行解密,若能解出来,说明前面协商出来的秘钥是一致的;
  9. (Server)Change Cipher Spec:服务端通知客户端之后再发出的消息都会用之前协商出的秘钥进行加密;
  10. (Server)HandShake: Finished:服务器端也将握手消息生成摘要再用密钥加密。客户端接收后利用秘钥解密,能解出来说明协商出的秘钥是一样的;
  11. Application Data:双方已经安全地协商出了一份秘钥,所有应用层数据都会用秘钥加密后再通过TCP进行可靠传输;
  12. Alert: warning, close notify:由客户端断开连接。断开连接时,发送close_notify报文。

用户使用浏览器访问一个网站的过程

  1. 浏览器先尝试从host文件中获取域名对应的ip地址,如果没有,则利用DNS协议来获取IP;
  2. 获取IP地址后,利用TCP协议建立TCP连接;
  3. PC和服务器之间会有很多路由器一类的东西,IP协议指定了出发地(你的PC)和目的地(服务器)。数据会经过一个又一个路由器,OSPF协议会使用路由算法决定会经过哪些路由器,ARP协议负责求下一节点的地址。IP协议使用的是IP地址,整个发送过程只涉及出发地和目的地两个IP地址,而ARP协议使用的是MAC地址,整个发送过程涉及每一个节点的MAP地址;
  4. 使用HTTP协议请求网页内容;
  5. 服务器接收到HTTP请求,Web Server进行相应的初步处理,解析请求,拿到请求的地址、参数等,服务器脚本根据请求调用本地的数据,生成页面;
  6. Web Server将生成的页面作为HTTP响应的body,根据不同的处理结果生成响应header,发回给客户端;
  7. 客户端接收到HTTP响应,通常第一个得到的响应body内是HTML代码,开始对HTML代码进行解析;
  8. 解析过程中遇到引用服务器的资源(CSS、JS、图片、音频视频、附件等),再向Web Server发送请求,Web Server找到相应的文件发送回来;
  9. 浏览器用CSS对HTML进行渲染,执行JS代码。

websocket

基于HTTP协议,请求头添加Upgrade: websocket; Connection: Upgrade,切换为websocket协议。
服务器可以主动给客户端发送消息。轮询或long loop浪费服务器资源。
https://www.zhihu.com/question/20215561