欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

HTTP协议相关知识

程序员文章站 2024-03-20 15:16:46
...

1.TCP/IP协议

协议:即规则(客户端与服务器端之间通信的规则)

1.1.简介

1>.互联网的关键技术就是TCP/IP协议.两台计算机之间的通信是通过TCP/IP协议在因特网上进行的.实际上这个是两个协议;

  • TCP(Transmission Control Protocol):传输控制协议;
  • IP(Internet Protocol):网际协议;

2>.TCP/IP协议就是TCP和IP两个协议在一起协同工作,有上下层次的关系.

  • TCP负责应用软件(比如你的浏览器)和网络软件之间的通信;IP负责计算机之间的通信;
  • TC负责将数据分割并装入IP 包;IP负责将包发送至接受者,传输过程要经IP路由器负责根据通信量、网络中的错误或者其他参数来进行正确地寻址,然后在它们到达的时候重新组合它们;

3>.在TCP/IP 协议内部包含一系列用于处理数据通信的协议:

  • TCP(传输控制协议) //应用程序之间通信
  • UDP(用户数据报协议) //应用程序之间的简单通信
  • IP(网际协议) //计算机之间的通信
  • ICMP(因特网消息控制协议) //针对错误和状态
  • DHCP(动态主机配置协议) //针对动态寻址

4>.TCP/IP协议模型
HTTP协议相关知识

1.2.IP协议:用于计算机之间的通信

1>.IP协议是计算机用来相互识别的通信的一种机制,每台计算机都有一个IP.用来在internet上标识这台计算机.IP负责在因特网上发送和接收数据包.通过IP,消息(或者其他数据)被分割为小的独立的包,并通过因特网在计算机之间传送.IP负责将每个包路由至它的目的地;

2>.IP协议仅仅是允许计算机相互发消息,但它并不检查消息是否以发送的次序到达而且没有损坏(只检查关键的头数据).为了提供消息检验功能,直接在IP协议上设计了传输控制协议TCP;

3>.IP路由器:当一个IP包从一台计算机被发送,它会到达一个IP路由器,IP路由器负责将这个包路由至它的目的地,直接地或者通过其他的路由器;在一个相同的通信中,一个包所经由的路径可能会和其他的包不同.而路由器负责根据通信量、网络中的错误或者其他参数来进行正确地寻址;

4>.IP是无连接的通信协议.它不会占用两个正在通信的计算机之间的通信线路.这样,IP 就降低了对网络线路的需求.每条线可以同时满足许多不同的计算机之间的通信需要;


1.3.TCP协议:应用程序之间的通信

1>.TCP协议用于从应用程序到网络的数据传输控制.TCP负责在数据传送之前将它们分割为 IP包,然后在它们到达的时候将它们重组;

2>.TCP协议确保数据包以正确的次序到达,并且尝试确认数据包的内容没有改变.TCP在IP地址之上引用端口(port),它允许计算机通过网络提供各种服务.一些端口号为不同的服务保留,而且这些端口号是众所周知,例如Apach服务默认的端口是80,MySQL数据库服务默认的端口是3306;

3>.服务或者守护进程.在提供服务的机器上,会有程序(/进程)监听特定端口上的通信流.例如大多数电子邮件通信流出现在端口25上,用于wwww的HTTP通信流出现在80端口上;

4>.当应用程序希望通过TCP协议与另一个应用程序通信时,它会发送一个通信请求.这个请求必须被送到一个确切的地址.在双方"握手"之后,TCP将在两个应用程序之间建立一个全双工(full-duplex)的通信,占用两个计算机之间整个的通信线路,直到它被一方或双方关闭为止,因此TCP是使用固定的连接通信的协议;


1.4.TCP三次握手(双向建立链接)

1>.在TCP/IP协议中,TCP协议采用三次握手建立一个链接,如下图:
HTTP协议相关知识
2>.TCP协议中几个重要术语:

