http协议解析 java_史上最通俗易懂HTTP协议解析

一.HTTP简介5 d* ~2 I) q: f* C4 {) e- _

# b7 a" n: d' [6 Q# ]% G) ^1.HTTP协议,即超文本传输协议(Hypertext transfer protocol)。是一种详细规定了浏览器和万维网(WWW = World Wide Web)服务器之间互相通信的规则,通过因特网传送万维网文档的数据传送协议。

& K2 f: h) J2 R2.HTTP协议作为TCP/IP模型中应用层的协议也不例外。HTTP协议通常承载于TCP协议之上,有时也承载于TLS或SSL协议层之上,这个时候,就成了我们常说的HTTPS。如下图:7 }2 n9 o, e) ~

73bfbd2e273fbdf240680b47a7857a14.png3.HTTP是一个应用层协议,由请求和响应构成,是一个标准的客户端服务器模型。HTTP是一个无状态的协议。, g) `2 C' o' i& s

4.HTTP默认的端口号为80,HTTPS的端口号为443。6 j! i$ }, ?5 Z/ q: l- p& s6 q

5.浏览网页是HTTP的主要应用,但是这并不代表HTTP就只能应用于网页的浏览。HTTP是一种协议,只要通信的双方都遵守这个协议,HTTP就能有用武之地。比如咱们常用的QQ,迅雷这些软件,都会使用HTTP协议(还包括其他的协议)。

4 ]6 Y5 L3 E/ o, R二.HTTP特点& u( e+ j/ i4 O4 }  X7 R

* C, L, B+ |& f; J! k8 n

1、简单快速:客户向服务器请求服务时,只需传送请求方法和路径。由于HTTP协议简单,使得HTTP服务器的程序规模小,因而通信速度很快。

: {9 c  b, S: E. R1 O. y2、灵活:HTTP允许传输任意类型的数据对象。正在传输的类型由Content-Type加以标记。`* _. ]0 e* y: B7 e& N$ J. ?9 r, D

3、HTTP 0.9和1.0使用非持续连接:限制每次连接只处理一个请求,服务器处理完客户的请求,并收到客户的应答后,即断开连接。HTTP 1.1使用持续连接:不必为每个web对象创建一个新的连接,一个连接可以传送多个对象,采用这种方式可以节省传输时间。

, a* E& t- b2 q; L4、无状态:HTTP协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快。

5 \! `5 s, H% b% h$ l5、支持B/S及C/S模式。3 s% I9 P& E3 D

三.HTTP工作流程" P, w  w! c" c4 P

/ A# y0 t% }( r2 x  j, P一次HTTP操作称为一个事务,其工作过程可分为四步:

2 y+ J: `! O. S" a' ?/ X& [1.首先客户机与服务器需要建立连接。只要单击某个超级链接,HTTP的工作开始。

# ]' L& B4 o* l! L6 ^2.建立连接后,客户机发送一个请求给服务器,请求方式的格式为:统一资源标识符(URL)、协议版本号,后边是MIME信息包括请求修饰符、客户机信息和可能的内容。: j% g+ W. _" [1 {$ Z+ q; k

3.服务器接到请求后,给予相应的响应信息,其格式为一个状态行,包括信息的协议版本号、一个成功或错误的代码,后边是MIME信息包括服务器信息、实体信息和可能的内容。

8 Z/ s6 N% t! i# r; Q4.客户端接收服务器所返回的信息通过浏览器显示在用户的显示屏上,然后客户机与服务器断开连接。

- B* B; Q1 u, w! s如果在以上过程中的某一步出现错误,那么产生错误的信息将返回到客户端,有显示屏输出。对于用户来说,这些过程是由HTTP自己完成的,用户只要用鼠标点击,等待信息显示就可以了。

) Z' g& e4 o* e; M% R* J# o. g四.HTTP之请求消息Request" _# r) H9 i6 S* j: i

6 n5 T* }0 L# _. m* I

客户端发送一个HTTP请求到服务器的请求消息包括以下格式:

. v: T4 d+ ]0 u7 T请求行、请求头部、空行和请求数据四个部分组成。

% U8 G- U# `/ ]; d# d) i0 t6 h(1)Get请求例子, `0 n! e; b% P7 l+ ~* j! \

d26f1b78788af109a7834a64fda36553.png第一部分:请求行,用来说明请求类型,要访问的资源以及所使用的HTTP版本.8 N6 `; W3 v$ O

0 B( y0 O$ k( F" S" `9 b

