HTTP协议和tomcat中的HTTP实现(三)

5HTTP协议的版本

 

HTTP1.1HTTP1.0的区别

 

Persistent Connection(持久连接)

HTTP1.0中,每对Request/Response都使用一个新的连接。

HTTP 1.1则支持Persistent Connection, 并且默认使用persistent connection.

 

Host

HTTP1.1Request消息头里头多了一个Host域,比如:

                   GET /pub/WWW/TheProject.html HTTP/1.1

                   Host: www.w3.org

HTTP1.0则没有这个域。

可能HTTP1.0的时候认为,建立TCP连接的时候已经指定了IP地址,这个IP地址上只有一个host

 

date/time stamp (日期时间戳)

(接收方向)

无论是HTTP1.0还是HTTP1.1,都要能解析下面三种date/time stamp

                             Sun, 06 Nov 1994 08:49:37 GMT  ; RFC 822, updated by RFC 1123

 

                             Sunday, 06-Nov-94 08:49:37 GMT ; RFC 850, obsoleted by RFC 1036

 

                             Sun Nov  6 08:49:37 1994       ; ANSI C's asctime() format

(发送方向)

HTTP1.0要求不能生成第三种asctime格式的date/time stamp

HTTP1.1则要求只生成RFC 1123(第一种)格式的date/time stamp

 

Transfer Codings

HTTP1.1支持chunked transfer,所以可以有Transfer-Encoding头部域:

Transfer-Encoding: chunked

HTTP1.0则没有。

 

Quality Values

HTTP1.1多了个qvalue域:

                   qvalue         = ( "0" [ "." 0*3DIGIT ] )

 

                                    | ( "1" [ "." 0*3("0") ] )

 

 

Entity Tags

用于Cache

 

Range Content-Range

HTTP1.1支持传送内容的一部分。比方说,当客户端已经有内容的一部分,为了节省带宽,可以只向服务器请求一部分。

 

100 (Continue) Status

100 (Continue) 状态代码的使用,允许客户端在发request消息body之前先用request header试探一下server,看server要不要接收request body,再决定要不要发request body

客户端在Request头部中包含

Expect: 100-continue

Server看到之后呢如果回100 (Continue) 这个状态代码,客户端就继续发request body

这个是HTTP1.1才有的。

 

Request method

HTTP1.1增加了OPTIONS, PUT, DELETE, TRACE, CONNECT这些Request方法.

                            Method         = "OPTIONS"                ; Section 9.2

 

                                             | "GET"                    ; Section 9.3

 

                                             | "HEAD"                   ; Section 9.4

 

                                             | "POST"                   ; Section 9.5

 

                                             | "PUT"                    ; Section 9.6

 

                                             | "DELETE"                 ; Section 9.7

 

                                             | "TRACE"                  ; Section 9.8

 

                                             | "CONNECT"                ; Section 9.9

 

                                             | extension-method

 

extension-method = token

 

Status code

HTTP1.1 增加的新的status code

(HTTP1.0没有定义任何具体的1xx status code, HTTP1.12)

100 Continue

101 Switching Protocols

203 Non-Authoritative Information

205 Reset Content

206 Partial Content

302 Found (HTTP1.0中有个 302 Moved Temporarily)

303 See Other

305 Use Proxy

307 Temporary Redirect

405 Method Not Allowed

406 Not Acceptable

407 Proxy Authentication Required

408 Request Timeout

409 Conflict

410 Gone

411 Length Required

412 Precondition Failed

413 Request Entity Too Large

414 Request-URI Too Long

415 Unsupported Media Type

416 Requested Range Not Satisfiable

417 Expectation Failed

504 Gateway Timeout

505 HTTP Version Not Supported

 

Content Negotiation

HTTP1.1增加了Content Negotiation,分为Server-driven NegotiationAgent-driven NegotiationTransparent Negotiation三种。

 

Cache (缓存)