①.序号:seq序号,占32位,用来标识从TCP源端向目的端发送的字节流,发起方发送数据时对此进行标记;
②.确认序号:ack序号,占32位,只有ACK标志位为1时,确认序号字段才有效:ack=seq+1;
③.标志位:共6个,即URG、ACK、PSH、RST、SYN、FIN等,具体含义如下:

  • URG:紧急指针(urgent pointer)有效;
  • ACK:确认序号有效;
  • PSH:接收方应该尽快将这个报文交给应用层;
  • RST:重置连接;
  • SYN:发起一个新连接;
  • FIN:释放一个连接;

    注意:
  • 不要将确认序号ack与标志位中的ACK搞混了;
  • 确认方确认序号ack=发起方Req+1,两端配对;

3>.流程说明:

①.首先Client端发送连接请求报文,Server端接受连接后回复ACK报文,并为这次连接分配资源.Client端接收到ACK报文后也向Server端发生ACK报文,并分配资源,这样TCP连接就建立了;

②.最初两端的TCP进程都处于CLOSED关闭状态,Client端主动发送请求,所以Client端主动打开连接,而Server端被动打开连接.(A、B关闭状态CLOSED——B收听状态LISTEN——A同步已发送状态SYN-SENT——B同步收到状态SYN-RCVD——A、B连接已建立状态ESTABLISHED);

③.Server端的TCP服务器进程先创建传输控制块TCB,准备接受客户进程的连接请求.然后服务器进程就处于LISTEN(收听)状态,等待客户的连接请求.若有,则作出响应;

具体流程如下:

  • 第一次握手: Client端的TCP客户进程也是首先创建传输控制块TCB,然后向Client发出连接请求报文段(首部的同步位SYN=1,初始序号seq=x;注意:SYN=1的报文段不能携带数据,但要消耗掉一个序号),此时TCP客户进程进入SYN-SENT(同步已发送)状态;
  • 第二次握手: Server端收到Client端的连接请求报文段后,如同意建立连接,则向Client端发送确认,在确认报文段中(SYN=1,ACK=1,确认号ack=x+1,初始序seq=y),测试TCP服务器进程进入SYN-RCVD(同步收到)状态;
  • 第三次握手:Client端的TCP客户进程收到Server端的确认后,要向Server端给出确认报文段(ACK=1,确认号ack=y+1,序号seq=x+1;注意初始序号为seq=x,第二个报文段所以要在原来的基础上+1),此时ACK报文段可以携带数据,不携带数据则不消耗序号.此时TCP连接已经建立,Client端进入ESTABLISHED(已建立连接);当Server端收到Client端的确认后,也进入ESTABLISHED状态;

    TCB传输控制块Transmission Control Block,存储每一个连接中的重要信息,如TCP连接表,到发送和接收缓存的指针,到重传队列的指针,当前的发送和接收序号;

    注意:服务器的资源是在完成第二次握手时分配的,而客户端的资源是在第三次完成握手时分配的,这就使得服务器易于受到SYN洪泛攻击;

例如:小明要给小红发送数据:

  • ①.小明发送信息告诉小红,我要发送一条数据给你;
  • ②.小红接到小明的信息之后,告诉小明,可以发数据过来;
  • ③.小明接到小红的确认信息,知道小红可以正常接收数据,然后通知小明,马上将数据发过去然后小明正式发送数据给小红;

#扩展:

1>.为什么Client端还要发送一次确认呢?可以二次握手吗?

主要为了防止已失效的连接请求报文段突然又传送到了Server端,因而产生错误.假如Client端发出连接请求,但因连接请求报文丢失而未收到确认,于是Client端再重发一次连接请求,后来收到了确认,建立了连接.数据传输完毕后,就释放了连接.Client端共发出了两个连接请求报文段,其中第一个丢失,第二个到达了Server端,但是第一个丢失的报文段只是在某些网络结点长时间滞留了,延误到连接释放以后的某个时间才到达Server端,此时Server端误认为Client端又发出一次新的连接请求,于是就向Client端发出确认报文段,同意建立连接.如果不采用三次握手,那么只要Server端发出确认,就建立新的连接了,此时Client端不理睬Server端的确认且不发送数据,则Server端一直等待Client端发送数据,非常浪费资源;