GET说明请求类型为GET,[/562f25980001b1b106000338.jpg]为要访问的资源,该行的最后一部分说明使用的是HTTP1.1版本。

/ y7 o( m2 [1 y# m- {第二部分:请求头部,紧接着请求行(即第一行)之后的部分,用来说明服务器要使用的附加信息

d  c7 G- D& U9 X

8 I, U1 j7 |8 i: g5 f/ J$ t从第二行起为请求头部,HOST将指出请求的目的地.User-Agent,服务器端和客户端脚本都能访问它,它是浏览器类型检测逻辑的重要基础.该信息由你的浏览器来定义,并且在每个请求中自动发送等等( B5 I8 R" C# \

第三部分:空行,请求头部后面的空行是必须的

! R% N9 M. n4 W/ d4 s6 G6 Y  C9 c: i, L  q9 `& Q

即使第四部分的请求数据为空,也必须有空行。

5 d6 [7 C: q" H+ [第四部分:请求数据也叫主体,可以添加任意的其他数据。/ \& V- T3 ~4 F: K$ g: y& w7 g: y

* q' x4 @  s  Z! c7 q这个例子的请求数据为空。4 j- Y  A) v3 N9 L

POST请求例子

% |3 [% h/ M; g* \$ C+ _

c545ac1499ba21103ada515f893046d6.png第一部分:请求行,第一行明了是post请求,以及http1.1版本。* o$ o" y! [% O: g/ ]

第二部分:请求头部,第二行至第六行。

+ \' G& g! L2 B) R* \9 N第三部分:空行,第七行的空行。

+ Z- A7 S& c. k0 {) U1 V第四部分:请求数据,第八行。

1 ~% y! x; u2 C6 c, P+ S五.HTTP之响应消息Response

$ v4 h, I$ o# L5 {; }% {* w

9 I7 s& X3 f1 x9 t, h5 q一般情况下,服务器接收并处理客户端发过来的请求后会返回一个HTTP的响应消息。4 K' j' Q; ^2 }  W' \$ z, i

HTTP响应也由四个部分组成,分别是:状态行、消息报头、空行和响应正文。& o3 A( f9 Z. R  t5 W& V

c4396a433b61c3624bd790b714c7807e.png第一部分:状态行,由HTTP协议版本号, 状态码, 状态消息 三部分组成。

7 D" G+ m2 z* z9 M# c: Q0 q( \1 L* y- Z, |, d! l

第一行为状态行,(HTTP/1.1)表明HTTP版本为1.1版本,状态码为200,状态消息为(ok)a# a+ W6 L2 g+ M

第二部分:消息报头,用来说明客户端要使用的一些附加信息# T. J/ a" _1 N% o( N( ~; _

' v* C! u5 ~' \4 R  T$ _

第二行和第三行和第四行为消息报头,8 L& P) b; A' ]/ g# D0 ?* G" V) b6 w

Date:生成响应的日期和时间;Content-Type:指定了MIME类型的HTML(text/html),编码类型是ISO-8859-1. p' v! ?, r+ B

第三部分:空行,消息报头后面的空行是必须的

1 L3 e, f! o+ b* i! a" L7 I' g2 t) P3 H+ R+ l# G* H

第四部分:响应正文,服务器返回给客户端的文本信息。

+ ?: W/ \3 q$ O$ h. @

. G# i) P+ c1 }3 t空行后面的html部分为响应正文。

/ a  U2 q+ c. P  x4 T: x/ d6.HTTP之状态码% D+ b; ^* L2 M0 x

7 ]# F  ^! N' S1 p9 B: V

状态代码有三位数字组成,第一个数字定义了响应的类别,共分五种类别:0 h$ N* Z; w) }2 C) a% `5 p+ o

1xx:指示信息--表示请求已接收,继续处理6 l: I! ^& H- x9 n) D

2xx:成功--表示请求已被成功接收、理解、接受

8 V$ s  e& _2 c  A3xx:重定向--要完成请求必须进行更进一步的操作

. U% k& [+ b) \% a# L, L* R4xx:客户端错误--请求有语法错误或请求无法实现9 @6 ?' L5 K' J6 }' H! ~4 O2 `5 ~

5xx:服务器端错误--服务器未能实现合法的请求

# B0 j7 }8 c* ?  J3 \常见状态码:

$ Y% M6 s2 r$ q' D

38e764c3c503a34b5f9ef92244be6df0.png7.HTTP请求方法

; I! d# v. _1 S9 Q9 ~5 b5 X  [, P. ^4 {! G) p, q

根据HTTP标准,HTTP请求可以使用多种请求方法。t" I7 ?" n$ F- G  e+ H+ z

HTTP1.0定义了三种请求方法: GET, POST 和 HEAD方法。

5 h( T+ D% y. \$ ~3 Z0 JHTTP1.1新增了五种请求方法:**OPTIONS, PUT, DELETE, TRACE 和 CONNECT **方法。

$ G! c+ H. s0 H2 k$ |2 ^

a27c7747aacf5978ab454edc14922131.png8.HTTP工作原理! U) t% Y2 b1 Q7 m* P9 Z

8 X% `) R+ p) E  r. I

HTTP协议定义Web客户端如何从Web服务器请求Web页面,以及服务器如何把Web页面传送给客户端。HTTP协议采用了请求/响应模型。客户端向服务器发送一个请求报文,请求报文包含请求的方法、URL、协议版本、请求头部和请求数据。服务器以一个状态行作为响应,响应的内容包括协议的版本、成功或者错误代码、服务器信息、响应头部和响应数据。

9 {# \% ~& u' ?7 M* a) l  k以下是 HTTP 请求/响应的步骤:7 Q  A; z* x$ I4 s

1、客户端连接到Web服务器' p( y6 h( e! @

一个HTTP客户端,通常是浏览器,与Web服务器的HTTP端口(默认为80)建立一个TCP套接字连接。

* B- @! @. b0 \3 J0 z2、发送HTTP请求

% a; g9 W8 w$ _9 X- `" k通过TCP套接字,客户端向Web服务器发送一个文本的请求报文,一个请求报文由请求行、请求头部、空行和请求数据4部分组成。

$ j& w' F* O4 g, g& t) h3 K% r3、服务器接受请求并返回HTTP响应7 o/ P2 l% b. z, ]

Web服务器解析请求,定位请求资源。服务器将资源复本写到TCP套接字,由客户端读取。一个响应由状态行、响应头部、空行和响应数据4部分组成。

$ S; n9 R% g) c* }4、释放连接TCP连接

