http项目总结

HTTP

超文本传输协议HTTP(hyper text transfer protocol),主要用于从WWW服务器传输超文本到本地浏览器上。

http无状态性

http是无状态协议,因为是无状态性,所以协议对事务处理是没有记忆的和独立的,也就是说,同一个客户端第二次访问这个服务器页面时,服务器不知道这个客户端曾经访问过,并且服务器无法分辨不同客户端。
无状态性使得http服务器设计很简单,并且可以有效处理大量并发的http请求。
但是无状态性已经阻碍了很多动态交互程序的实现,例如无状态行我们无法保持登陆状态,那么怎么解决这个问题,使得可以保持http状态呢?Cookie和Session技术。

http无连接与持久连接

这里就要说明http版本,因为http1.0用非持久连接,而http1.1采用持久连接。
(1)非持久连接:也就是无连接性,每次连接只处理一个用户请求,并且客户接到服务器应答后立即断开连接。使用无连接协议,如果客户端没有发出请求,服务器不会专门等待,也不会在完成一个请求后还保持原来的请求,而是会立即断开这次连接。
它的缺点主要是客户端必须为每个待请求的对象建立并维护一个连接,请求一个文档都要耗费2RRT的开销,因为同一个页面可能存在多个对象,所以非持久连接可能使一个页面的下载变得十分缓慢,而且这种短连接增加了网络传输的负担。
(2)持久连接(keepalive):服务器在发送响应后一段时间内仍然保持这条连接,允许在这条连接上进行多次请求与响应。

http连接与响应过程

  1. 首先在客户浏览器中输入网址。
  2. 浏览器根据域名解析IP地址。
  3. 浏览器与web服务器建立一个TCP连接。
  4. 浏览器给服务器发送一个http请求:
    一个http请求报文由请求行、请求头部、空行和请求包体组成。
    这里写图片描述
    (1)请求行:由请求方法、URL、协议版本构成,之间用空格分隔开,例如 GET /index.html HTTP/1.0 。
    请求方法有很多种:GET、HEAD、POST、PUT、DELETE、TRACE、CONNECT等,而GET、HEAD、POST方法被大部分服务器支持。
    1->GET:GET方法要求服务器将URL定位的资源放在响应报文的数据部分,回送给客户端。使用GET方式时,如果是进行CGI处理,那么请求参数和附加值放在url后面,以‘?’为url的结尾和请求参数的开始,传递参数的长度受浏览器限制。
    如/insert_cgi?name=tc&sex=man&age=21。通过GET方式请求的数据直接放在地址中,因此GET请求时不需要用到请求包体,可以看到‘?’之后的是通过GET方式提供的请求数据,可以看到参数与参数之间用‘&’分隔开来,这些都可以从浏览器的地址上看到,很显然的,GET方式不适用与保密传输,想想当你登陆后,你的账号密码都在浏览器上能看到,那别人只要岂不是就知道了你的账号密码?另外GET方式也不适用于传送大量数据,因为浏览器的地址栏一般最多只能识别1024个字符,因此当需要传递大量数据时,GET也不适用。
    2->POST:POST方法从客户向服务器传送数据,允许客户端给服务器提供的数据更多,POST请求将数据封装到请求包体行中,数据之间用&分隔,POST方法可以传输大量数据,没有大小限制,而且不会在url中显示。主要用于发送HTML FORM内容让CGI程序处理,这时FORM内容的url编码随请求一起发送。大多用于表单提交
    3->HEAD:HEAD方法,要求服务器查找某对象的元信息而不是对象本身,就像GET,只不过服务端接受到HEAD请求后只返回响应头,而不会发送响应内容。当我们只需要查看某个页面的状态的时候,使用HEAD是非常高效的,因为在传输的过程中省去了页面内容。
    (2)请求头部:由关键字/值对组成,每行一对,关键字和值用英文冒号”:“分隔。请求头部通知服务器有关于客户端请求的信息。
    User-Agent:产生请求的浏览器类型。
    Accept:客户端可识别的内容类型列表。星号 “ * ” 用于按范围将类型分组,用 “ / ” 指示可接受全部类型,用“ type/* ”指示可接受 type 类型的所有子类型。
    Host:要请求的主机名,允许多个域名同处一个IP地址,即虚拟主机。
    Accept-Language:客户端可接受的自然语言。
    Accept-Encoding:客户端可接受的编码压缩格式。
    Accept-Charset:可接受的应答的字符集。
    connection:连接方式(close 或 keepalive)。
    Cookie:存储于客户端扩展字段,向同一域名的服务端发送属于该域的cookie。
    (3)空行:最后一个请求头部之后是一个空行,发送回车符和换行符,通知服务器以下不再有请求头部。
    (4)请求包体(正文):不在GET方法中使用,在POST
    方法中使用,正文最常用到的报头信息是Content-Length和Content-TypeLI两个。
  5. 服务器处理http请求
    服务器处理请求信息,并且做出相响应。
  6. 服务器发回一个HTML响应
  7. 释放TCP连接
    若connection 模式为close,则服务器主动关闭TCP 连接,客户端被动关闭连接,释放TCP 连接;
    若connection 模式为keepalive,则该连接会保持一段时间,在该时间内可以继续接收请求;
    版本号为HTTP/1.0 默认连接为非持久连接
    版本号为HTTP/1.1默认连接为持久连接(keepalive)
  8. 浏览器解析服务器发送来的HTML文档
    浏览器解析HTML中的内容,并显示出来。

提出问题

TCP三次握手/四次挥手

三次握手四次挥手详讲

长连接和短连接的有点和缺点

由上可以知道,长连接可以省去较多的TCP建立和关闭的操作,减少浪费,节约时间。对于频繁请求资源的客户来说,较为适用长连接。不过存在一个问题,存活功能的检测周期太长,还有就是他只是检测TCP连接是否存活,遇到恶意的连接时,保活功能就不够使了。在长连接应用场景下,client客户端一般不会主动关闭它们之间的连接,而client和server之间的连接如果一直不关闭的话,会存在一个问题,随着客户端连接越来越多,server迟早会扛不住,这时server就得采取一些措施,例如关闭一些长时间没有读写事件发生的连接,或限制每个客户端的最大连接数。
短连接对于服务器来说管理简单,存在的连接都是有用的,不需要额外的控制手段。但如果客户端请求频繁,将在TCP的建立和关闭上浪费时间和带宽。

什么时候用长连接,短链接?

长连接多用于操作频繁,点对点的通信,而且连接数不能太多的情况。
每次创建TCP连接,都需要经过三次握手,如果是短连接,每次操作时,都需要建立TCP连接,需要耗费的时间就较长,而我们如果频繁操作那效率就大大降低,例如数据库,如果用短连接频繁的通信会造成socket错误,而且频繁的socket 创建也是对资源的浪费。 

例如Web网站服务,一般都是用短连接,因为会长连接对于服务器来说会消耗一定资源,一般网站服务器都会有很多用户进行访问,如果使用长连接,服务器要维护每个连接,这样的话,当用户很多,并且都不关闭连接时,服务器维护的连接太多,导致服务器效率大大降低,并且这些连接消耗服务器资源,早晚服务器会崩掉。所以短连接大多用于无需无需用户频繁操作的时候。
  

什么是CGI

CGI(Common Gateway Interface)是HTTP服务器与你的或其它机器
上的程序进行“交谈”的一种工具,其程序须运行在网络服务器上。
CGI处理步骤:
⑴通过Internet把用户请求送到服务器。
⑵服务器接收用户请求并交给CGI程序处理。
⑶CGI程序把处理结果传送给服务器。
⑷服务器把结果送回到用户。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值