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。