关于Http协议的一些知识点

 

1.Http简介

  HTTP(HyperText Transfer Protocol):超文本传输协议,是基于www文件传输所遵守的一种协议,初始目的是为了提供一种发布和接收HTML页面的方法。

  HTTP是一个基于TCP/IP通信协议来传递数据(HTML 文件, 图片文件, 查询结果等),主要在7层架构中的应用层,默认HTTP的端口号为80,HTTPS的端口号为443。

2.主要特点

  1.HTTP协议是无状态的

  就是说每次HTTP请求都是独立的,任何两个请求之间没有什么必然的联系。但是在实际应用当中并不是完全这样的,引入了Cookie和Session机制来关联请求。

  2.无连接

  无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接,采用这种方式可以节省传输时间。(当今多数服务器支持Keep-Alive功能,使用服务器支持长连接,解决无连接的问题)

  3.基于TCP协议

  HTTP协议目的是规定客户端和服务端数据传输的格式和数据交互行为,并不负责数据传输的细节。底层是基于TCP实现的。现在使用的版本当中是默认持久连接的,也就是多次HTTP请求使用一个TCP连接。

3.主要请求URL组成部分

  HTTP使用统一资源标识符(Uniform Resource Identifiers, URI)来传输数据和建立连接。

  http://www.abc.com:8080/def/index.jsp?id=58&page=1#name

  

  1.协议部分:该URL的协议部分为“http:”,这代表网页使用的是HTTP协议。在Internet中可以使用多种协议,如HTTP,FTP等等本例中使用的是HTTP协议。在"HTTP"后面的“//”为分隔符

  2.域名部分:该URL的域名部分为“www.abc.com”。一个URL中,也可以使用IP地址作为域名使用

  3.端口部分:跟在域名后面的是端口,域名和端口之间使用“:”作为分隔符。端口不是一个URL必须的部分,如果省略端口部分,将采用默认端口

  4.虚拟目录部分:从域名后的第一个“/”开始到最后一个“/”为止,是虚拟目录部分。虚拟目录也不是一个URL必须的部分。本例中的虚拟目录是“/def/”

  5.文件名部分:从域名后的最后一个“/”开始到“?”为止,是文件名部分,如果没有“?”,则是从域名后的最后一个“/”开始到“#”为止,是文件部分,如果没有“?”和“#”,那么从域名后的最后一个“/”开始到结束,都是文件名部分。本例中的文件名是“index.jsp”。文件名部分也不是一个URL必须的部分,如果省略该部分,则使用默认的文件名

  6.锚部分:从“#”开始到最后,都是锚部分。本例中的锚部分是“name”。锚部分也不是一个URL必须的部分

  7.参数部分:从“?”开始到“#”为止之间的部分为参数部分,又称搜索部分、查询部分。本例中的参数部分为“id=58&page=1”。参数可以允许有多个参数,参数与参数之间用“&”作为分隔符。

          (原文:http://blog.csdn.net/ergouge/article/details/8185219 )

4.Http的三次握手四次挥手

 1.三次握手

  Http是基于tcp传输控制协议的。

  TCP是主机对主机层的传输控制协议,提供可靠的连接服务,采用三次握手确认建立一个连接:

    位码即tcp标志位,有6种标示:SYN(synchronous建立联机) ACK(acknowledgement 确认) PSH(push传送) FIN(finish结束) RST(reset重置) URG(urgent紧急)Sequence number(顺序号码) Acknowledge number(确认号码)

  三次握手

  (1)第一次握手:主机A发送位码为syn=1,随机产生seq number=1234567的数据包到服务器,主机B由SYN=1知道,A要求建立联机;

  (2)第二次握手:主机B收到请求后要确认联机信息,向A发送ack number=(主机A的seq+1),syn=1,ack=1,随机产生seq=7654321的包

  (3)第三次握手:主机A收到后检查ack number是否正确,即第一次发送的seq number+1,以及位码ack是否为1,若正确,主机A会再发送ack number=(主机B的seq+1),ack=1,主机B收到后确认seq值与ack=1则连接建立成功。

   完成三次握手,主机A与主机B开始传送数据。

 2.四次挥手

  由于TCP连接是全双工的,因此每个方向都必须单独进行关闭。这个原则是当一方完成它的数据发送任务后就能发送一个FIN来终止这个方向的连接。收到一个 FIN只意味着这一方向上没有数据流动,一个TCP连接在收到一个FIN后仍能发送数据。首先进行关闭的一方将执行主动关闭,而另一方执行被动关闭。 

    四次挥手

  CP的连接的拆除需要发送四个包,因此称为四次挥手(four-way handshake)。客户端或服务器均可主动发起挥手动作,在socket编程中,任何一方执行close()操作即可产生挥手操作。

  (1)客户端A发送一个FIN,用来关闭客户A到服务器B的数据传送。 

  (2)服务器B收到这个FIN,它发回一个ACK,确认序号为收到的序号加1。和SYN一样,一个FIN将占用一个序号。 

  (3)服务器B关闭与客户端A的连接,发送一个FIN给客户端A。 

  (4)客户端A发回ACK报文确认,并将确认序号设置为收到序号加1。

    (原文:https://www.cnblogs.com/Jessy/p/3535612.html

5.Http请求方式

  1.GET:获取资源

  GET方法用来请求访问已被URI识别的资源。也就是指定了服务器处理请求之后响应的内容。

  2.POST:传输实体主体

  POST方法用来传输实体主体。POST与GET的区别之一就是目的不同,二者之间的区别会在文章的最后详细说明。虽然GET方法也可以传输,但是一般不用,因为GET的目的是获取,POST的目的是传输。

  3.PUT:传输文件

  PUT方法用来传输文件。类似FTP协议,文件内容包含在请求报文的实体中,然后请求保存到URL指定的服务器位置。

  4.HEAD:获得报文首部

  HEAD方法类似GET方法,但是不同的是HEAD方法不要求返回数据。用于确认URI的有效性及资源更新时间等。

  5.DELETE:删除文件

  DELETE方法用来删除文件,是与PUT相反的方法。DELETE是要求返回URL指定的资源。

  6.OPTIONS:询问支持的方法

  因为并不是所有的服务器都支持规定的方法,为了安全有些服务器可能会禁止掉一些方法例如DELETE、PUT等。那么OPTIONS就是用来询问服务器支持的方法。

  7.TRACE:追踪路径

  TRACE方法是让Web服务器将之前的请求通信环回给客户端的方法。这个方法并不常用。

  8.CONNECT:要求用隧道协议连接代理

  CONNECT方法要求在与代理服务器通信时建立隧道,实现用隧道协议进行TCP通信。主要使用SSL/TLS协议对通信内容加密后传输。

  汇总:

      

6.状态码

  状态码是用来告知客户端服务器端处理请求的结果。凭借状态码用户可以知道服务器是请求处理成功、失败或者是被转发;这样出现了错误也好定位。状态码是由3位数字加原因短语组成。3位数字中的第一位是用来指定状态的类别。共有5种。

      

  常用的状态码:

  (1)200:请求成功。

  (2)302:Found-----》代表临时重定向。该状态码表示请求的资源已经被分配了新的URL,但是和301的区别是302代表的不是永久性的移动,只是临时的。就是说这个URL还可能会发生改变。如果保存成书签了也不会更新。

  (3)400:Bad Request----》表示请求报文中存在语法错误。需要修改后再次发送。

  (4)403:Forbidden----》表明请求访问的资源被拒绝了。没有获得服务器的访问权限,IP被禁止等。

  (5)404:Not Found----》表明请求的资源在服务器上找不到。当然也可以在服务器拒绝请求且不想说明理由时使用。

  (6)500:Internal Server Error----》表明服务器端在执行请求时发生了错误,很有可能是服务端程序的Bug或者临时故障。

  (7)503:Service Unavailable----》表明服务器暂时处于超负载或正在进行停机维护,现在无法处理请求。如果事先得知解除以上状况需要的时间,最好写入Retry-After字段再返回给客户端。

  (8)504:Getaway Timeout----》网关超时,是代理服务器等待应用服务器响应时的超时,和408 Request Timeout的却别就是504是服务器的原因而不是客户端的原因。

7.常见问题及解答

  1.GET和POST的区别

    A. 从字面意思和HTTP的规范来看,GET用于获取资源信息而POST是用来更新资源信息。

    B. GET提交请求的数据实体会放在URL的后面,用?来分割,参数用&连接,举个栗子:/index.html?name=wang&login=1

    C. GET提交的数据长度是有限制的,因为URL长度有限制,具体的长度限制视浏览器而定。而POST没有。

    D. GET提交的数据不安全,因为参数都会暴露在URL上。

  2.Cookie和Session的区别和联系

    Cookie和Session都是为了保存客户端和服务端之间的交互状态,实现机制不同,各有优缺点。

    首先一个最大的区别就是Cookie是保存在客户端而Session就保存在服务端的。

    Cookie是客户端请求服务端时服务器会将一些信息以键值对的形式返回给客户端,保存在浏览器中,交互的时候可以加上这些Cookie值。用Cookie就可以方便的做一些缓存。

    Cookie的缺点是大小和数量都有限制;Cookie是存在客户端的可能被禁用、删除、篡改,是不安全的;Cookie如果很大,每次要请求都要带上,这样就影响了传输效率。

    Session是基于Cookie来实现的,不同的是Session本身存在于服务端,但是每次传输的时候不会传输数据,只是把代表一个客户端的唯一ID(通常是JSESSIONID)写在客户端的Cookie中,这样每次传输这个ID就可以了。

    Session的优势就是传输数据量小,比较安全。

    但是Session也有缺点,就是如果Session不做特殊的处理容易失效、过期、丢失或者Session过多导致服务器内存溢出,并且要实现一个稳定可用安全的分布式Session框架也是有一定复杂度的。在实际使用中就要结合Cookie和Session的优缺点针对不同的问题来设计解决方案。

  3.为什么是三次握手,不是二次或四次

    不是两次,为了保证传输的可靠。

      第一次握手CLIENT告诉SERVER“我将要开始传输数据了”。

      第二次握手SERVER告诉CLIENT“我已经知道你将要传输数据了,我已经做好准备”。

      第三次握手CLIENT告诉SERVER“我已经知道你已经知道”

    不是四次,为了提高传输的效率

      总之不管多少次握手,总会有一方不知道对方已经知道。因此为了传输效率,只要3次握手就认为已经可以开始传输数据,三次握手之后,CLIENT和SERVER就进入ESTABLISHED状态,开始数据传输。

  4.Http与Https优缺点?

    (1).通信使用明文不加密,内容可能被窃听,也就是被抓包分析

    (2).不验证通信方身份,可能遭到伪装

    (3).无法验证报文完整性,可能被篡改

    Https就是Http加上加密处理(一般是SSL安全通信线路)+认证+完整性保护

   5.Http发送请求都包括什么 

    客户端发送一个HTTP请求到服务器的请求消息(Request)包括以下格式:请求行(request line)、请求头部(header)、空行和请求数据四个部分组成。

   一般情况下,服务器接收并处理客户端发过来的请求(Respones)后会返回一个HTTP的响应消息。HTTP响应也由四个部分组成,分别是:状态行、消息报头、空行和响应正文。

 

 

    

posted @ 2018-05-02 15:10  蓝空飞翔  阅读(229)  评论(0编辑  收藏  举报