2>.SYN攻击

在三次握手过程中,Server发送SYN-ACK之后,收到Client的ACK之前的TCP连接称为半连接(half-open connect),此时Server处于SYN_RCVD状态,当收到ACK后,Server转入ESTABLISHED状态.SYN攻击就是Client在短时间内伪造大量不存在的IP地址,并向Server不断地发送SYN包,Server回复确认包,并等待Client的确认,由于源地址是不存在的,因此,Server需要不断重发直至超时,这些伪造的SYN包将长时间占用未连接队列,导致正常的SYN请求因为队列满而被丢弃,从而引起网络堵塞甚至系统瘫痪.SYN攻击时一种典型的DDOS攻击,检测SYN攻击的方式非常简单,即当Server上有大量半连接状态且源IP地址是随机的,则可以断定遭到SYN攻击了,使用如下命令可以让之现行:

# netstat -nap | grep SYN_RECV

3>.Server端易受到SYN攻击?

服务器端的资源分配是在二次握手时分配的,而客户端的资源是在完成三次握手时分配的,所以服务器容易受到SYN洪泛攻击,SYN攻击就是Client在短时间内伪造大量不存在的IP地址,并向Server不断地发送SYN包,Server则回复确认包,并等待Client确认,由于源地址不存在,因此Server需要不断重发直至超时,这些伪造的SYN包将长时间占用未连接队列,导致正常的SYN请求因为队列满而被丢弃,从而引起网络拥塞甚至系统瘫痪;

防范SYN攻击措施: 降低主机的等待时间使主机尽快的释放半连接的占用,短时间受到某IP的重复SYN则丢弃后续请求;


1.5.TCP协议四次挥手(双方关闭链接)

1>.由于TCP连接时全双工的,因此,每个方向都必须要单独进行关闭,这一原则是当一方完成数据发送任务后,发送一个FIN来终止这一方向的连接,收到一个FIN只是意味着这一方向上没有数据流动了,即不会再收到数据了,但是在这个TCP连接上仍然能够发送数据,直到这一方向也发送了FIN.首先进行关闭的一方将执行主动关闭,而另一方则执行被动关闭;

如图:
HTTP协议相关知识

2>.流程说明:

①.假设Client端发起中断连接请求,也就是发送FIN报文.Server端接到FIN报文后,意思是说"Client端没有数据要发给Server端了",但是如果Server端还有数据没有发送完成,则不必急着关闭Socket,可以继续发送数据.所以Server端先发送ACK,“告诉Client端,你Client端的请求我Server端收到了,但是我Server端还没准备好,请你client端继续等我的消息”.这个时候Client端就进入FIN_WAIT状态,继续等待Server端的FIN报文;当Server端确定数据已发送完成,则向Client端发送FIN报文,“告诉Client端,好了,我Server端这边数据发完了,准备好关闭连接了”;Client端收到FIN报文后就知道可以关闭连接了,但是他还是不相信网络,怕Server端不知道要关闭,所以发送ACK后进入TIME_WAIT状态,如果Server端没有收到Client端的ACK则Client端可以重传,当Server端收到ACK后,就知道可以断开连接了;此时Client端等待了2MSL后依然没有收到回复,则证明Server端已正常关闭,那好,我Client端也可以关闭连接了.Ok,TCP连接就这样关闭了!

②.数据传输结束后,通信的双方都可释放连接,Client端和Server端都处于ESTABLISHED状态.(A、B连接建立状态ESTABLISHED——A终止等待1状态FIN-WAIT-1——B关闭等待状态CLOSE-WAIT——A终止等待2状态FIN-WAIT-2——B最后确认状态LAST-ACK——A时间等待状态TIME-WAIT——B、A关闭状态CLOSED);

