HTTP协议总结

概念
超文本传输协议http协议定义了浏览器如何向万维网服务器请求万维网文档,以及怎样把文档传送给浏览器。从层次来讲,HTTP是面向事务的应用层协议是www和浏览器交换文件的重要基础
操作过程
服务器端建立套接字(socket),命名套接字(bind)(sockfd>sin_port=htons(80)),创建监听队列(listen)之后等待浏览器发送HTTP请求报文,一旦监听到连接建立(connect)并经历三次握手成功后(accept也完成了,并返回一个新的,标识客户端的套接字),浏览器就向万维网发出浏览某个页面的请求,服务器接着就返回所请求的页面作为响应。最后TCP释放,由于这个过程中的浏览器和服务器之间的请求和响应要遵循一定的规则,所以这个通信规则就是http协议。
HTTP报文结构:
一、请求报文:
HTTP协议总结
参见上图:HTTP请求报文格式如下
HTTP请求报文分下面三个组成部分:开始行,首部行,实体主体(数据部分)
HTTP协议总结
一、开始行
GET:HTTP的请求方法之一,意为请求读取URL(统一资源定位符Uniform Resource Locator,说白了就是一个文件的在服务器的具体位置)所标志的信息,或者说是申请获取资源,不对服务器产生任何影响。
/index.html:GET方法要请求读取的文件的路径和要申请的具体文件。
HTTP/1.1:是指当前http协议版本为1.1版本(后面会讲述1.1和1.0的不同)
二、首部行,又叫HTTP报文头(属性名:属性值)
Host:指出目标主机名。HTTP协议规定HTTP请求必须包含的头部字段就是目标主机名。
User-Agent:指出客户端应用的程序是Mozilla firefox
Accept:头属性告诉服务端 客户端接受什么类型的响应
keep-alive:115表明http使用保持115seconds(一般认为是time_out时间)的连接,超过这个时间之后便断开连接。其意义在于服务端可以选择不主动关闭连接而是等待客户端来关闭。
Connection:Keep-alive表示使用长连接(短连接使用close,就在在服务器发送完数据之后就断开连接),http1.1默认keep-alive
Referer:HTTP Referer是header的一部分,当浏览器向web服务器发送请求的时候,一般会带上Referer,告诉服务器我是从哪个页面链接过来的,服务器基此可以获得一些信息用于处理。
接着会跟一个空行<CR><LF>(回车和换行)一起以CRLF的形式发送,通知服务器一下不再有请求头。注意上面的每一个字段结束后都有<CR><LF>作为本行结束标志。
HTTP协议总结
三、实体主体行
请求报文中“实体主体”通常是不用的。它在GET方法下是不能使用的,POST方法中向服务器提供一些用户凭据
二、应答报文
HTTP协议总结
还是主要还是三个部分:响应行,响应头部,实体主体行
来看一个具体的:

