图解HTTP阅读笔记

TCP/IP的分层管理

应用层

应用层决定了向用户提供应用服务时通信的活动。

TCP/IP协议族内预存了各类通用的应用服务。如,FTP(File Transfer Protocol)和DNS(Domain Name System,域名系统)服务就是其中两类。

HTTP协议也处于该层。

传输层

传输层对上层应用层,提供处于网络连接中的两台计算机之间的数据传输。

在传输层有两个性质不同的协议:TCP(Transmission Control Protocol,传输控制协议)和UDP(User Data Protocol,用户数据报协议)。

网络层

网络层用来处理在网络上流动的数据包。数据包是网线传输的最小数据单位。该层规定了通过怎样的途径(所谓的传输线路)到达对方计算机,并把数据包传送给对方。

与对方计算机之间通过多台计算机或网络设备进行传输时,网络层所起的作用就是在众多的选项内选择一条传输路线。

链路层

用来处理连接网络的硬件部分。包括控制操作系统、硬件的设备驱动、NIC(Network interface Card,网络适配器,即网卡),及光纤等物理可见部分。硬件上的范畴均在链路层的作用范围之内。

通信传输流

利用TCP/IP协议族进行网络通信时,会通过分层顺序与对方进行通信。发送端从应用层往下走,接收端则往应用层往上走。

我们用HTTP举例说明,首先作为发送端的客户层在应用层(HTTP协议)发出一个想看某个web页面的HTTP请求。

接着,为了传输方便,在数据层(TCP协议)把从应用层收到的数据(HTTP请求报文)进行分割,并在各个报文上打上标记序号及端口号后发送给网络层。

在网络层(IP协议),增加作为通信目的地的MAC地址后转发给链路层。这样一来,发往网络的通信请求就准备齐全了。

接收端的服务器在链路层接收到数据,按序网上曾发送,一直到应用层。当传输到应用层,才算真正接受到由客户端发送过来的HTTP请求。

发送端在层与层之间传输数据时,每经过一层时必定会被打上一个该层所属的首部信息。反之,接收端在层与层传输数据时,每经过一层时会把对应的首部消去。

这种把数据信息包装起来的做法成为封装。

简单的HTTP请求

请求必定由客户端发出,而服务端回复响应

HTTP协议规定,请求从客户端发出,最后服务端响应该请求并返回。换句话说,肯定是先从客户端开始建立通信的,服务端在没有接收到请求之前不会发送响应。

实例

下面是从客户端发送给某个http服务器端的请求报文中的内容。

GET /index.htm HTTP/1.1
Host:hackr.jp

起始行开头的GET表示请求访问服务器的类型,称为方法(method)。随后的字符串 /index.htm 指明了请求访问的资源对象,也交错请求URI(request-URI)。 最后的HTTP/1.1 ,即HTTP的版本号,用来提示客户端使用HTTP的协议功能。

综合来看,这段请求的内容的意思是:请求访问某台HTTP服务器上的/index.htm页面资源。

请求报文是由请求方法、请求URL、协议版本、可选的请求首部字段和内容实体构成的。

收到请求,服务器会将请求内容的处理结果以响应的形式返回。

HTTP/1.1 200 OK
Date: Tue,10 Jul 2012 06:50:15 GMT
Content-Length:362
Content-Type:text/html

<html>
...

在起始行开头的HTTP/1.1表示服务器对应的HTTP版本。

紧挨着的200 OK表示请求的处理结果的状态吗(status code)和原因短语(reason-phrase)。 下一行显示了创建响应的日期时间,是首部字段(header field)内的一个属性。

接着以一空行分割,之后的内容称为资源实体的主体(entity body)。

响应报文基本上由协议版本、状态码、用以解释状态吗的原因短语、可选的响应首部字段以及实体主体构成。稍后我们会对这些内容进行详细说明。

HTTP是不保存状态的协议

HTTP是一种不保存状态,即无状态(stateless)的协议。HTTP协议自身不对请求和响应之间的通信状态进行保存。也就是说在HTTP这个级别,协议对于发送过的请求或响应都不做持久化处理。