具体流程如下:

  • 第一次挥手:Client端的应用进程通过TCP连接向Server端发出连接释放报文段(FIN=1,序号seq=u,注意:TCP规定,FIN报文段即使不携带数据,也要消耗一个序号;),申请关闭TCP连接,并且停止发送数据,然后Client进入FIN-WAIT-1(终止等待1)状态,等待Server端的确认;
  • 第二次挥手:Server端收到Client端发送过来的连接释放报文段后,立即向Client端发出确认报文段(ACK=1,确认号ack=u+1,序号seq=v),然后Server端进入CLOSE-WAIT(关闭等待)状态.Client端收到Server端的确认后,进入FIN-WAIT-2(终止等待2)状态,等待B发出的连接释放报文段;此时TCP连接处于半关闭状态,即Client端到Server端的连接释放,Client端不再向Server发送数据,但是可以接收.而服务器端仍会继续发送;
  • 第三次挥手:若Server端没有要向Client端发出的数据了,那么Server端会再向Client端发出连接释放报文段(FIN=1,ACK=1,序号seq=w,确认号ack=u+1),申请关闭TCP连接,然后Server端进入LAST-ACK(最后确认)状态,等待Client端的确认;
  • 第四次挥手:Client端收到Server端的连接释放报文段后,向Server端发出确认报文段(ACK=1,seq=u+1,ack=w+1),然后Client端进入TIME-WAIT(时间等待)状态.Server端接收到Client端的确认报文段之后进入CLOSED状态;此时Client端的TCP连接还未关闭,需要经过时间等待计时器设置的时间2MSL后,Client才进入CLOSED状态;

#扩展:

1>.为什么建立连接是三次握手,而关闭连接却是四次挥手呢?

因为Server在LISTEN状态下,当Server端收到Client端的SYN连接请求报文后,可以直接发送SYN+ACK报文给客户端.其中ACK报文是用来应答的,SYN报文是用来同步的.但是关闭连接时,当Server端收到FIN报文时,仅仅表示Client不再发送数据了但是还能接收数据,且Server也未必全部数据都发送给Client了,此时很可能并不会立即关闭SOCKET,所以只能先回复一个ACK报文,告诉Client端,“你发的FIN报文我收到了”.只有等到我Server端所有的报文都发送完了,我才能发送FIN报文,因此不能一起发送.故需要四步握手.

2>.为什么TIME_WAIT状态需要经过2MSL(最大报文段生存时间)才能返回到CLOSE状态?

虽然按道理,四个报文都发送完毕,我们可以直接进入CLOSE状态了,但是我们必须假象网络是不可靠的,有可以最后一个ACK丢失.所以TIME_WAIT状态就是用来重发可能丢失的ACK报文;

                           *更多TCP/IP相关的内容,请参考<<谢希仁著.计算机网络>>相关教材*

2.HTTP协议

2.1.简介

1>.HTTP协议即Hyper Text Transfer Protocol(超文本传输协议),一种详细规定了浏览器和万维网服务器之间互相通信的规则,通过因特网传送万维网文档的数据传送协议,也是因特网上应用最为广泛的一种网络传输协议,这个协议已经成为浏览器和Web站点通信之间的标准,所有的WWW文件都必须遵守这个标准.设计HTTP最初的目的是为了提供一种发布和接收HTML页面的方法;

2>.HTTP是一个基于TCP/IP通信协议来传递数据(HTML文件,图片文件,查询结果等);

3>.HTTP是一个属于应用层的面向对象的协议,由于其简捷、快速的方式,适用于分布式超媒体信息系统.它于1990年提出,经过几年的使用与发展,得到不断地完善和扩展;