void send_200ok(int c,int size)
{
char http_head[512]={"HTTP:/1.1 200 OK"}; 响应行版本1.1 请求成功
strcat(http_head,"Server: myhttp\r\n");
sprintf(http_head+strlen(http_head),"Content-Length:%d",size); //Content-size\r\n
strcat(http_head,"\r\n"); //空行
printf("\n send:%s\n",http_head);
send(c,http_head,sizeof(http_head),0);
}
HTTP协议总结
send是为了方便查看应答报文写的,接着的
HTTP:/1.1是HTTP版本信息,200 OK是HTTP状态码,表示请求成功
Server:字段指出目标WEB服务器的名称
Conten-length:表明目标文档长度为238字节
当然还有别的字段
HTTP协议总结
HTTP请求报文中的请求方法有哪些?
这里我们介绍常见的9种
(1)GET:申请获得资源,而不对服务器产生任何其他影响。具体来讲:请求服务器发送在URL字段中指定的Web页面,URL的根目录是相对于服务器的根目录,总是以“/"前缀开始,下同。
(2)HEAD:和GET方法类似,不过仅要求服务器返回头部信息,而不需要传输任何实际内容
(3)POST:客户端向服务器提交数据。这种方法会影响服务器:服务器可能根据收到的数据动态创建新的资源,也可能更新原有资源。具体来讲:在URL指定的Web服务器后面附加一个以URI格式命名的资源,以便于为Web服务器提供更多的信息,比如在服务器上粘贴一条海报消息。
(4)PUT:上传某个资源。具体来讲就是在URL指定的路劲下存储一个Web页面,与PUT方法相反
(5)DELETE:删除URL字段指定的Web页面,当然最终能否删除成功还会受到用户权限的限制。
(6)TRACE:要求目标服务器返回原始HTTP请求的内容。它可以用来查看中间服务器(比如服务器)对于HTTP请求的影响。具体来讲:这是一个用来进行环回的请求报文。用于调试。
(7)OPTION:查看服务器对于某个特定URL都支持哪些请求方法。也可以把URL设置为*,从而获得服务器支持的所有请求
(8)CONNECT:用于连接代理服务器(proxy server),它们能把请求的连接转化为一个安全隧道。
(9)PATCH:对于某个资源做部分修改。
HTTP的无连接?无状态?
HTTP协议使用的是面向连接的TCP协议,保证了数据的可靠传输。HTTP不必考虑数据传输过程中被丢弃后又怎么样被重传,这是TCP的事情。但是为什么说HTTP协议本身是无连接的。原因在于,虽然HTTP在运输层使用的是TCP协议,但是通信的双方在交换HTTP报文之前不需要先建立HTTP连接。
HTTP的无状态是指:同一个客户第二次访问同一个服务器上的页面时,服务器的响应与第一次被访问时的相同(假定现在服务器还没有把页面更新),因为服务器并不记得曾经访问过的这个客户,也不记得为此用户曾经服务过多少次。HTTP的无状态特效简化了服务器的设计,使得服务器更容易支持大量并发HTTP请求。

HTTP1.0和HTTP1.1的区别:
HTTP1.0主要缺点:在每次请求一个文档就要有两倍的RTT(往返时间)的开销。如果一个网页上有多个链接的对象需要逐个链接,那么你一定会觉得这个时候的开销太大了:因为每一个请求都伴随一个两倍的RTT时间。与此同时还伴随着另一种开销:就是万维网客户和服务器为每次建立新的TCP链接都要分配缓存和变量。特别如果有大量用户请求,这样会给予万维网服务器以巨大的负载。好在浏览器都提供打开5~10个并行的TCP连接,而每一个TCP连接处理一个客户请求,使得并发TCP连接便于实现(多线程,多进程,进程池或者线程池),使用的是短连接:每次服务器处理完这个HTTP请求之后就关闭连接。

HTTP1.1解决了上述的不断建立连接释放连接,以及开辟变量,缓存的问题。它使用持续连接(长连接):在万维网服务器在发送一个响应后依旧仍然在一段时间内保持这条连接,使同一个客户和服务器可以继续在这条连接上传送后面的HTTP请求报文和应答报文。这不局限于传送同一个页面上的链接的文档,而是只要都在同一个服务器上就行。

HTTP1.1解决了1.0版本的一次连接请求回复之后就结束的短连接问题。
HTTP1.1协议持续连接的两种工作方式
非流水线方式和流水线方式
(1)非流水线方式
在客户收到前一个响应后才能发出下一个请求因此在TCP连接建立后,客户每访问一次对象都要用去一个RTT时间。这比非持续连接的两倍RTT时间少了一个TCP建立的RTT时间。但是你会发现这样对于资源的利用不够充分:在TCP发送完一个对象后,TCP就处于空闲了,浪费了服务器资源。因此引出了流水线方式的持续连接。
(2)流水线方式的持续连接
在客户端收到HTTP响应报文之前就能接着发送新的请求报文。于是一个接一个的请求报文达到服务器后,服务器可以持续的发回应答报文。因此在此种方式下,客户访问所有的对象只需花费一个RTT时间。流水线方式使得TCP连接的空闲时间变少,数据传输效率提高了。

