[计算机网络] 关于HTTP协议你需要了解的基础

本文内容主要参考自《计算机网络 自顶向下方法 原书第6版》

前言

HTTP(超文本传输协议)Web的应用层协议,它是Web的核心。HTTP由两个程序实现:一个客户程序和一个服务器程序。客户程序和服务器程序运行在不同的端系统中,通过交换HTTP报文进行会话。HTTP协议定义了这些报文的结构以及客户端和服务器进行报文的方式。

 

 

HTTP和TCP

HTTP使用TCP作为它的支撑运输协议。在客户端与服务端开始交互之前,HTTP客户会首先发起一个与服务器的TCP连接,这个TCP连接建立过程参考我的另一片博客(TCP连接--三次握手)。一旦连接建立,该浏览器(客户端进程)和服务器进程就可以通过套接字接口访问TCP。客户端和服务端向各自的套接字接口发送HTTP请求报文接收HTTP响应报文

一旦客户向它的套接字发送了一个请求报文,该报文就脱离了客户控制并进入TCP的控制。TCP为HTTP提供可靠的数据传输服务,服务器进程发出的每个HTTP响应报文最终都能完整地到达客户端,这里可以看出分层结构的最大优点,即HTTP协议不用担心数据丢失,也不需要关注TCP从网络的数据丢失和乱序故障中恢复的细节,因为那是TCP以及协议栈较低层协议的工作。

 

HTTP无状态

HTTP是一个无状态协议,这意味着服务器向客户发送被请求的文件,而不存储关于该客户的任何状态信息。假如某个特点的客户在短短的数秒内两次请求同一个对象,服务器并不会因为刚刚为该客户端提供过相同的对象而对二次请求不再做回应,而是重新发送被请求的对象,就像完全忘记了不久之前所做过的事一样。

 

常提及的两个版本:HTTP1.1和HTTP1.0

这两个HTTP版本最主要的区别是:HTTP1.1提供持续连接,而HTTP1.0规定客户端与服务端之间保持非持续连接。

这个区别意味着,对于HTTP1.0,浏览器(客户端)每次向服务器请求一个对象,都需要单独建立一个TCP连接,对于每个这样的连接,在客户和服务器中都要分配TCP的缓冲区和保持TCP变量,这必然会给Web服务器带来极大的负担;而对于HTTP1.1,服务器在发送响应后会保持该TCP连接打开,在相同的客户与服务器之间的后续请求和响应报文都能够通过相同的连接进行传送。关于HTTP1.1和1.0的更多区别可以参考这篇(HTTP1.0和HTTP1.1的区别

 

 

HTTP报文格式:HTTP请求报文和HTTP响应报文

--HTTP请求报文

[计算机网络] 关于HTTP协议你需要了解的基础

从报文中能得知的信息:

 

  • 该报文是用普通的ASCII文本书写的
  • 第一行称作请求行,包括三个字段:请求方法、URL字段和HTTP版本
  • 第一行之后的各行称作首部行,包括的信息有:Host指明请求对象的主机地址;Connection: close表示浏览器要求服务器在本次请求完成之后关闭这条连接,不使用持续连接;User-agent指明用户代理,即向服务器发送请求的浏览器的类型;Accept-language指定用户想得到该对象的语言版本,这是HTTP中可用的众多内容协商首部之一。

报文格式

[计算机网络] 关于HTTP协议你需要了解的基础

 

 

--HTTP响应报文

[计算机网络] 关于HTTP协议你需要了解的基础

[计算机网络] 关于HTTP协议你需要了解的基础

在请求报文的基础上分析该报文各个字段的含义并不困难,需要特别指明的是Content-Length首部行指示的是被发送对象中的字节数,Content-Type首部行指示的是实体主体的文本类型,这里是HTML文本。空行后的(data data data data data ...)表示的是Entity Body实体体,它是响应报文的主要部分,包含了请求的对象本身

 

报文格式

[计算机网络] 关于HTTP协议你需要了解的基础

 

 

关于HTTP请求报文的GET和POST方法

这部分内容参考自:https://www.cnblogs.com/wqhwe/p/5407468.html

 

  1. 从语法的侧重点上看,GET方法偏向于从服务器获取数据,POST方法则侧重于向服务端发送数据,但是实际上GET方法也可以向服务端发送数据
  2. get传输数据是通过URL请求,以“field(字段)= value”的形式,置于URL后,并用"?"连接,多个请求数据间用"&"连接,如http://127.0.0.1/Test/login.action?name=admin&password=admin,这个过程用户是可见的;post传输数据通过Http的post机制,将字段与对应值封存在请求实体中发送给服务器,这个过程对用户是不可见的
  3. Get传输的数据量小,因为受URL长度限制,URL 的最大长度是 2048 个字符,但效率较高;Post可以传输大量数据,所以上传文件时只能用Post方式;
  4. get是不安全的,因为URL是可见的,可能会泄露私密信息,如密码等;post较get安全性较高;
  5. get方式只能支持ASCII字符,向服务器传的中文字符可能会乱码。post支持标准字符集,可以正确传递中文字符。

关于两者更详细的区别可以参考:http://www.w3school.com.cn/tags/html_ref_httpmethods.asp

 

 

HTTP请求报文的其他方法

[计算机网络] 关于HTTP协议你需要了解的基础

 

 

HTTP和HTTPS的瓜葛

可以参考这篇:https://blog.****.net/dreamer841119554/article/details/79418043

 

常见的状态码

 

 

  • 200  OK:请求成功,信息在返回的响应报文中
  • 301  Moved Permanently:请求的对象已经被永久转移,新的URL定义在响应报文的Location首部行中。客户软件会自动获取新的URL
  • 400  Bad Request:一个通用差错代码,指示该请求不能被服务器理解
  • 404  Not Found:被请求的文档不再服务器上
  • 505  HTTP Version Not Supported:服务器不支持请求报文使用的HTTP协议版本