4>.最早版本是1991年发布的HTTP/0.9版.该版本极其简单,只接受GET一种请求方法,没有在通讯中指定版本号,且不支持请求头.由于该版本不支持POST方法,所以客户端无法向服务器传递太多信息;目前版本是1997年1月发布的HTTP/1.1版本,该版本默认采用持久连接,并能很好地配合代理服务器工作.还支持以管道方式同时发送多个请求,以便降低线路负载,提高传输速度;
HTTP协议相关知识
5>.HTTP协议工作于客户端-服务端架构为上.浏览器作为HTTP客户端通过URL向HTTP服务端即WEB服务器发送所有请求.Web服务器根据接收到的请求后,向客户端发送响应信息;
HTTP协议相关知识
6>.HTTP默认端口号为80,但是也可以改为其他端口;


2.2.HTTP协议的主要特点

1>.简单快速:客户向服务器请求服务时,只需传送请求方法和路径.请求方法常用的有GET、HEAD、POST等.每种方法规定了客户与服务器联系的类型不同.由于HTTP协议简单,使得HTTP服务器的程序规模小,因而通信速度很快;

2>.灵活:HTTP允许传输任意类型的数据对象.正在传输的类型由"Content-Type"属性加以标记;

3>.无连接:无连接的含义是限制每次连接只处理一个请求.服务器处理完客户的请求,并收到客户的应答后,即断开连接.采用这种方式可以节省传输时间;

4>.无状态:HTTP协议是无状态协议.无状态是指协议对于事务处理没有记忆能力.缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大.另一方面,在服务器不需要先前信息时它的应答就较快;


2.3.HTTP协议报文格式

2.3.1.HTTP请求报文格式

1>.如图:
HTTP协议相关知识
2>.说明:HTTP请求由请求行(request line),请求头部(header),空行和请求数据四个部分组成;

①.第一部分:请求行

  • 用来说明请求类型,要访问的资源以及所使用的HTTP版本请求;
  • 请求行由请求方法字段、URL字段和HTTP协议版本字段3个字段组成,它们用空格(" ")分隔.例如,GET /index.html HTTP/1.1;

②.第二部分:请求头部

  • 紧接着请求行(即第一行)之后的部分,用来说明服务器要使用的附加信息;
  • 请求头部由关键字/值对组成,每行一对,关键字和值用英文冒号":"分隔.请求头部通知服务器有关于客户端请求的信息,典型的请求头有:
    • User-Agent:产生请求的浏览器类型;
    • Accept:客户端可识别的内容类型列表;
    • Host:请求的主机名,允许多个域名同处一个IP地址,即虚拟主机;

③.第三部分:空行

  • 最后一个请求头部之后是一个空行,请求头部后面的空行是必须的,发送回车符和换行符,通知服务器以下不再有请求头;

④.第四部分:请求数据也叫主体

  • 可以添加任意的其他数据;
  • 请求数据不在GET方法中使用,而是在POST方法中使用,POST方法适用于需要客户填写表单的场合,与请求数据相关的最常使用的请求头部是"Content-Type"和"Content-Length",用于指定请求数据的类型和长度;

2.3.2.HTTP响应报文格式

1>.如图:
HTTP协议相关知识
2>.说明:HTTP响应也由四个部分组成,分别是:状态行,响应头部,空行和响应内容;

①.第一部分:状态行

  • 由HTTP协议版本号,状态码,状态码描述3部分组成;

②.第二部分:响应头部

  • 与请求头部类似,也用来说明客户端要使用的一些附加信息;

③.第三部分:空行

  • 响应头部后面的空行是必须的,表示响应头部结束,接下来为响应正文;

④.第四部分:响应内容

  • 服务器返回给客户端的文本信息,最常见的为HTML网页;

2.4.HTTP协议中的状态码

1>.状态代码有三位数字组成,第一个数字定义了响应的类别,共分五种类别:

①.1xx: 指示信息–表示请求已接收,继续处理;
②.2xx: 成功–表示请求已被成功接收,理解,接受;
③.3xx: 重定向–要完成请求必须进行更进一步的操作;
④.4xx: 客户端错误–请求有语法错误或请求无法实现;
⑤.5xx: 服务器端错误–服务器未能实现合法的请求;