HTTP代理服务器(Proxy)
代理服务器的是一种类似于“cache”的网络实体。
工作原理如下,代理服务器会把最近的一些请求和应答暂存在本地磁盘上。当(客户端和服务器历经三次握手之后建立连接后)新的请求达到时,若代理服务器发现这个请求与暂存的请求相同,就返回暂存的应答报文,而不需要按URL的地址在此去因特网访问该资源;在本地没有对应的请求,那么代理服务器会代表客户端(浏览器)与因特网上对应的源点服务器建立TCP连接,并发送HTTP请求报文。源点服务器把所请求的对象的HTTP应答报文返回给代理服务器。代理服务器在收到这个对象后,先复制一份保存在本地存储器中,接着将此对象放到HTTP应答报文中,通过已经建立的TCP连接,返回给对象的浏览器。其类似于内存管理中的cache。

用户点击鼠标后发生的事件:
1,浏览器分析链接指向页面的URL
2,浏览器向DNS请求解析www.baidu.com
3,域名解析系统DNS解析出www.baidu.com的IP地址
4,浏览器与服务器建立TCP链接
5,浏览器发出取出文件命令
6,服务器www.baidu.com给出响应,把文件Index.html发生给浏览器
7,释放TCP连接
8,浏览器显示百度,文件index.html里的所有文本。
HTTP响应报文的状态码:

