既然开始学习Web了,当然要先来了解一下HTTP协议,毕竟这是基石。
同样的在了解HTTP协议前,我们先来了解一下TCP/IP协议。

什么是TCP/IP协议?

TCP/IP(Transmission Control Protocol/Internet
Protocol,传输控制协议/网际协议)是指能够在多个不同网络间实现信息传输的协议簇。TCP/IP协议不仅仅指的是TCP和IP两个协议,而是指一个由FTP、SMTP、TCP、UDP、IP等协议构成的协议簇,因为在TCP/IP协议中TCP和IP协议最具代表性,所以被称作为TCP/IP协议。TCP/IP协议簇中有一个重要的概念–分层,TCP/IP协议按照层次分为应用层(TelnetFTPSMTP)、传输层(TCPUDP)、网络层(IPICMPIGMP )、数据链路层(ARPRARP)。----百度百科

还是上图理解的快:

JavaScript实现tcp通信 js tcp协议_HTTP

什么是HTTP协议?

HTTP协议的中文名是,超文本传输协议(HyperText Transfer Protocol)是互联网上应用最为广泛的一种网络协议。所有的WWW文件都必须遵守这个标准。它是TCP/IP协议的一个应用层协议,规定了客户端浏览器与服务器之间互相通信的规则。

简单的来说,HTTP协议就是客户端和服务器交互的一种通讯格式。

HTTP协议的组成

HTTP协议由HTTP请求和HTTP响应组成,在浏览器输入网址(URL)时,浏览器会把你的请求封装成一个HTTP请求发送给服务器站点,服务器收到请求后会组织响应数据封装成一个HTTP响应返还给浏览器。

