第一部分:应用层HTTP
应用层协议定义了应用进程间交换的报文类型、报文构成部分具体含义以及交换时序等内容。即语法、语义、时序等协议三要素。
典型的网络应用编程接口是套接字(Socket),应用进程可以通过创建套接字实现与底层协议接口,并可以进一步通过套接字实现应用进程和底层协议间的报文交换。因此,套接字是每个应用进程与其他应用进行进行网络通信时,真正收发报文的通道。
HTTP概述:
HTTP是Web应用的应用层协议,定义了浏览器如何向Web服务器发送请求以及Web服务器如何响应浏览器。
历史版本更迭:
HTTP/0.9
1991年发布的原型版本,该版本的设计初衷是为了获取简单的HTML对象,只支持GET请求,没有定义任何首部,不支持多媒体内容的MIME类型和协议版本号。正是由于设计的缺陷,所以该版本只在早期短时使用,很快被HTTP/1.0取代。
HTTP/1.0
是第一个得到广泛应用的HTTP版本。该版本增加了协议版本号,各种首部行,额外的方法以及对多媒体对象的支持。HTTP/1.0使Web页面增添了生动的多媒体内容以及表单,增加了交互能力,因此被人们广泛接受。但是,HTTP/1.0的规范定义做得并不好。20世纪90年代中期,很多流行的Web客户端和服务器都在向HTTP中添加新的特性,以满足不同的需求。如持久连接keep-alive、虚拟主机支持以及代理连接支持等,都被增加到HTTP中,并成为非官方的事实标准。这种非正式的HTTP/1.0扩展版本通常被称为HTTP/1.0+。
HTTP/1.1(目前广泛使用)
是目前Web应用最广泛的HTTP版本,与HTTP/1.0版本相比,该版本支持更多的请求方法、扩展了一些首部、增加了响应状态码、改进了对缓存的支持等。重点是校正了HTTP设计中的结构缺陷,明确了语义,引入了重要的性能优化措施,并删除了一些不良特性。并且还包含了20世界90年代末正在发展的更为复杂的Web应用程序部署方式的支持(如WebDAV)。
HTTP/2.0
目前的最新版本,它最初称为HTTP-NG,是HTTP/1.1后继结构的原型建议,重点关注性能优化以及强大的服务逻辑远程执行框架。HTTP-NG的研究工作终止于1998年。但是,后期某些技术的提出与发展还是推动了2.0的探索和实践,其中最典型的就是SPDY。SPDY是speedy的昵音,意为更快。是Google开发的基于TCP的应用层协议。其目标是优化HTTP性能,通过压缩、多路复用和优先级等技术,缩短页面加载时间并提高安全性。SPDY的核心是减少TCP连接数,而对于HTTP语义并未做太多修改。
通过浏览器查看HTTP版本号:
火狐浏览器
HTTP连接:
概述:HTTP是基于传输层的TCP传输报文。浏览器在向服务器发送请求之前,先和服务器建立TCP连接,然后才能发送请求报文,并接受HTTP响应报文。根据HTTP在使用TCP连接时的策略不同,我们将HTTP分为非持久HTTP连接和持久性HTTP连接。
一:非持久连接
HTTP/1.0默认使用非持久连接
所谓非持久连接是只HTTP客户在和HTTP服务器建立TCP连接后,发送HTTP报文到接收到该请求的响应结果后,断开TCP连接。这就意味着下一次发送HTTP请求又得重新建立TCP请求。
下面我们通过一个例子来看看HTTP在使用TCP连接策略不同时所花费的时间。
例题:
假设用户在浏览器中输入了URL地址为 http://www.abc.com/index.html,该请求的index.html中引用了3个JPEG图像。
弊端:
这种串行方式因为每次请求资源前都要单独的建立一次TCP连接,这就意味着每次资源请求都要再经历一次TCP拥塞控制的慢启动阶段,使得TCP连接,工作在较低的吞吐量状态,延迟会更加的明显。
非持久并行连接:
显然为了提高HTTP的性能,所以出现了非持久的并行连接
所谓并行连接,就是通过建立多条并行的TCP连接,并行发送HTTP请求和并行接收HTTP响应。
还是之前的例题,我们来看看在这种TCP连接策略下所花的时间。
注意:
并行连接并不一定总能减小延迟,加快网页的加载速度。比如,客户主机接入链路带宽受限等。
另外,并行连接会增加客户端主机的资源开销,如内存开销等。因此系统通常对同时建立的并行TCP连接数是有限制的。同样,服务器也会对来自同一客户的并行TCP连接有限制。
二:持久性连接
1:持久性非管道连接
所谓持久性非管道连接就是客户端在通过持久连接接收到前一个响应报文后,才能发出下一个对象的请求报文。与非持久性连接相比,连接请求多个对象时,只需要建立一次TCP连接。这样,每获取一个对象只需要一个RTT时间。
之前例题在这种TCP连接策略下所花费的时间如下图
2:持久性管道式连接
HTTP/1.1默认情况下是使用这种持久性管道式连接
所谓持久性管道连接就是客户端在通过持久连接接收到前一个对象的响应报文之前,连续依次发送后续对象的请求报文,然后再通过该连接依次接收服务器返回的响应报文。使用持久性管道式连接时,获取一个对象平均时间是远小于1RTT时间的,如果忽略对象的传输时间,连续请求多个对象只需要1个RTT时间。
我们来看看还是之前例题中在这种TCP连接策略下所花的时间
关闭持久连接的方式:
1):客户端在最后一条请求报文中包含connection: close首部行。
2):客户端在收到响应报文中包含connection: close首部行。
3):超过一定时间。
注意:
1:每个持久连接只适用于一跳传输,HTTP/1.1代理必须能够分别管理与客户端和服务端的持久连接。
2:HTTP/1.1代理服务器不应该与HTTP/1.0客户端建立支持连接。
HTTP典型的请求方法:
1:GET 请求读取由URL所标识的信息资源,最常见的的方法。
2:HEAD 请求读取URL所标识的信息的首部,即无须在响应报文中包含对象。
3:POST 给服务器添加信息(例如:注释)
4:OPTION 请求一些选项的信息
5:PUT 在指明的URL下存储一个文档
HTTP状态码
HTTPS概述:
HTTPS = HTTP + SSL 或者 HTTP + TLS
也就是说HTTP协议使用SSL或TLS进行安全通信时,称为安全的HTTP,简记为HTTPS。
SSL英文全称:Secure Socket Layer,安全套接字层。
TLS英文全称:Transport Layer Security,传输层安全。TLS是SSL的变体,差异不大。
SSL/TLS是介于应用层和传输层之间,类似会话层,可作为基础协议栈的一部分,也可以直接嵌入浏览器中使用。
SSL/TLS提供安全套接字接口,数据处理完成后交给TCP传输。可以说,SSL/TLS可以为所有基于TCP的网络应用提供应用编程的接口,具有良好的通用性。SSL需要一组秘钥用于链接,并且需要在握手阶段进行证书交换并作为协议的一部分。
HTTPS与HTTP的区别:
❀ HTTPS需要向CA申请证书,CA免费证书是有限的,所以申请证书需要一定的费用。
❀ HTTP是明文传输,HTTPS是加密传输。且HTTPS在安全加密、解密过程中涉及多种密码和多种加密算法。
❀ HTTP更安全。
第二部分:传输层TCP/UDP
传输层概述:
传输层的核心任务是为应用进程之间提供端到端的逻辑通信。为此,传输层主要实现如下功能:
1:传输层寻址(IP+端口号);
2:对应用层报文进行分段和重组;
3:对报文进行差错检测;实现进程间的端到端可靠传输控制;
4:面向应用层实现复用和分解;
(多路复用和多路分解概念:支持众多应用进程共用同一个传输层协议,并能够将接收到的数据准确交付给不同的应用进程,称为传输层的多路复用和多路分解)
5:实现端到端的流量控制;拥塞控制等;
并不是所有的传输层协议都要实现所有这些功能,通常大部分传输层协议只实现其中一部分功能。
Internet的传输层主要有两个协议:面向连接的TCP协议和无连接的UDP协议。
UDP协议
用户数据报协议UDP是Internet传输层协议,提供无连接、不可靠、数据报尽力传服务。也就是说应用进程将报文发送你进一个UDP套接字时,UDP并不保证能将该报文送达目的地。它是一种轻量级传输层协议,只提供最基本的传输层服务。
DNS就是使用UDP协议的一个例子。
虽然UDP提供的是不可靠传输服务,但是使用UDP的应用依然可以实现可靠数据传输,只要应用层设计可靠传输机制即可。
TCP协议
总述:
传输层控制协议(TCP)是Internet一个重要的传输层协议。
TCP提供面向连接、可靠、有序、字节流传输服务。
TCP提供全双工通信服务,即TCP允许通信双方的应用进程在任何时候都能发送数据和接收数据。
三次握手(建立连接时)
SYN = 1时, 表示该TCP报文段是一个建立新连接请求控制段或者同意建立新连接的确认段
ACK = 1时, 标识确认序号字段有效。
ACK = 0时, 确认序号字段无效。
seq = x时,初始序号为x。
ack_seq = x + 1, 确认序号为x + 1.
为什么一定要三次握手建立连接?
为了确保连接双方彼此完全清楚对方状态(比如初始序列号和接收窗口大小等),从而保证可靠、稳定的建立连接。
同时,通过三次握手建立连接还可以有效预防过期,失效的连接请求到达后,导致无效连接的建立。
四次挥手(关闭连接时)
FIN = 1时,表示发送端数据已发送完毕,请求释放TCP连接。
ACK = 1时, 标识确认序号字段有效。
ACK = 0时, 确认序号字段无效。
seq = w时,初始序号为w。
ack_seq = w + 1, 确认序号为w + 1。
为什么要有TIME_WAIT时间等待状态?
主要原因是为了保证客户端发送的最后一个ACK报文能到达服务器端。
该ACK如果丢失,服务器得不到FIN+ACK的确认,会超时重传。
如果没有TIME_WAIT,那么就无法接收到服务器重传的FIN+ACK。
MSL是最大段生存时间,是任何TCP段被丢弃前在网络内“存活”的最长时间。
TCP规范【RFC793】规定的MSL为2min,但实际系统在实现TCP时设定的时间有所不同,比如BSD/386为30s, Soloris2.2为1min。
在什么情况下二次三次挥手可合并?
如果服务器收到客户端发送的FIN段(第一次挥手)时,刚好服务器向客户发送的最后一个数据段也发送完毕。在这种情况下可以把第二次挥手和第三次挥手合并为一个段落发送。
第三部分:网络层
网络层概述
网络层介于传输层和链路层之间,它关注的是如何将承载了传输层报文段的网络层数据报从源主机送达目的主机。
网络层要实现的主要功能是转发和路由选择。
除此之外,还为提供面向连接服务的网络提供另外一个重要的网络层功能:连接建立。
根据是否在网络层建立连接服务,分组交换网络可以分为仅在网络层建立连接的虚电路网络和仅在网络层提供无连接服务的数据报网络。
数据报网络(IP)
所谓数据报网络就是按照目的主机地址进行路由选择的网络。
因特网的IP都是按照目的主机的地址进行路由选择的,因此因特网是一个数据报网络。属于“无连接”服务。