http协议详解

来源:互联网 发布:桌面设计软件 编辑:程序博客网 时间:2024/05/20 13:11

这篇博文是从腾讯实习生(后台开发c++)面试那里吸取的经验。因为在腾讯实习面试前没有准备有关http相关的知识点。到了二面彻底跪了,完全不知道http相关的东西。在这里也提醒下广大同学,如果想要去腾讯实习或者工作的c++方向的,那么c++网络编程这块知识必须掌握,TCP、IP、HTTP这些必须的。今天在这里我就对http相关的知识点做一个总结。

1.http协议基本概念

http(hypertext transfer protocol),中文名叫作“超文本传输协议”,是一个应用层的协议,基于传输层的TCP协议来进行数据传输的(传输的数据包括文本、图片、HTML文件等)。也就是说我们想要使用一个http协议传出数据时,要使用TCP建立连接。

2. http协议的基本工作原理

http协议是基于request/response(请求/应答)模式工作的。我们使用的最多的http协议的服务就是使用浏览器通过一个URL(网址)访问某个网页这一个动作。在这个动作中浏览器就是一个客户端进程,我们访问的网页就相当于一个服务端进程。具体的数据传输过程如下:

1)首先使用TCP三次握手建立客户端与服务器端的连接;

2)客户端(浏览器)使用URL向服务器端发送http请求报文;

3)服务器(apache服务器)端会根据客户端发来的请求返回一个http应答报文;

4)通过四次挥手释放TCP连接。这是http协议的大致工作流程;

http默认端口号为80,FTP默认端口号为21,Telnet默认端口号为23.

3. http请求报文格式

http请求报文主要包括四部分:请求行、请求头、空行、请求体

请求方法     请求的URI    HTTP/版本(请求行)

头部字段名:   字段值(请求头)

...

头部字段名:   字段值(请求行)


请求体

以上是http请求报文的基本格式,下面我们对其进行仔细的分析。

1)请求行

http1.0中请求报文有三个方法:GET、POST、HEAD

GET方法:用于获取URI所指定的数据。GET仅仅是获取,相当于数据库中的查询操作,不会对服务器上的数据进行修改。

HEAD方法:类似于GET方法,但是仅仅获取请求资源的首部。

                    用途:用于探测URI标示的服务器是否存在;

                               用于探测URI标识的服务器的可访问性;

POST方法:用于向服务器提交数据,将http请求报文中body部分的数据提交到服务器上,相当于数据库中的“增”操作。回帖评论时,将回复的内容放在请求报文的body中,

                    使用POST方法将回复内容发送给服务器。将图片、简历等文件上传到服务器都是使用的POST方法。

http1.1中新增了5个方法:PUT、DELETE、CONNECT、OPTIONS、TRACE


请求的URI是指我们想要访问的资源所在的地址;

2)请求头

请求头中可以有多个字段,每个字段的格式如下,

字段名: 字段值

常用请求报文的请求头字段如下


3)请求体

只有POST方法会有请求体,使用POST方法的http请求报文会将请求体的内容上传到服务器上。

Question:在http请求报文中GET方法和POST方法的对比:

1、GET方法实际是从服务器取数据,相当于查询操作,不会修改服务器上的数据。而POST方法实际是向服务器发送数据,相当于增操作,修改了服务器上的数据。

也就是说GET方法的报文相当于向服务器发送索取数据的请求。POST方法相当于向服务器提交数据的请求。

2、Get方法通过URL请求来传递用户的输入。Post方法通过另外的形式。 

GET请求的数据会附在URL之后(就是把数据放置在HTTP协议头中),以?分割URL和传输数据,参数之间以&相连,如:login.action?name=hyddd&password=idontknow&verify=%E4%BD%A0%E5%A5%BD。

使用GET方法时,请求参数和对应的值附加在URL后面,利用一个问号(“?”)代 表URL的结尾与请求参数的开始;使用“&”连接参数。例如,/index.jsp?id=100&op=bind

POST把提交的数据则放置在是HTTP包的包体中。

3、服务端获取GET请求参数用Request.QueryString,获取POST请求参数用Request.Form。

4、"GET方式提交的数据最多只能是1024字节,理论上POST没有限制,可传较大量的数据。

首先是"GET方式提交的数据最多只能是1024字节",因为GET是通过URL提交数据,那么GET可提交的数据量就跟URL的长度有直接关系了。而实际上,URL不存在参数上限的问题HTTP协议规范没有对URL长度进行限制。这个限制是特定的浏览器及服务器对它的限制。IE对URL长度的限制是2083字节。

5、POST的安全性要比GET的安全性高。

通过GET提交数据,用户名和密码将明文出现在URL上,因为(1)登录页面有可能被浏览器缓存,(2)其他人查看浏览器的历史纪录,那么别人就可以拿到你的账号和密码了。

4. http响应报文格式

http响应报文主要包括四部分:状态行、响应头、空行、响应体

HTTP/版本号   状态码   状态描述符(状态行)

字段名:  字段值(响应头)

...

字段名:  字段值(相应头)


响应体

1)状态行

版本号有:1.0、1.1

状态码大致有5类,分别是以1,2,3,4,5开头的三位数。详细的状态码如下


常见HTTP状态码:

  • 200——请求成功
  • 301——资源(网页等)被永久转移到其他URL
  • 302——跳转,跳转地址通过响应头中的Location属性指定
  • 400——客户端请求有语法错误,不能被服务器识别
  • 403——服务器收到请求,但是拒绝提供服务(认证失败)
  • 404——请求的资源(网页等)不存在
  • 500——内部服务器错误
  • 503——服务器当前不能够处理客户端的请求,在一段时间之后,服务器可能会恢复正常
2)响应头
常见的响应报文头部字段如下