2>.常见状态码:

200 OK //客户端请求成功
400 Bad Request //客户端请求有语法错误,不能被服务器所理解
401 Unauthorized //请求未经授权,这个状态代码必须和WWW-Authenticate报头域一起使用
403 Forbidden //服务器收到请求,但是拒绝提供服务
404 Not Found //请求资源不存在(eg:输入了错误的URL)
500 Internal Server Error //服务器发生不可预期的错误
503 Server Unavailable //服务器当前不能处理客户端的请求,一段时间后可能恢复正常


2.5.HTTP协议中的请求方法

1>.根据HTTP标准,HTTP请求可以使用多种请求方法.其中,HTTP/1.0定义了三种请求方法:GET,POST和HEAD方法;HTTP/1.1新增了五种请求方法:OPTIONS,PUT,DELETE,TRACE和CONNECT 方法;

2>.每种请求方式代表的含义如下:

GET //请求指定的页面信息,并返回实体主体;
HEAD //类似于get请求,只不过返回的响应中没有具体的内容,用于获取报头;
POST //向指定资源提交数据进行处理请求(例如提交表单或者上传文件).数据被包含在请求体中.POST请求可能会导致新的资源的建立和/或已有资源的修改;
PUT //从客户端向服务器传送的数据取代指定的文档的内容;
DELETE //请求服务器删除指定的页面;
CONNECT //HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器;
OPTIONS //允许客户端查看服务器的性能;
TRACE //回显服务器收到的请求,主要用于测试或诊断;


2.6.HTTP协议工作原理

1>.HTTP协议定义Web客户端如何从Web服务器请求Web页面,以及服务器如何把Web页面传送给客户端.

  • HTTP协议采用了请求/响应模型.客户端向服务器发送一个请求报文,请求报文包含请求的方法、URL、协议版本、请求头部和请求数据.服务器以一个状态行作为响应,响应的内容包括协议的版本、成功或者错误代码、服务器信息、响应头部和响应数据;

2>.以下是一次基于HTTP协议的请求/响应的步骤:

①.客户端连接到Web服务器

  • 一个HTTP客户端,通常是浏览器,与Web服务器的HTTP端口(默认为80)建立一个TCP套接字连接.例如,www.bjschoolcms.com;

②.发送HTTP请求

  • 通过TCP套接字,客户端向Web服务器发送一个文本的请求报文,一个请求报文由请求行、请求头部、空行和请求数据4部分组成;

③.服务器接受请求并返回HTTP响应

  • Web服务器解析请求,定位请求资源.服务器将资源复本写到TCP套接字,由客户端读取.一个响应由状态行、响应头部、空行和响应数据4部分组成;

④.释放连接TCP连接

  • 若connection模式为close,则服务器主动关闭TCP连接,客户端被动关闭连接,释放TCP连接;若connection模式为keepalive,则该连接会保持一段时间,在该时间内可以继续接收请求;

⑤.客户端浏览器解析HTML内容

  • 客户端浏览器首先解析状态行,查看表明请求是否成功的状态代码.然后解析每一个响应头,响应头告知以下为若干字节的HTML文档和文档的字符集.最后客户端浏览器读取响应数据HTML,根据HTML的语法对其进行格式化,并在浏览器窗口中显示;

例如:在浏览器地址栏键入URL,按下回车之后会经历以下流程:

①.浏览器向DNS服务器请求解析该URL中的域名所对应的IP地址;
②.DNS服务器解析出IP地址后,根据该IP地址和默认端口80,与服务器建立TCP连接;
③.浏览器发出读取文件(URL中域名后面部分对应的文件)的HTTP请求,该请求报文作为TCP 三次握手的第三个报文的数据发送给服务器;
④.服务器对浏览器请求作出响应,并把对应的HTML文本发送给浏览器;
⑤.释放 TCP连接;
⑥.浏览器将该HTML文本并显示内容;


2.7.HTTP协议中GET和POST请求方式的区别