(此处引用自:https://blog.csdn.net/weiwenjuan0923/article/details/52675316这位兄弟总结的非常好,在此引用)

5段组成: 
  • 1xx 消息,一般是告诉客户端,请求已经收到了,正在处理,别急...
  • 2xx 处理成功,一般表示:请求收悉、我明白你要的、请求已受理、已经处理完成等信息.
  • 3xx 重定向到其它地方。它让客户端再发起一个请求以完成整个处理
  • 4xx 处理发生错误,责任在客户端,如客户端的请求一个不存在的资源,客户端未被授权,禁止访问等。
  • 5xx 处理发生错误,责任在服务端,如服务端抛出异常,路由出错,HTTP版本不支持等
忽略:277187

特别注意:306已经不存在了
1xx(临时响应) 
表示临时响应并需要请求者继续执行操作的状态代码。
代码   说明 
100   (继续) 请求者应当继续提出请求。 服务器返回此代码表示已收到请求的第一部分,正在等待其余部分。  
101   (切换协议) 请求者已要求服务器切换协议,服务器已确认并准备切换。
2xx (成功) 
表示成功处理了请求的状态代码。
代码   说明 
200   (成功)  服务器已成功处理了请求。 通常,这表示服务器提供了请求的网页。 
201   (已创建)  请求成功并且服务器创建了新的资源。 
202   (已接受)  服务器已接受请求,但尚未处理。 
203   (非授权信息)  服务器已成功处理了请求,但返回的信息可能来自另一来源。 
204   (无内容)  服务器成功处理了请求,但没有返回任何内容。 
205   (重置内容) 服务器成功处理了请求,但没有返回任何内容。 
206   (部分内容)  服务器成功处理了部分 GET 请求。
3xx (重定向) 
表示要完成请求,需要进一步操作。 通常,这些状态代码用来重定向。
代码   说明 
300   (多种选择)  针对请求,服务器可执行多种操作。 服务器可根据请求者 (user agent) 选择一项操作,或提供操作列表供请求者选择。 
301   (永久移动)  请求的网页已永久移动到新位置。 服务器返回此响应(对 GET 或 HEAD 请求的响应)时,会自动将请求者转到新位置。 
302   (临时移动)  服务器目前从不同位置的网页响应请求,但请求者应继续使用原有位置来进行以后的请求。 
303   (查看其他位置,跳转至其他页面,目标的url会根据响应的报文告诉你)请求者应当对不同的位置使用单独的 GET 请求来检索响应时,服务器返回此代码。 
304   (未修改,可以直接用本地的缓存) 自从上次请求后,请求的网页未修改过。 服务器返回此响应时,不会返回网页内容。 
305   (使用代理) 请求者只能使用代理访问请求的网页。 如果服务器返回此响应,还表示请求者应使用代理。 
307   (临时重定向)  服务器目前从不同位置的网页响应请求,但请求者应继续使用原有位置来进行以后的请求。
4xx(请求错误) 
这些状态代码表示请求可能出错,妨碍了服务器的处理。
代码   说明 
400   (错误请求) 服务器不理解请求的语法。 
401   (未授权) 请求要求身份验证。 对于需要登录的网页,服务器可能返回此响应。 
403   (禁止) 服务器拒绝请求。 
404   (未找到) 服务器找不到请求的网页。 
405   (方法禁用) 禁用请求中指定的方法。 
406   (不接受) 无法使用请求的内容特性响应请求的网页。 
407   (需要代理授权) 此状态代码与 401(未授权)类似,但指定请求者应当授权使用代理。 
408   (请求超时)  服务器等候请求时发生超时。 
409   (冲突)  服务器在完成请求时发生冲突。 服务器必须在响应中包含有关冲突的信息。 
410   (已删除)  如果请求的资源已永久删除,服务器就会返回此响应。 
411   (需要有效长度) 服务器不接受不含有效内容长度标头字段的请求。 
412   (未满足前提条件) 服务器未满足请求者在请求中设置的其中一个前提条件。 
413   (请求实体过大) 服务器无法处理请求,因为请求实体过大,超出服务器的处理能力。 
414   (请求的 URI 过长) 请求的 URI(通常为网址)过长,服务器无法处理。 
415   (不支持的媒体类型) 请求的格式不受请求页面的支持。 
416   (请求范围不符合要求) 如果页面无法提供请求的范围,则服务器会返回此状态代码。 
417   (未满足期望值) 服务器未满足”期望”请求标头字段的要求。
5xx(服务器错误) 
这些状态代码表示服务器在尝试处理请求时发生内部错误。 这些错误可能是服务器本身的错误,而不是请求出错。
代码   说明 
500   (服务器内部错误)  服务器遇到错误,无法完成请求。 
501   (尚未实施) 服务器不具备完成请求的功能。 例如,服务器无法识别请求方法时可能会返回此代码。 
502   (错误网关) 服务器作为网关或代理,从上游服务器收到无效响应。 
503   (服务不可用) 服务器目前无法使用(由于超载或停机维护)。 通常,这只是暂时状态。 
504   (网关超时)  服务器作为网关或代理,但是没有及时从上游服务器收到请求。 
505   (HTTP 版本不受支持) 服务器不支持请求中所用的 HTTP 协议版本。
补充:
(1)URL的一般形式
协议://主机:端口:/路径
如http://baidu.com 使用http协议,主机名baidu,web服务默认端口80,通常省略。路径看情况,如果不给路径,那么URL就指向了某个网站的主页。
主页一般是如下三种情况:
(1)一个WWW服务器的*别的页面。
(2)某个组织或者部门的一个特定的页面或目录。
(3)由某个人自己设计的描述他本人情况的WWW页面。
URL的作用:唯一的标识万维网上的每一个文档。并且在整个万维网上通用该格式。方便文件的定位。
(2)Cookie
为什么要引入Cookie?因为前面说过http是无状态的,上一次怎么访问的应答的,下一次也是一样的应答。但是我们在设计的时候往往希望记录下客户的一些信息,方便他们再次访问更加方便,比如说自动登录。因此Cookie诞生了!Cookie就是规定万维网站点可以使用Cookie来跟踪用户。
Cookie的工作原理
当一个用户使用某个网站时,该网站的服务器就为该用户产生一个唯一的标识码并以此作为索引在服务器的后端数据库中产生一个项目。接着给改客户的HTTP响应报文中添加一个Set-cookie的首部行。Set Cookie的值就是前面生成的标识码。
在用户收到应答报文后,用户的浏览器就在它管理的特定Cookie文件中添加一行,其中包含这个服务器的主机名和Set-cookie后的标识码。当用户再访问这个网站时,每发送一个HTTP请求报文,其浏览器就从这个Cookie文件中读取这个网站的标识码,并放到HTTP请求报文的Cookie首部行中。于是Cookie就可以跟踪该用户的活动(通过标识码),需要注意的一点在于,服务器是并不需要知道该用户的姓名和其它信息,现在有Cookie code,服务器可以根据这个code去追踪对应用户访问过哪些页面一遍结合合适的推荐算法,给予用户更好的服务。Cookie本身是一个小小的文本文件。存储在用户的计算机上,用户可以自行处理它。


参考资料:《输入理解计算机网络》,《计算机网络谢希仁第五版》