HTTP/1.1虽然是无状态协议,单位了实现期望的保持状态功能,于是引入了Cookie技术。有了Cookie再用HTTP协议通信,就可以管理状态了。

请求URI定位资源

URI为完整请求的URI

GET http://example.cn/index.htm HTTP/1.1

在首部字段Host中写明网络域名或IP地址

GET /index.htm HTTP/1.1
Host:example.cn

除此之外,如果不是访问特定资源而是对服务器本身发起请求,可以用一个*来代替请求URI。下面这个例子是查询HTTP服务器端支持的HTTP方法种类。

OPTIONS * HTTP/1.1

告知服务器意图的HTTP方法

GET:获取资源

If-Modified-Since:Thu,12 Jul 2012 07:30:00 GMT 仅返回该时间以后更新过的index.html页面资源。如果没有内容更新,则以状态码304 Not Modified作为响应返回。

POST:传输实体主体

虽然用GET方法也可以传输实体的主体,但一般不用GET方法进行传输,而是用POST方法。虽说POST的功能与GET很相似,但POST的主要目的并不是获取相应的主体内容。

PUT: 传输文件

PUT方法用来传输文件。就像FTP协议的文件上传一样,要求在请求报文的主体中包含文件内容,然后保存请求URI指定的位置。

但是,鉴于HTTP/1.1的put方法自身不带验证机制,任何人都可以上传文件,存在安全性问题,因此一般的Web网站不使用该方法。若配合Web应用程序的验证机制,或架构设计采用REST标准的同类Web网站,就可能会开放使用PUT方法。

HEAD:获得报文首部

HEAD方法和GET方法一样,只是不返回报文主体部分。用于确认URI的有效性及资源更新的日期时间等。

DELETE:删除文件

DELETE方法用来删除文件,是与PUT相反的方法。DELETE方法按请求URI删除指定的资源。

但是,HTTP/1.1的DELETE方法本身和PUT方法一样不带验证机制,所以一般的Web网站也不适用DELETE方法。

CONNECT:要求使用隧道协议链接代理

CONNECT方法要求在与代理服务器通信时建立隧道,实现用隧道协议进行TCP通信。主要是用SSL(Secure Sockets Layer,安全套接层)和TLS(Transport Layer Security,传输层安全)协议把通信内容加密后经过网络隧道传输。

持久连接节省通信量

HTTP协议的初始版本中,每进行一次HTTP通信就要断开一次TCP链接。

持久连接

为了解决TCP连接的问题,HTTP/1.1和一部分的HTTP/1.0想出了持久链接的方法。持久连接的特点是,只要任意一端没有明确提出断开链接,则保持TCP连接状态。

持久连接旨在建立1次TCP连接后进行多次请求和响应的交互。

在HTTP/1.1中,所有的连接默认都是持久连接,但在HTTP/1.0内并未标准化。虽然有一部分服务器通过非标准的手段实现了持久连接,但服务端不一定能够支持持久连接。毫无疑问,除了服务器端,客户端也要支持持久连接。

管线化

持久连接使得多数请求以管线化的方式发送成为可能。从前发出请求后需等待并收到响应,才能发送下一个请求。管线化技术出现后,不用等待响应亦可直接发送下一个请求。

这样就能做到同时并行发送多个请求。

使用Cookie的状态管理

HTPP是无状态协议,它不对之前发生过的请求和响应的状态进行管理。

保留状态协议这个特征的同事又要解决类似的矛盾问题,于是引入了Cookie技术。Cookie技术通过在请求和响应报文中写入Cookie信息来控制客户端的状态。

IP、TCP、NDS和URI

负责传输的IP协议

按层次分,IP(Internet Protocol)网际协议位于网络层。所有使用网络的系统都会用到IP协议。TCP/IP协议族中的IP指的就是网际协议,协议名称中占据了一半位置,其重要性可见一斑。

IP和IP地址不同,”IP”其实是一种协议的名称。

IP协议的作用是把各种数据包传送给对方。而要保证确实传送到对方那里,则需要满足各类条件。其中两个重要的条件是IP地址和MAC地址(Media Access Control Address)