HTTP1.1(RFC2616)详细展开地描述了Cache机制

 

6socket

socket的英文原义是“孔”或“插座”。作为4BDS UNIX的进程通信机制,取后一种意思。通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄。

每一个socket用一个半相关描述:(协议,本地地址,本地端口)

一个完整的socket有一个本地唯一的socket号,由操作系统分配。即上面的本地地址。这个本地地址是一种文件描述符,和文件句柄很相似。

Internet上有很多这样的主机,这些主机一般运行了多个服务软件,同时提供几种服务。每种服务都打开一个socketServerSocket),并绑定到一个端口上,不同的端口对应于不同的服务。socket正如其英文原意那样,象一个多孔插座。一台主机犹如布满各种插座的房间,每个插座有一个编号,有的插座提供220伏交流电, 有的提供110伏交流电,有的则提供有线电视节目。 客户软件将插头插到不同编号的插座,就可以得到不同的服务。

socket接口是TCP/IP网络的APIsocket接口定义了许多函数或例程,程序员可以用它们来开发TCP/IP网络上的应用程序。要学Internet上的TCP/IP网络编程,必须理解socket接口。socket接口设计者最先是将接口放在Unix操作系统里面的。如果了解Unix系统的输入和输出的话,就很容易了解socket了。网络的socket数据传输是一种特殊的I/Osocket也是一种文件描述符。socket也具有一个类似于打开文件的函数调用Socket(),该函数返回一个整型的socket描述符,随后的连接建立、数据传输等操作都是通过该socket实现的。

socket编程接口里,设计者提出了一个很重要的概念,那就是socket。这个socket跟文件句柄很相似(一种文件描述符),实际上在BSD系统里就是跟文件句柄一样存放在一样的进程句柄表里。这个socket其实是一个序号,表示其在句柄表中的位置。这一点,我们已经见过很多了,比如文件句柄,窗口句柄等等。这些句柄,其实是代表了系统中的某些特定的对象,用于在各种函数中作为参数传入,以对特定的对象进行操作--这其实是C语言的问题,在C++语言里,这个句柄其实就是this指针,实际就是对象指针啦。

socketTCP/IP并没有必然的联系。socket编程接口在设计的时候,就希望也能适应其他的网络协议。所以,socket的出现只是可以更方便的使用TCP/IP协议栈而已,其对TCP/IP进行了抽象,形成了几个最基本的函数接口。比如createlistenacceptconnectreadwrite等等。

如果一个程序创建了一个socketServerSocket),并让其监听80端口,其实是向TCP/IP协议栈声明了其对80端口的占有。以后,所有目标是80端口的TCP数据包都会转发给该程序(这里的程序,因为使用的是socket编程接口,所以首先由socket层来处理)。所谓accept函数,其实抽象的是TCP的连接建立过程。accept函数返回的新socket其实指代的是本次创建的连接,而一个连接是包括两部分信息的,一个是源IP和源端口,另一个是宿IP和宿端口。所以,accept可以产生多个不同的socket,而这些socket里包含的宿IP和宿端口是不变的,变化的只是源IP和源端口。这样的话,这些socket宿端口就可以都是80,而socket层还是能根据源/宿对来准确地分辨出IP包和socket的归属关系,从而完成对TCP/IP协议的操作封装!

ServerSocketSocket,我认为本质上都是socket,都是文件描述符,只不过ServerSocket提供了创建Socket的方法。以J2SDK-1.3为例,SocketServerSocket类库位于java.net包中。ServerSocket用于服务器端,Socket是建立网络连接时使用的。不管是Socket还是ServerSocket它们的工作都是通过SocketImpl类及其子类完成的。

TCP连接成功时,应用程序两端都会产生一个Socket实例。操作这个实例,完成所需的会话。对于一个网络连接来说,套接字是平等的,并没有差别,不因为在服务器端或在客户端而产生不同级别。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值