我爱编程

理解http协议

2017-02-04  本文已影响171人  maxwellyue

1、HTTP概念

1.1 什么是HTTP
1.2 HTTP的版本

2、请求消息(Request)和响应消息(Response)

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

GET和POST的区别

1、GET提交的数据会放在URL之后,以?分割URL和传输数据,参数之间以&相连,如EditPosts.aspx?name=test1&id=123456. 而POST方法是把提交的数据放在HTTP包的请求体中。
2、GET提交的数据大小有限制,最多只能有1024字节(因为浏览器对URL的长度有限制),而POST方法提交的数据没有限制。
3、GET方式需要使用Request.QueryString来取得变量的值,而POST方式通过Request.Form来获取变量的值。
4、GET方式提交数据,会带来安全问题,比如一个登录页面,通过GET方式提交数据时,用户名和密码将出现在URL上,如果页面可以被缓存或者其他人可以访问这台机器,就可以从历史记录获得该用户的账号和密码。

2.2 响应消息(Response)

3、HTTP状态码

状态码 含义
100~199 表示成功接收请求,要求客户端继续提交下一次请求才能完成整个处理过程
200~299 表示成功接收请求并已完成整个处理过程
300~399 为完成请求,客户需进一步细化请求。例如,请求的资源已经移动一个新地址
400~499 客户端的请求有错误
500~599 服务器端的请求有错误
状态码 含义
200 表示一切正常,返回的是正常请求结果
204 No content,服务器已正确处理,但是响应实体中没有主体;
206 Partial content,对于请求头中包含 content-range 字段的,响应一部分数据;
302 指出被请求的文档已被临时移动到别处,此文档的新的URL在Location响应头中给出。
304 表示客户机缓存的版本是最新的,客户机可以继续使用它,无需到服务器请求。
400 Bad request,请求报文中有语法错误。
401 Unauthorized,请求需要 HTTP 认证(BASIC / DIGEST 认证,请求头中应包含 www-authenticate 字段)。
403 Forbidden,请求的资源被服务器拒绝了;
404 服务器上不存在客户机所请求的资源。
500 服务器端的程序发生错误
503 Service unavailable,服务器处于超负载状态或者正在进行停机维护,现在无法处理请求

4、关于无状态协议

从HTTP/1.1起,默认都开启了Keep-Alive,保持连接特性,简单地说,当一个网页打开完成后,客户端和服务器之间用于传输HTTP数据的TCP连接不会关闭,如果客户端再次访问这个服务器上的网页,会继续使用这一条已经建立的连接。Keep-Alive不会永久保持连接,它有一个保持时间,可以在不同的服务器软件中设定这个时间

5、关于TCP连接

http连接.png

第一次握手:客户端发送syn包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确认;
第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态;
第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。
</br>也可以这样来理解:在客户端和服务器之间建立正常的TCP网络连接时,客户端首先发出一个SYN消息,服务器使用SYN+ACK应答表示接收到了这个消息,最后客户端再以ACK消息响应。
</br>名词解释
SYN:synchronous,TCP/IP建立连接时使用的握手信号,非常小的一种数据包。
ACK:Acknowledgement,确认字符,在数据通信中,接收站发给发送站的一种传输类控制字符,表示发来的数据已确认接收无误。
</br>为什么要三次,两次不行吗?
这是为了为了防止已失效的连接请求报文段突然又传送到了服务端,因而产生错误,主要目的防止server端一直等待,浪费资源。
</br>比如:client发出的第一个连接请求报文段并没有丢失,而是在某个网络结点长时间的滞留了,以致延误到连接释放以后的某个时间才到达server。本来这是一个早已失效的报文段。但server收到此失效的连接请求报文段后,就误认为是client再次发出的一个新的连接请求。于是就向client发出确认报文段,同意建立连接。假设不采用“三次握手”,那么只要server发出确认,新的连接就建立了。由于现在client并没有发出建立连接的请求,因此不会理睬server的确认,也不会向server发送数据。但server却以为新的运输连接已经建立,并一直等待client发来数据。这样,server的很多资源就白白浪费掉了。采用“三次握手”的办法可以防止上述现象发生。例如刚才那种情况,client不会向server的确认发出确认。server由于收不到确认,就知道client并没有要求建立连接。
参考TCP为什么需要3次握手

第一次挥手:客户端发送一个FIN,用来关闭客户端到服务器的数据传送;
第二次挥手:服务器收到这个FIN,它发回一个ACK;
第三次挥手:服务器关闭与客户端的连接,发送一个FIN给客户端;
第四次挥手:客户端发回ACK报文确认;
</br>为什么要四次?
因为TCP有个半关闭状态,假设A.B要释放连接,那么A发送一个释放连接报文给B,B收到后发送确认,这个时候A不发数据,但是B如果发数据A还是要接受,这叫半关闭。然后B还要发给A连接释放报文,然后A发确认,所以是4次。

6、HTTP的缓存机制(待补充)

7、关于HTTPS(待补充)

关键字:安全

上一篇下一篇

猜你喜欢

热点阅读