j8 M6 R( q9 ?9 Y若connection 模式为close,则服务器主动关闭TCP连接,客户端被动关闭连接,释放TCP连接;若connection 模式为keepalive,则该连接会保持一段时间,在该时间内可以继续接收请求;/ v4 H+ Q& ?# ?& R  v3 ~

5、客户端浏览器解析HTML内容

% {9 a( n$ S$ h# ]1 @' a2 Q客户端浏览器首先解析状态行,查看表明请求是否成功的状态代码。然后解析每一个响应头,响应头告知以下为若干字节的HTML文档和文档的字符集。客户端浏览器读取响应数据HTML,根据HTML的语法对其进行格式化,并在浏览器窗口中显示。

# e5 K1 X. s( w! I9 T5 D* q- K9.GET和POST的区别" O. b- N! c2 D! u% R

( R/ h8 j  ?* V7 N5 [9 ]0 a

1、GET提交的数据会放在URL之后,以?分割URL和传输数据,参数之间以&相连,如EditPosts.aspx?name=test1&id=123456. POST方法是把提交的数据放在HTTP包的Body中.% e* j) G5 |8 A

2、GET提交的数据大小有限制(因为浏览器对URL的长度有限制),而POST方法提交的数据没有限制.

; I! s: C6 |( ~' w* [, ~3、GET方式需要使用Request.QueryString来取得变量的值,而POST方式通过Request.Form来获取变量的值。

. d2 O( j4 e9 J. b. ^" u" p+ m# u4、GET方式提交数据,会带来安全问题,比如一个登录页面,通过GET方式提交数据时,用户名和密码将出现在URL上,如果页面可以被缓存或者其他人可以访问这台机器,就可以从历史记录获得该用户的账号和密码.

5 d/ k5 ^8 b+ O* q& T! F" C5 P六、总结

* `2 j- o8 C, E/ x0 A4 D

U: f6 M0 M$ v如果觉得本文对你有帮助的话,请你也不要吝啬你的赞,你们的支持是对我最大的鼓励。今天的Java知识分享就到这里!想要知道更多Java基础知识和面试资料的我这边整理了一个我自己的GitHub仓库:Java小白修炼手册,大家如果有需要可以自行查看

2 A  Q4 p& O/ o" e5 F) A0 n1 `% R% l0 e' ~

Java吧 收集整理 java论坛 www.java8.com

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值