1>.GET请求例子:

GET /users/?sex=man&name=aa HTTP/1.1
Host: www.bjschoolcms.com
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.6) Gecko/20050225 Firefox/1.0.1
Connection: Keep-Alive
<空行>

2>.POST请求例子:

POST / HTTP/1.1
Host: www.bjschoolcms.com
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.6) Gecko/20050225 Firefox/1.0.1
Content-Type: application/x-www-form-urlencoded
Content-Length: 40
Connection: Keep-Alive
<空行>
name=aa&role=student

3>.说明:

①.GET和POST本质上都是TCP链接.所以它们本质上并没有区别;

②.Get是用来从服务器上获得数据,而 Post 是用来向服务器上传递数据;

③.GET提交的数据会放在URL之后,以?分割URL和传输数据,多个参数以&相连(如/users/?sex=man&name=aa),如果数据是英文字母/数字,原样发送,如果是空格,转换为"+",如果是中文/其他字符,则直接把字符串用BASE64加密;而POST方法是把提交的数据放在HTTP包的Body中;因此GET提交的数据会在地址栏中显示出来,而POST提交,地址栏不会改变;

④.GET提交的数据大小有限制(HTTP协议没有对传输的数据大小进行限制,HTTP协议规范也没有对URL长度进行限制,但是浏览器对URL的长度有限制),而POST方法提交的数据没有限制;

⑤.GET方式需要使用Request.QueryString来取得变量的值,而POST方式通过Request.Form来获取变量的值;

⑥.POST的安全性要比GET的安全性高.比如:通过GET请求方式提交数据,用户名和密码将明文出现在URL上,因为登录页面有可能被浏览器缓存,其他人查看浏览器的历史纪录,那么别人就可以拿到你的账号和密码了,除此之外,使用GET提交数据还可能会造成CSRF(Cross-site request forgery)跨站请求伪造攻击;而POST请求方式提交的数据不会被保存在浏览器历史或 web 服务器日志中;

其他区别如下图:
HTTP协议相关知识

2.8.HTTP协议是无连接的

1>.无连接的含义是限制每次连接只处理一个请求.服务器处理完客户的请求,并收到客户的应答后,即断开连接.采用这种方式可以节省传输时间;

举个例子来说,就是假如某个客户机在短时间多次次请求同一个资源,服务器并不能区别是否已经响应过用户的请求,反而每次都不耐其烦重新响应请求.我们都知道HTTP每次响应请求,则要发起一个到服务器的TCP连接,HTTP与服务器之间建立一个连接,而TCP建立连接涉及一个“三次握手”的过程.这针对大流量的的服务器来说,开销是相当大的.这说明是HTTP无状态带来的缺点,当然HTTP协议无状态也是有很多优点的;

2>.针对HTTP无连接,人们设计了非持久连接和持久连接.实际上关于HTTP协议非持久连接和持久连接是针对TCP协议的.当客户机/服务器的交互运行于TCP协议上时,应用程序的每个请求/响应对是经一个单独的TCP连接,则该应用程序使用非持久连接,而当应用程序的每个请求/响应对是经相同的TCP连接发送,则该应用程序使用持久连接;

3>.非持久连接:请求一个HTTP请求/响应需要的总时间为客户端发出建立连接和发生请求报文+服务器传输HTML文件的时间;

4>.持久连接:服务器在发送响应后,保持该TCP连接打开.在相同的客户机与服务器之间的后续请求和响应报文通过相同的连接进行传送.不需要再次建立TCP连接;


2.9.HTTP协议是无状态的

HTTP协议是无状态的,指的是HTTP协议对于事务处理没有记忆能力,客户端向服务端请求完数据之后,服务器不知道客户端是什么状态.也就是说,打开一个服务器上的网页和上一次打开这个服务器上的网页之间没有任何联系.HTTP是一个无状态的面向连接的协议,无状态不代表HTTP不能保持TCP连接,更不能代表HTTP使用的是UDP协议(无连接);


