TCP/IP学习笔记:HTTP

报文格式

请求报文

1
2
3
4
5
GET /somedir/page.html HTTP/1.1
Host: www.someschool.edu
Connection: close
User-agent: Mozilla/5.0
Accept-language: fr

第一行叫做请求行,其后继的行叫做首部行。首部行中,冒号左边的称为首部字段名,右边称为值。

  • 请求行

    • 方法字段
      • GET:浏览器请求一个对象。
      • POST:当用户提交表单时,HTTP客户常使用POST方法,表单中的值存放在实体体中。
      • HEAD:类似于GET方法,当服务器收到一个HEAD请求时,将对用一个HTTP报文进行响应,但是不返回请求对象
      • PUT:用户上传对象到指定的Web服务器上的指定路径(目录)。
      • DELETE:用户或应用程序删除Web服务器上的对象。
    • URL字段:例子中的/somedir/page.html
    • 版本字段:例子中的HTTP/1.1
  • 首部行

    • Host:指明对象所在的主机。
    • Connection: close告诉服务器不要使用持续连接,它要求服务器在发送完被请求的对象后就关闭这条连接。
    • User-agent:指明用户代理,即向服务器发送请求的浏览器类型。这里的Mozilla/5.0就是Firefox浏览器。
    • Accept-language:用户想得到的对象的语言,如这里的Fr即指法语版本。若服务器中没有这样的对象,那么服务器应当发送它的默认版本。
    • If-modified-since:(条件GET方法)若服务器上的对象在此日期之后被修改,服务器才会传回新对象,否则服务器返回304 Not Modified。这个日期通常来源于之前请求时得到的响应报文中的Last-modified首部行。
    • cookie:本机对应本站点的cookie。
  • 实体体(可以不存在)

    ​ 如上所述,实体体通常含通过POST方法发送的表单信息。

一个HTTP请求报文的通用格式为:

1
2
3
4
5
6
7
<方法> <URL> <版本>\r\n
<首部字段名:> <值>\r\n
<首部字段名:> <值>\r\n
...
<首部字段名:> <值>\r\n
\r\n
<实体体>

响应报文

下面这个报文可以是对上述请求报文例子的回应。

1
2
3
4
5
6
7
8
HTTP/1.1 200 OK
Connection: close
Date: Tue, 18 Aug 2015 15:44:04 GMT
Server: Apache/2.2.3 (CentOS)
Last-Modified: Tue, 18 Aug 2015, 15:11:03 GMT
Content-Length: 6821
Content-Type: text/html
(data data data data data ...)

这个例子中,第1行称为状态行,第2-7行称为首部行,接下来是实体体。实体体部分是报文的主要部分,它包含了所请求的对象本身(表示为data data data data data ...)。

  • 状态行

    • 协议版本字段(HTTP/1.1

    • 状态码(200

      常见的状态码:

      状态码&短语 含义
      200 OK 请求成功,信息在返回的响应报文中。
      301 Moved Permanently 请求的对象已经被永久转移,新的URL定义在响应报文的Location首部行中。客户软件将自动获取新的URL。
      304 Not Modified 告诉缓存器可以使用原有对象。
      400 Bad Request 一个通用差错代码,指示该请求不能被服务器理解。
      404 Not Found 被请求的文档不在服务器上。
      505 HTTP Version Not Supported 服务器不支持请求报文使用的HTTP协议版本。
    • 相应状态信息(OK

  • 首部行

    • Connection: close告诉客户发送完报文后将关闭该TCP连接。
    • Date:服务器产生并发送该响应报文的日期和时间。(不是对象创建或最后修改的时间,而是服务器从它的文件系统中检索到该对象,将该对象插入响应报文,并发送该响应报文的时间)
    • Server:生成该报文的服务器信息。(与请求报文中的User-agent对应)
    • Last-Modified:对象创建或最后修改的日期和时间。(对对象缓存很重要)
    • Content-Length:被发送对象的字节数。
    • Content-Type:对象类型。这里对象类型是HTML文本。(对象类型应该正式地由Content-Type首部行而不是用文件扩展名来指示)
    • Set-cookie:设置cookie。
  • 实体体(可以不存在)

    ​ 含有对象内容。

参考资料

《计算机网络:自顶向下方法(原书第7版)》P64-75

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×