IP地址指明了节点被分配到的地址,MAC地址是指网卡所属的固定地址。IP地址可以和MAC地址进行配对。IP地址可变换,但MAC地址基本上不会更改。

使用ARP协议凭借着MAC地址进行通信。

IP间的通信依赖MAC地址。在网络上,通信的双方在同一局域网(LAN)内的情况是很少的,通常是经过多台计算机和网络设备中转才能连接到对方。而在进行中转时,会利用下一站中转设备的MAC地址来搜索下一个中转目标。这时,会采用ARP协议(Address Resolution Protocol)。ARP是一种用于解析地址的协议,根据通信方的IP地址就可以反查出对应的MAC地址。

没有人能在全面掌握互联网中的传出状况。

在到达通信目标前的中转过程中,哪些计算机和路由器等网络设备只能获悉很粗略的传输路线。

这种机制称为路由选择,有点像快递公司的送货过程。


确保可靠性的TCP协议

按层次分,TCP位于传输层,提供可靠的字节流服务。

所谓的字节流服务(Byte Stream Service)是指,为了方便传输,将大块数据分割成以报文段为单位的数据包进行管理。而可靠地传输服务是指,能够把数据准确可靠的传给对方。一言以蔽之,TCP协议为了更容易传送大数据才把数据分割,而且TCP协议能够确认数据最终是否送达对方。

三次握手

TCP协议把数据包送出去之后,一定会向对方确认是否成功送达。

握手过程中使用了TCP的标志————SYN(synchronize)和ACK(acknowledgement).

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

负责域名解析的DNS服务

DNS(Domain Name System)服务是和HTTP协议一样位于应用层的协议。
它提供域名到IP地址之间的解析服务。

计算机既可以被赋予IP地址,也可以被赋予主机名和域名。

用户通常使用主机名或域名来访问对方的计算机,而不是直接通过IP地址访问。因为与IP地址的一组纯数字相比,用字母配合数字的表示形式来指定计算机名更符合人类的记忆习惯。

但是要让计算机去理解名称,相对而言就变得困难了。因为杰斯算计更擅长处理一长串数字。

为了解决上述的问题,DNS服务应运而生。DNS协议提供通过域名查找IP地址,或逆向从IP地址反查域名的服务。

各种协议与HTTP协议的关系

客户端向DNS服务器发送URL,返回IP地址。

HTTP协议的职责: 生成针对目标WEB服务器的HTTP请求报文。

TCP协议的职责:为了方便通信,将HTTP请求报文分割成报文段,按序号分为多少个报文段。把每个报文段可靠地传递给对方。

IP协议的职责:搜索对方的地址,一边中转一边传送。

TCP协议的职责(服务器): 从对方那里接收到的报文段,重组到达的报文段。按序号以原来的顺序重组请求报文。

HTTP协议的职责(服务器):对WEB服务器请求的内容的处理

请求处理的结果利用TCP/IP通信协议向用户进行回传。

URL和URI

URI

URI是Uniform Resource Identifier的缩写。RFC2396分别对这三个单词进行了如下定义。

Uniform

规定统一的格式可方便处理多种不同类型的资源,而不用根据上下文环境来识别资源指定的访问方式。另外,加入新增的协议方案(如http:或ftp:)也更容易。

Resource

资源的定义是“可标识的任何东西”。除了文档文件、图像或服务(例如当天的天气预报)等能够区别于其他类型的,全部都可作为资源。另外,资源不仅可以是单一的,也可以是多数的集合体。

Identifier

表示可表示的对象。也成为标识符。

综上所述,URI就是由某个协议方案表示的资源的定位标识符。协议方案是指访问资源使用的协议类型名称。

采用HTTP协议时,协议方案就是HTTP。除此之外还有FTP、mailto、telnet、file等。标准的URI协议方案有30种左右。

Uri用字符串标识某一互联网资源,而URL标识资源的地点(互联网上所处的位置)。可见URL是URI的子集。

URI格式

表示指定的URI,要是用涵盖全部必要信息的绝对URI、绝对URL以及相对URL。

发布了11 篇原创文章 · 获赞 4 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/kormondor/article/details/77573782