最近做一个平台的搭建,需要做页面展示,就接触了nginx(nginx是后话,之后会慢慢深入编写),在配置的过程中我对http产生了很多的兴趣,之前做过接口测试,对http有点了解,但是不深入。经过这一段时间的接触,对http有了一定的了解。
Http,按照官方的话来说就是—超文本传输协议(HTTP,HyperText Transfer Protocol)。这样说,未免太过官方,依照我个人的理解,从几点来说。
1、什么是http协议:
HTTP是一种请求/响应式的协议。一个客户机与服务器建立连接后,发送一个请求给服务器;服务器接到请求后,给予相应的响应信息。HTTP 的第一版本 HTTP/0.9是一种简单的用于网络间原始数据传输的协议;
HTTP/1.0由 RFC 1945 定义 ,在原 HTTP/0.9 的基础上,有了进一步的改进,允许消息以类 MIME 信息格式存 在,包括请求/响应范式中的已传输数据和修饰符等方面的信息;
HTTP/1.1(RFC2616) 的要求更加严格以确保服务的可靠性,增强了在HTTP/1.0 没有充分考虑到分层代理服务器、高速缓冲存储器、持久连接需求或虚拟主机等方面的效能;
安全增强版的 HTTP (即S-HTTP或HTTPS),则是HTTP协议与安全套接口层(SSL)的结合,使HTTP的协议数据在传输过程中更加安全。
2、TCP/IP:
提到http就不得不说道tcp/ip,TCP/IP协议是分层的,从底层至应用层分别为:物理层、链路层、网络层、传输层和应用层,图片是我在网上找的,还算画的清楚如下图所示:
从应用层至物理层,数据是一层层封装,封装的方式一般都是在原有数据的前面加一个数据控制头,数据封装格式如下:
其中,对于TCP传输协议,客户端在于服务器建立连接前需要经过TCP三层握手,过程如下:
HTTP是应用层的协议。
3、HTTP基础知识
1) HTTP结构
http 分成了三部分:http://host[:port][abs_path]
其中,http就是指咱们上述的指的http协议所定位的网络资源了。
host指的是主机域名和IP地址
port指的是指定一个端口号,拥有被请求资源的服务器主机监听该端口的TCP连接。如果port是空,则使用缺省的端口80。当服务器的端口不是80的时候,需要显式指定端口号。
abs_path指的是请求资源的URI(Uniform Resource Identifier,统一资源定位符),如果URL中没有给出abs_path,那么当它作为请求URI时,必须以“/”的形式给出。通常这个工作浏览器就帮我们完成了强调内容
浏览器与服务器连接的一般过程:
ServerSocket serverSocket = new ServerSocket();
serverSocket.accept();
www.baidu.com + (浏览器自动加)->DNS(Domain Name Sevice)->***.***.***.**:
Socket socket = new Socket("***.***.***.**:80", );
2) URI与URL
URI纯粹是一个符号结构,用于指定构成Web资源的字符串的各个不同部分。
URL是一种特殊类型的URI,它包含了用于查找某个资源的足够的信息。
其他的URI,例如:[email protected],则不属于URL,因为它里面不存在根据该标识符来查找的任何数据。这种URI称为URN(通用资源名)。
3) HTTP请求
HTTP请求就是,客户端通过发送HTTP请求向服务器请求对资源的访问
HTTP请求由3部分组成,分别是:请求行,消息报头,请求正文。
请求行:请求行以一个方法符号开头,后面跟着请求的URI和协议的版本,以CRLF作为结尾。请求行以空格分隔,除了作为结尾的CRLF外,不允许出现单独的CR或LF字符,格式如下:
method request-uri http-version CRLF
method 表示请求的方法;
request-uri 是一个统一资源标识符,标识了要请求的资源;
http-version 表示请求的http协议的版本(关于http各个版本的不同,我会在另一篇博客中体现)
CRLF 表示回车换行
例如: GET /test.html HTTP/1.1(CRLF)
4) HTTP 请求方法
一般的情况下,我们在浏览一个一个网页的时候就是已经在用http的各种请求方法了。我根据自己的理解,总结了一些方法。
1、GET 从指定的资源请求数据。关于GET还有一些其他的定义,比如get请求可被缓存,可以保留在浏览器的历史记录中,可被收藏成书签,不应在处理敏感数据时使用,有长度限制。
2、POST 向指定资源提交要被处理的数据。在客户机和服务端之间进行请求-响应的时候,最常用的就是get 和 post了。所以在一些场合,这两个方法的区别也经常被作为一个问题。其实我在get中陈述的特点,post统统不具备。这就是我理解的区别了。
3、PUT: 从客户端向服务器传送的数据取代指定的文档的内容。
4、DELETE: 请求服务器删除指定的页面。
5、OPTIONS: 允许客户端查看服务器的性能。
6、TRACE: 请求服务器在响应中的实体主体部分返回所得到的内容。
7、PATCH: 实体中包含一个表,表中说明与该URI所表示的原内容的区别。
8、MOVE: 请求服务器将指定的页面移至另一个网络地址。
9、COPY: 请求服务器将指定的页面拷贝至另一个网络地址。
10、LINK: 请求服务器建立链接关系。
11、UNLINK: 断开链接关系。
12、WRAPPED: 允许客户端发送经过封装的请求。
13、Extension-mothed:在不改动协议的前提下,可增加另外的方法。