5 、HTTP 协议的版本
HTTP1.1 和HTTP1.0 的区别
Persistent Connection( 持久连接)
在HTTP1.0 中,每对Request/Response 都使用一个新的连接。
HTTP 1.1 则支持Persistent Connection, 并且默认使用persistent connection.
Host 域
HTTP1.1 在Request 消息头里头多了一个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.1 有2 个)
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 Negotiation ,Agent-driven Negotiation 和Transparent Negotiation 三种。
Cache ( 缓存)
HTTP1.1(RFC2616) 详细展开地描述了Cache 机制
6 、socket
socket 的英文原义是“孔”或“插座”。作为4BDS UNIX 的进程通信机制,取后一种意思。通常也称作" 套接字" ,用于描述IP 地址和端口,是一个通信链的句柄。
每一个socket 用一个半相关描述:( 协议,本地地址,本地端口)
一个完整的socket 有一个本地唯一的socket 号,由操作系统分配。即上面的本地地址。这个本地地址是一种文件描述符,和文件句柄很相似。
在Internet 上有很多这样的主机,这些主机一般运行了多个服务软件,同时提供几种服务。每种服务都打开一个socket (ServerSocket ),并绑定到一个端口上,不同的端口对应于不同的服务。socket 正如其英文原意那样,象一个多孔插座。一台主机犹如布满各种插座的房间,每个插座有一个编号,有的插座提供220 伏交流电, 有的提供110 伏交流电,有的则提供有线电视节目。 客户软件将插头插到不同编号的插座,就可以得到不同的服务。
socket 接口是TCP/IP 网络的API ,socket 接口定义了许多函数或例程,程序员可以用它们来开发TCP/IP 网络上的应用程序。要学Internet 上的TCP/IP 网络编程,必须理解socket 接口。socket 接口设计者最先是将接口放在Unix 操作系统里面的。如果了解Unix 系统的输入和输出的话,就很容易了解socket 了。网络的socket 数据传输是一种特殊的I/O ,socket 也是一种文件描述符。socket 也具有一个类似于打开文件的函数调用Socket() ,该函数返回一个整型的socket 描述符,随后的连接建立、数据传输等操作都是通过该socket 实现的。
在socket 编程接口里,设计者提出了一个很重要的概念,那就是socket 。这个socket 跟文件句柄很相似(一种文件描述符),实际上在BSD 系统里就是跟文件句柄一样存放在一样的进程句柄表里。这个socket 其实是一个序号,表示其在句柄表中的位置。这一点,我们已经见过很多了,比如文件句柄,窗口句柄等等。这些句柄,其实是代表了系统中的某些特定的对象,用于在各种函数中作为参数传入,以对特定的对象进行操作-- 这其实是C 语言的问题,在C++ 语言里,这个句柄其实就是this 指针,实际就是对象指针啦。
socket 跟TCP/IP 并没有必然的联系。socket 编程接口在设计的时候,就希望也能适应其他的网络协议。所以,socket 的出现只是可以更方便的使用TCP/IP 协议栈而已,其对TCP/IP 进行了抽象,形成了几个最基本的函数接口。比如create ,listen ,accept ,connect ,read 和write 等等。
如果一个程序创建了一个socket (ServerSocket ),并让其监听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 协议的操作封装!
ServerSocket 和Socket ,我认为本质上都是socket ,都是文件描述符,只不过ServerSocket 提供了创建Socket 的方法。以J2SDK-1.3 为例,Socket 和ServerSocket 类库位于java.net 包中。ServerSocket 用于服务器端,Socket 是建立网络连接时使用的。不管是Socket 还是ServerSocket 它们的工作都是通过SocketImpl 类及其子类完成的。
在TCP 连接成功时,应用程序两端都会产生一个Socket 实例。操作这个实例,完成所需的会话。对于一个网络连接来说,套接字是平等的,并没有差别,不因为在服务器端或在客户端而产生不同级别。
运维网声明
1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网 享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com