1.3 网络基础TCP/IP
1.3.1 TCP/IP协议族
图:** TCP/IP **是互联网相关的各类协议族的总称
1.3.2 TCP/IP的分层管理
TCP/IP协议族将层次分为以下四层:应用层、传输层、网络层和数据链路层
- 应用层 决定向用户提供应用服务时通信的活动。 该层有FTP(File Transfer Protocol,文件传输协议)和DNS(Domain Name System,域名系统),HTTP协议
- 传输层 为上层应用层提供处于网络连接中的两台计算机之间的数据传输。 该层主要有TCP(Transmission Control Protocol,传输控制协议)和UDP(User Data Protocol,用户数据报协议)。
- 网络层 用来处理在网络上流动的数据包。数据包是网络传输的最小数据单位。该层规定通过怎样的路径到达对方计算机,并把数据包传送给对方。
- 数据链路层 用来处理连接网络的硬件部分。包括控制操作系统、硬件设备驱动、网卡等物理可见范围。
1.3.3TCP/IP通信传输流
利用TCP/IP协议族进行网络通信时,发送端从应用层往下走,接收端则相反。
- 用HTTP举例,客户端在应用层发出一个HTTP请求。
- 接着,为了传输方便,在传输层(TCP协议)把应用层接收的数据(HTTP请求报文)进行分割,并在各个报文上打上标记符号和端口后后转发给网络层。
- 在网络层(IP协议),增加作为通信目的地的MAC地址后转发给链路层。
- 接受端的服务器在链路层收到数据,按顺序从上层发送,当传输到应用层才算接收到客户端发送的HTTP请求。
发送端在层与层之间传输数据时,每经过一层时必定会被打上一个该层所属的首部信息。接收端在层与层之间传输数据时,每经过一层时会把对应的首部消去。
这种把数据信息包装起来的做法称为封装(encapsulate)。
1.4 与HTTP关系密切的协议:IP、TCP和DNS
1.4.1 负责传输的IP协议
按层次分,IP(Internet Protocol)网际协议位于网络层。几乎所有使用网络的系统都会用到IP协议。TCP/IP协议族的IP就是指网际协议,重要性可见一斑。 IP协议的作用就是把各种数据包传送给对方。要确保传送给对方那里,其中两个主要的条件就是IP地址和MAC地址。
- IP地址指明节点被分配到的地址。
- MAC地址是指网卡所属的固定地址。
- IP地址和MAC地址可以配对,IP地址可变,MAC地址基本不会变。 ’ 使用ARP协议凭借MAC地址进行通信 IP间的通信依赖MAC地址。在网络中,通常是经过多台计算机和网络设备中转才能连接到对方。
1.4.2 可靠的TCP协议
TCP位于传输层,提供可靠的字节流服务。
字节流服务是指为了方便传输,将大块数据分割成报文段为单位的数据包进行管理。
为确保准确无误得把数据传输到目标处,TCP协议采用三次握手策略。握手过程中使用了TCP的标志 SYN和ACK
发送端首先发送一个带SYN标志的数据包给对方,接收端收到后回传一个带有SYN/ACK标志的数据包以表示传达确认信息。最后,发送端再回传一个带ACK标志的数据包,代表握手结束。 若在握手过程中某个阶段莫名中断,TCP协议会再次以相同的顺序发送相同的数据包。
1.5 负责域名解析的DNS服务
DNS服务和HTTP协议一样位于应用层的协议。他提供域名到IP地址之间的解析服务。 DNS协议提供通过域名查找IP地址或逆向从IP地址反查域名的服务。
1.6 各种协议与HTTP协议的关系
1.7 URI和URL
URI(统一资源标识符) URL(统一资源定位符)
1.7.1 URI
URI用字符串标识某一互联网资源,而URL表示资源的地点。可见URL是URI的子集。
1.7.2 URI格式
绝对URI的格式
- 协议 使用http: 或https: 等协议方案名获取访问资源时要指定协议类型。不区分字母大小写。 也可使用data: 或javascript: 表示。
- 登录信息 可选,指定用户名和密码作为必要的登录信息。
- 服务器地址 使用绝对URI必须指定待访问的服务器地址。地址可以是类似hackr.jp 这种 DNS 可解析的名称,或是 192.168.1.1 这类 IPv4 地址名,还可以是 [0:0:0:0:0:0:0:1] 这样用方括号括起来的 IPv6 地址名。
- 服务器端口号 可选,指定服务器连接的网络端口号,不选则为默认端口号。
- 带层次的文件路径 指定服务器上的文件路径来定位特指的资源。
- 查询字符串 可选,使用查询字符串传入任意参数。
- 片段标识符 可选,可标记出以获取资源中的子资源。
第二章 简单的HTTP协议
2.1 用于客户端和服务器段之间的通信
在两台计算机之间使用HTTP协议通信的时候,在一条通信路线上必定有一端是客户端,一端是服务器端。
2.2 通过请求和响应的交换达成通信
请求必定由客户端发出,服务端回复响应。
起始行开头的GET表示请求访问服务器的类型,成为方法(method)。字符串/index.htm指明了请求访问的资源对象,叫做请求URI。最后的HTTP1.1,即为HTTP的版本号。
请求报文是由请求方法、请求URI、协议版本、可选的请求首部字段和内容实体构成的。
起始行开头的HTTP/1.1表示服务器对应的HTTP版本。
200OK表示请求的处理结果的状态码和原因短语。
下一行显示了创建响应的日期时间,是首部字段内的一个属性。
接着以一空行分割,之后的内容叫做资源实体的主体。
响应报文基本由协议版本、状态码、用来解释状态码的原因短语、可选的响应首部字段以及实体主体构成。
2.3 HTTP是不保存状态的协议
HTTP是 一种无状态协议。自身不对请求和响应之间的通信状态进行保存,协议对于发送过的请求或响应都不做持久化处理。
2.4 请求URI定位资源
HTTP协议使用URI定位互联网上的资源。
当客户端请求访问资源而发送请求时,URI需要将请求报文中的请求URI包含在内。指定请求URI的方式有很多。
对服务器本身发起请求可用一个*来代替请求URI,如图:
2.5 HTTP方法
以下为HTTP1.1可用的方法。
GET:获取资源
用于请求访问已被URI识别的资源。指定的资源经过服务器端解析后返回响应内容。
POST:传输实体主体
用于传输实体的主体,GET也可以实现,但一般不用。
PUT:传输文件
和FTP协议的文件上传一样,需要在请求报文的主体中包含文件内容,然后保存到请求URI指定的位置。
HEAD:获取报文首部
和GET方法一样,只是不返回报文主体部分。用于确认URI的有效性以及资源更新日期时间等。
DELETE:删除文件 和PUT方法相反,delete方法按照请求URI删除指定的资源。
OPTIONS:询问支持的方法
TRACE:追踪路径
让服务器端将之前的请求通信还回给客户端的方法。
发送请求时,在Max-Forwards首部字段中填入数值,每经过一个服务器端数字 -1,到0的时候停止传输,最后接收到请求的服务器端则返回状态码200OK的响应。
CONNECT:要求用隧道协议连接代理
主要使用 SSL(Secure Sockets Layer,安全套接层) 和 TLS(Transport Layer Security,传输层安全) 协议把通信内容加密后经网络隧道传输。
2.6 持久连接节省通信量
HTTP1.1和部分HTTP1.0想出了持久连接(HTTP Persistent Connections,也称为 HTTP keep-alive 或 HTTP connection reuse)的方法。特点是,只要任意一端没有明确提出断开连接,则保持TCP连接状态。好处在于减少TCP连接的重复建立和断开造成的额外开销,减轻服务器端的负载,提高web页面显示速度。在HTTP1.1中,所有的连接默认都是持久连接。
2.8使用cookie状态管理
cookie技术通过在请求和响应报文中写入cookie信息来控制客户端的状态。
Cookie会工具从服务器端发送的像样报文内的一个叫做Set-Cookie的首部字段信息,通知客户端保存Cookie。当下次客户端再往该服务器发送请求时,客户端会自动在请求报文中加入 Cookie 值后发送出去。
服务器端发现客户端发送过来的 Cookie 后,会去检查究竟是从哪一 个客户端发来的连接请求,然后对比服务器上的记录,最后得到之前 的状态信息。
第三章 HTTP报文内的HTTP信息
3.1 HTTP报文
用于 HTTP 协议交互的信息被称为 HTTP 报文。请求端(客户端)HTTP 报文叫做请求报文,响应端(服务器端)的叫做响应报文。HTTP 报文本身是由多行(用 CR+LF 作换行符)数据构成的字符串文 本。
3.2 请求和响应报文的结构
- 请求行
包含用于请求的方法,请求URI和HTTP版本。
- 状态行
包含表面响应结果的状态码,原因短语和HTTP版本。
- 首部字段
包含表示请求和响应的各种条件和属性的各类首部。
- 其他
可能包含 HTTP 的 RFC 里未定义的首部(Cookie 等)。
3.3 编码提升传输速率
传输时编码可以处理大量的访问请求,也会消耗更多的CPu资源。
3.3.1 报文主体和实体主体的差异
- 报文(message)
是 HTTP 通信中的基本单位,由 8 位组字节流(octet sequence, 其中 octet 为 8 个比特)组成,通过 HTTP 通信传输。
- 实体(entity)
作为请求或响应的有效载荷数据(补充项)被传输,其内容由实 体首部和实体主体组成。
通常,报文主体等于实体主体。只有当传输中进行编码操作时,实体主体的内容发生变化才与报文主体不同。
3.3.2 压缩传输的内容编码
内容编码指明应用在实体内容上的编码格式,内容编码后的实体由客户端接受并负责解码。
常用的内容编码如下:
- gzip
- compress (UNIX系统标准压缩)
- deflate(zlib)
- identity (不进行编码)
3.3.3 分割发送的分块传输编码
在 HTTP 通信过程中,请求的编码实体资源尚未全部传输完成之前, 浏览器无法显示请求页面。在传输大容量数据时,通过把数据分割成 多块,能够让浏览器逐步显示页面。
这种把实体主体分块的功能叫做分块传输编码码(Chunked Transfer
Coding)。
分块传输编码会将实体主体分成多个部分(块)。每一块都会用十六
进制来标记块的大小,而实体主体的最后一块会使用**“0(CR+LF)”** 来标记。
使用分块传输编码的实体主体会由接收的客户端负责解码,恢复到编 码前的实体主体。
HTTP/1.1 中存在一种称为传输编码(Transfer Coding) 的机制,它可以在通信时按某种编码方式传输,但只定义作用于分块传输编码中。
3.4 发送多种数据的多部分对象集合
多部分对象集合包含的对象如下。
- multipart/form-data 在web表单文件上传时使用。
- multipart/byteranges
状态码 206(Partial Content,部分内容)响应报文包含了多个范 围的内容时使用。
在 HTTP 报文中使用多部分对象集合时,需要在首部字段里加上
Content-type。
3.5获取部分内容的范围请求
实现下载可恢复机制功能需要指定下载的实体范围,指定范围发送的请求叫做范围请求(Range Request)。
执行范围请求时,会用到首部字段Range来指定资源的byte范围。
如果服务器端无法响应范围请求,则会返回状态码 200 OK 和完整的
实体内容。
3.6 内容协商返回最合适的内容
内容协商机制是指客户端和服务器端就响应的资源内容进行交涉,然 后提供给客户端最为适合的资源。内容协商会以响应资源的语言、字 符集、编码方式等作为判断的基准。 内容协商技术有以下三种类型。
- 服务器驱动协商(Server-driven Negotiation)
- 客户端驱动协商(Agent-driven Negotiation)
- 透明协商(Transparent Negotiation)
第四章 返回结果的HTTP状态码
4.2 2XX 成功
2XX的响应结果表示请求被正常处理了。
4.2.1 200 OK
表示从客户端发来的请求在服务器端被正常处理了。
4.2.2 204 No Content
代表服务器接收的请求已成功处理,但在返回的响应报文中不含实体的主体部分。另外,也不允许返回任何实体的主体。 比如,当从浏览器发出请求处理后,返回 204 响应,那么浏览器显示的页面不发生更新。
4.2.6 206 Partial Content
表示客户端进行了范围请求,而服务器成功执行了这部分的 GET 请求。响应报文中包含由 Content-Range 指定范围的实体内容。
4.3 3XX 重定向
表示浏览器需要执行某些特殊的处理以正确处理请求。
4.3.1 301 Move Permanently
永久性重定向。 表示请求的资源已被分配到新的URI。
4.3.2 302 Found
临时性重定向。表示请求的资源已被分配到了新的URI,希望用户能使用新的URI访问。
4.3.3 303 See Other
表示由于请求对应的资源存在着另一个URI,应使用GET方法定向获取请求的资源。
4.3.4 304 Not Modified
表示客户端请求的资源自从上一次请求以来并未发生变化,可以继续使用缓存的版本。
4.4 4XX 客户端错误
4XX的响应结果表示客户端是发生错误的原因所在。
4.4.1 400 Bad Request
表示请求报文存在语法错误。
4.4.2 401 Unauthorized
未授权,表示请求要求客户的身份验证。
4.4.3 403 Forbidden
表示对请求资源的访问被服务器拒绝了。
4.4.4 404 Not Found
表示服务器无法找到请求的资源。
4.5 5XX 服务器错误
表示服务器发生错误。
4.5.1 500 Internal Server Error
表示服务器端执行请求时发送错误,也可能是web原因存在的bug或临时的故障。
4.5.2 502 Bad Gateway
错误网关,表示作为网关或代理工作的服务器从上游服务器收到了无效响应。
4.5.3 503 Service Unavailable
表示服务器暂时处于超负载或正在停机维护。
第五章 与HTTP协作的Web服务器
5.2 通信数据转发程序:代理、网关、隧道
代理
代理是一种有转发功能的应用程序,它扮演了位于服务器和客户 端“中间人”的角色,接收由客户端发送的请求并转发给服务器,同时也接收服务器返回的响应并转发给客户端。
网关
网关是转发其他服务器通信数据的服务器,接收从客户端发送来的请求时,它就像自己拥有资源的源服务器一样对请求进行处理。有时客户端可能都不会察觉,自己的通信目标是一个网关。
隧道
隧道是在相隔甚远的客户端和服务器两者之间进行中转,并保持双方通信连接的应用程序。
5.3 保存资源的缓存
缓存是指代理服务器或客户端本地磁盘内保存的资源副本。利用缓存可减少对源服务器的访问,因此也就节省了通信流量和通信时间。
5.3.1 缓存的有效期限
当源服务器上的资源更新时,或者因为客户端要求,缓存的有效期等因素,缓存服务器会再次从源服务器获取新资源。
5.3.2 客户端的缓存
缓存也可以存在客户端浏览器中。浏览器缓存如果有效,就可以直接从本地磁盘读取了。如果缓存过期,会向源服务器确认资源有效性。若判断浏览器缓存失效,浏览器会再次请求新资源。