HTTP请求:
浏览器向服务器请求某个web资源时,称之为浏览器向服务器发送了一个HTTP请求。
HTTP请求由三部分组成,分别是:请求行、请求头、请求体;

  • 请求行以一个方法符号开头,以空格分开,后面跟着请求的URI和协议的版本号,格式如下:Method Request-URI HTTP-Versin CRLF;
    其中Method表示请求方法;Request-URI是一个统一资源标识符;HTTP-Version表示请求的HTTP协议版本;CRLF表示回车和换行(除了作为结尾的CRLF外,不允许出现单独的CR或LF字符)。
    请求方法(所有方法全为大写)有多种,各个方法的解释如下:
    GET 请求获取Request-URI所标识的资源
    POST 在Request-URI所标识的资源后附加新的数据
    HEAD 请求获取由Request-URI所标识的资源的响应消息报头
    PUT 请求服务器存储一个资源,并用Request-URI作为其标识
    DELETE 请求服务器删除Request-URI所标识的资源
    TRACE 请求服务器回送收到的请求信息,主要用于测试或诊断
    CONNECT 保留将来使用
    OPTIONS 请求查询服务器的性能,或者查询与资源相关的选项和需求
    常用的就是GET和POST
    应用举例:
    GET方法:在浏览器的地址栏中输入网址的方式访问网页时(超链接),浏览器采用GET方法向服务器获取资源,GET方式在URL地址后附带的参数是有限制的,其数据容量通常不能超过1k。eg:GET /java.html HTTP/1.1 (CRLF)
    POST方法要求被请求服务器接受附在请求后面的数据,常用于提交表单POST方式可以在请求的实体内容中向服务器发送数据,传送的数据量无限制
    eg:POST /reg.jsp HTTP/ (CRLF)
    请求头:
    Accept: text/html,image/* 【浏览器告诉服务器,它支持的数据类型】
    Accept-Charset: ISO-8859-1 【浏览器告诉服务器,它支持哪种字符集】
    Accept-Encoding: gzip,compress 【浏览器告诉服务器,它支持的压缩格式】
    Accept-Language: en-us,zh-cn 【浏览器告诉服务器,它的语言环境】
    Host: www.it315.org:80【浏览器告诉服务器,它的想访问哪台主机】
    If-Modified-Since: Tue, 11 Jul 2000 18:23:51 GMT【浏览器告诉服务器,缓存数据的时间】
    Referer: http://www.it315.org/index.jsp【浏览器告诉服务器,客户机是从那个页面来的—反盗链】
    8.User-Agent: Mozilla/4.0 (compatible; MSIE 5.5; Windows NT 5.0)【浏览器告诉服务器,浏览器的内核是什么】
    Cookie【浏览器告诉服务器,带来的Cookie是什么】
    Connection: close/Keep-Alive 【浏览器告诉服务器,请求完后是断开链接还是保持链接】
    Date: Tue, 11 Jul 2000 18:23:51 GMT【浏览器告诉服务器,请求的时间】

HTTP响应:
一个HTTP响应代表着服务器向浏览器回送数据
HTTP响应报文也由三部分组成,分别是:响应行、响应头、响应体;

  • 响应行的格式:HTTP版本号 状态码 原因叙述
    eg:HTTP/1.1 200 OK
    状态码表示服务器对请求的处理结果,由三位十进制数构成。分为五类:
  • JavaScript实现tcp通信 js tcp协议_HTTP_02

  • 响应头:
    Location: http://www.it315.org/index.jsp 【服务器告诉浏览器要跳转到哪个页面】
    Server:apache tomcat【服务器告诉浏览器,服务器的型号是什么】
    Content-Encoding: gzip 【服务器告诉浏览器数据压缩的格式】
    Content-Length: 80 【服务器告诉浏览器回送数据的长度】
    Content-Language: zh-cn 【服务器告诉浏览器,服务器的语言环境】
    Content-Type: text/html; charset=GB2312 【服务器告诉浏览器,回送数据的类型】
    Last-Modified: Tue, 11 Jul 2000 18:23:51 GMT【服务器告诉浏览器该资源上次更新时间】
    Refresh: 1;url=http://www.it315.org【服务器告诉浏览器要定时刷新】
    Content-Disposition: attachment; filename=aaa.zip【服务器告诉浏览器以下载方式打开数据】
    Transfer-Encoding: chunked 【服务器告诉浏览器数据以分块方式回送】
    Set-Cookie:SS=Q0=5Lb_nQ; path=/search【服务器告诉浏览器要保存Cookie】
    Expires: -1【服务器告诉浏览器不要设置缓存】
    Cache-Control: no-cache 【服务器告诉浏览器不要设置缓存】
    Pragma: no-cache 【服务器告诉浏览器不要设置缓存】
    Connection: close/Keep-Alive 【服务器告诉浏览器连接方式】
    Date: Tue, 11 Jul 2000 18:23:51 GMT【服务器告诉浏览器回送数据的时间】

HTTP目前的版本以及其特性:

HTTP1.0:

在该协议下,客户端与web服务器建立连接后,只能保持一种短暂的连接(获得一个web资源),照成连接无法复用,因此每次发送请求都需要进行一次TCP的连接,而TCP的连接释放过程又是比较费事的,导致网络的利用率非常低。【短连接,获取资源后就断开连接】
其次它还有队头阻塞(head of lineblocking)的问题,因为在HTTP1.0规定中,下一个请求必须在前一个请求响应到达之前才能发送。如果前一个请求的响应一直达不到的话,那么下一个请求就不会发送,同样的后面的请求也给阻塞了。

HTTP1.1:

看名字就可以知道,HTTP1.1是为了克服HTTP1.0的缺点而出现的升级版。它不仅继承了HTTP1.0简单的特点,还克服了诸多HTTP1.0性能上的问题。
首先,HTTP1.1支持持久连接(HTTP1.1默认使用带流水线的持久连接),在一个TCP连接上可以传送多个HTTP请求和响应(获取多个web资源),减少了建立和关闭的消耗和延迟。在HTTP1.1中,request和reponse头中都有可能出现一个connection的头,通过设置Keep-Alive可以保持HTTP连接不断开避免了每次客户端与服务器请求都要重复建立释放建立TCP连接,提高了网络的利用率。如果客户端想关闭HTTP连接,可以在请求头中携带Connection: false来告知服务器关闭请求。
其次,HTTP1.0支持请求管线化(pipelining)。基于HTTP1.1持久连接的特性,使得请求管线化成为了可能。管线化使得请求能够“并行”传输。

HTTP2.0:

这个就是HTTP1.1的升级版,有以下新特性:
二进制分帧
多路复用(连接共享)
头部压缩
服务器推送

总结:

HTTP1.0:

  • 无状态
  • 无连接

HTTP1.1:

  • 持久化连接
  • 请求管线化
  • 增加缓存处理(新的字段如cache-control)
  • 增加Host字段、支持断点传输等

HTTP2.0:

  • 二进制分帧
  • 多路复用(连接共享)
  • 头部压缩
  • 服务器推送