2.10.长链接,短连接?

1>.TCP连接.当网络通信使用TCP协议时,在真正的读写操作前,需要完成3次握手,来建立连接.当读写完成时,需要四次握手来释放连接,而每个连接的建立和释放都是需要资源和时间的;

2>.TCP短链接:客户端与服务器端通过三次握手双方建立连接,然后客户端向服务端发送数据,服务端回应客户端,这样一次读写就完成了,这时候双方任何一个都可以发close操作,不过一般都是客户端先发起close操作.为什么呢?一般服务器端不会回复完客户端后立即关闭连接的,当然不排除有特殊的情况.从上面的描述看,短连接一般只会在客户端/服务端之间传递一次读写操作;他的优点是管理起来比较简单,存在的连接都是有用的连接,不需要额外的控制手段;例如WEB网站的http服务一般都用短链接,因为长连接对于服务端来说会耗费一定的资源,而像WEB网站这么频繁的成千上万甚至上亿客户端的连接用短连接会更省一些资源,如果用长连接,而且同时有成千上万的用户,如果每个用户都占用一个连接的话,对资源消耗过大.所以并发量大,但每个用户无需频繁操作情况下需用短连好;

3>.TCP长连接:客户端与服务器端通过三次握手双方建立连接.客户端与服务端完成一次读写之后,它们之间的连接并不会主动关闭,后续的读写操作会继续使用这个长连接;长连接可以省去较多的TCP建立和关闭操作,减少资源的浪费,节约时间.长连接多用于操作频繁,点对点的通讯,而且连接数不能太多情况.由于每个TCP连接都需要三步握手,这需要时间,如果每个操作都是先连接再操作的话,那么处理速度会降低很多,所以每个操作完后都不断开,下次处理时直接发送数据包就OK了,不用建立TCP连接.例如:数据库的连接用长连接,如果用短连接频繁的通信会造成socket错误,而且频繁的socket创建和销毁也是对资源的浪费;

4>.HTTP协议的长连接和短连接,本质上是TCP层的长连接和短连接;

5>.在HTTP/1.0中默认使用短连接.也就是说,客户端和服务器每进行一次HTTP通信操作,都要建立一次连接,任务结束就中断连接.当客户端浏览器访问的某个HTML或其他类型的Web页中包含有其他的Web资源(如JavaScript文件、图像文件、CSS文件等),每遇到这样一个Web资源,浏览器就要重新建立一个HTTP连接;

6>.从HTTP/1.1起,默认使用长连接,用以保持连接特性.使用长连接的HTTP协议,会在``响应头加入这行代码:Connection:keep-alive;`在使用长连接的情况下,当一个网页打开完成后,客户端和服务器之间用于传输HTTP数据的TCP连接不会马上关闭,客户端再次访问这个服务器时,会继续使用这一条已经建立的长连接.Keep-Alive不会永久保持连接,它有一个保持时间,可以在不同的服务器软件(如Apache)中设定这个时间.实现长连接需要客户端和服务端都支持长连接;


3.RPC比HTTP请求快的原因

1>.HTTP使用HTTP协议,RPC使用TCP协议,比HTTP少了应用层,表示层,会话层,这3层;

2>.RPC使用长连接,当网络通信使用TCP协议时,在真正的读写操作前,需要完成3次握手,来建立连接.当读写完成时,需要四次握手来释放连接,每个连接的建立和释放都是需要资源和时间的,所以长连接比短连接更节省资源,效率更高;


4.HTTP协议和TCP/IP协议的关系

1>.HTTP是应用层协议,TCP协议是传输层协议,IP协议是网络协议;

2>.HTTP属于应用层协议,在传输层使用TCP协议,然后在网络层使用IP协议.IP协议主要解决网络路由和寻址问题;TCP协议主要解决如何在IP层之上可靠地传递数据包,使得网络上接收端收到发送端所发出的所有包,并且顺序与发送顺序一致,因此TCP协议是可靠的,面向连接的;