Linux网络编程---详解HTTP协议

Linux⽹络编程---详解HTTP协议
HTTP 简介
HTTP协议是Hyper Text Transfer Protocol(超⽂本传输协议)的缩写,是⽤于从万维⽹(WWW:World Wide Web )服务器传输超⽂本到本地浏览器的传送协议。。
HTTP是⼀个基于TCP/IP通信协议来传递数据(HTML ⽂件, 图⽚⽂件, 查询结果等)。
HTTP ⼯作原理
HTTP协议⼯作于客户端-服务端架构上。浏览器作为HTTP客户端通过URL向HTTP服务端即WEB服务器发送所有请求
Web服务器有:Apache服务器,IIS服务器(Internet Information Services)等。
HTTP默认端⼝号为80,但是你也可以改为8080或者其他端⼝。
HTTP三个特点:
HTTP是基于客户端/服务端(C/S)的架构模型,通过⼀个可靠的链接来交换信息,是⼀个⽆状态的请求/
响应协议。
HTTP是⽆连接: ⽆连接的含义是限制每次连接只处理⼀个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采⽤这种⽅式可以节省传输时间。
HTTP是媒体独⽴的: 这意味着,只要客户端和服务器知道如何处理的数据内容,任何类型的数据都可以通过HTTP发送。客户端以及服务器指定使⽤适合的MIME-type内容类型。
HTTP是⽆状态: HTTP协议是⽆状态协议。⽆状态是指协议对于事务处理没有记忆能⼒。缺少状态意味着如果后续处理需要前⾯的信息,则它必须重传,这样可能导致每次连接传送的数据量增⼤。另⼀⽅⾯,在服务器不需要先前信息时它的应答就较快。
HTTP使⽤统⼀资源标识符(Uniform Resource Identifiers, URI)来传输数据和建⽴连接。
认识URL(Uniform Resource Identifiers, URI)
平时我们俗称的 “⺴址” 其实就是说的 URL,我们知道浏览器作为HTTP客户端给是通过URL给HTTP服务端发送请求进⾏通信。所谓的URL就是我们通常所说的⽹址,我们来看下他的组成:
URL格式:
协议⽅案名://认证信息@服务器地址:端⼝号/请求的资源路径?query_string#⽚段标识符
例如,我们在百度搜索C++,看下它的URL。
www.baidu/s?wd=C%2B%2B&rsv_spt=1&rsv_iqid=0xd99175460001909d&issp=1&f=3&rsv_bp=0&rsv_idx=2&
ie=utf-8&tn=baiduhome_pg&rsv_enter=1&rsv_sug3=2&rsv_sug1=2&rsv_sug7=001&rsv_sug2=1&rsp=0&
rsv_sug9=es_2_1&rsv_sug4=4546&rsv_sug=9
注意:为了能看清楚,所以每⼀⾏进⾏了回车换⾏,本来的URL是⼀个连续的⼀段⽹址。
下⾯我们来对⽐百度的这个⽹址和普通的URL有什么区别。
== 协议⽅案名:==顾名思义,指的是协议⽅案名字。 我们采⽤的就是http协议发送请求,所以前⾯就是http;http协议是明⽂传输,所以不安全,因此现在基本都是https,https其实就是http的加密版。后⾯会有专门的博客介绍https。
认证信息: 认证信息就相当于登陆信息。 对于http协议,他的认证信息就夹在URL中,我们⽤户⽤⾁眼就看⼀看得见他的登录名和密码,所以很不安全;⽽https通过加密之后,这些认证信息会加密,也就不会直接放在URL中,所以⽐较安全,因此我们第⼆幅图URL中就没有认证信息这⼀块。
服务器地址: 指的就是你要请求的服务器的地址,也就是⽹址。
端⼝号: 指你要请求的是服务器的某个地址对应的程序⼊⼝地址。 如果不加端⼝号,http则默认是80
号端⼝,https是443号端⼝。这个端⼝号⽆符号短整型(0-65535),0-1024不推荐使⽤,因为是知名协议预留端⼝。
/请求的资源路径: 请求的根⽬录资源路径。(这个跟⽬录其实是相对根⽬录,意思就是URL中上看的是⼀个根⽬录,但对应到服务器上时其实是⼀个⼦⽬录)。 如果没有资源路径,那么默认是/index.html,例如你访问 和 是同⼀个页⾯。
query_string(查询字符串): 就是你要搜索的内容。这个内容通过urlencode(URL编码)成⼀个字符串。这个字符串是⽤&符号连接成的多个键值对(key=val&key=val&…)。
#⽚段标识符:(相当于标签),例如第⼀张图,浏览器读取URL后,会⾃动将#ch1位置滚动⾄可视区域。如果没有⽚段标识符,那直接从头开始显⽰。 我们注意到搜索C++的时候在它的URL中并没有显⽰C++这些字符。那么原因就在于他将这些字符进⾏了编码。
urlencode/urldecode(URL编码/解码)
因为url中特殊字符在很多地⽅都有特殊含义,因此为了防⽌我们提交的数据中也包含特殊字符造成歧义,因此对我们提交的数据进⾏url编码操作.注意转义只是转的提交的字符串。
URL编码操作: 每个字符是⼀个字节,即8位。然后将特殊字符⾼四位转换为16进制数字,低四位转
换为16进制数字,并且为了区分这是转换过的字符,所以在两个16进制数字之前都加上⼀个转义字符%。如:+ 对应 0010 1011 ,0010对应2,1011对应b,所以C++转换过的字符就是C%2b%2b。
我们查看上⾯的百度URL就可以到wd=C%2b%2b,这就是我们搜索栏输⼊的内容,后⾯的⼀系列⽤&连接起来的键值对则⽤于标识请求的其他信息。URL编码只是转义的我们搜索栏中提交的字符串。
URL编码操作: 解码操作和编码刚好互逆。
说了这么多,终于到了HTTP,我们下来看HTTP协议的格式。
HTTP请求
⼀个HTTP"客户端"是⼀个应⽤程序(Web浏览器或其他任何客户端),通过连接到服务器达到向服务器发送⼀个或多个HTTP的请求的⽬的。
客户端发送⼀个HTTP请求到服务器的请求消息包括以下格式:请求⾏(request line)、请求头部(header)、空⾏和请求数据四个部分组成,请求协议格式分了四个部分
GET / HTTP/1.1//紧接着这块是回车换⾏,即\r\n
User-Agent: curl/7.16.3 libcurl/7.16.3 OpenSSL/0.9.7l zlib/1.2.3//紧接着这块是回车换⾏,即\r\n
Host: ample//紧接着这块是回车换⾏,即\r\n
Accept-Language: en, mi//紧接着这块是回车换⾏,即\r\n
//这块是空⾏,/r/n
//接着这块是请求正⽂
HTTP 协议的 8 种请求类型(⽅法)
HTTP1.0定义了三种请求⽅法: GET, POST 和 HEAD⽅法。
HTTP1.1新增了五种请求⽅法:OPTIONS, PUT, DELETE, TRACE 和 CONNECT ⽅法。
具体介绍如下:
GET: 向特定的资源发出请求。其更多的是获取资源,没有请求正⽂,能够提交的url长度是有限的(这是它的缺陷),早期最⼤是1K,现在4-8k。
POST: 向指定资源提交数据进⾏处理请求(例如提交表单或者上传⽂件)。数据被包含在请求体中。POST请求可能会导致新的资源的创建和/或已有资源的修改。更多提交表单数据,有正⽂,提交的数据是在正⽂中,正⽂没有长度限制。
HEAD: 向服务器索要与GET请求相⼀致的响应,只不过响应体将不会被返回。这⼀⽅法可以在不必传输整个响应内容的情况下,就可以获取包含在响应消息头中的元信息。
OPTIONS: 返回服务器针对特定资源所⽀持的HTTP请求⽅法。也可以利⽤向Web服务器发送’*'的请求来测试服务器的功能性。
PUT: 向指定资源位置上传其最新内容。
DELETE: 请求服务器删除 Request-URI 所标识的资源。
TRACE: 回显服务器收到的请求,主要⽤于测试或诊断。
CONNECT: HTTP/1.1 协议中预留给能够将连接改为管道⽅式的代理服务器。
虽然 HTTP 的请求⽅式有 8 种,但是我们在实际应⽤中常⽤的也就是 get 和 post,其他请求⽅式也都可以通过这两种⽅式间接的来实现。
HTTP响应
HTTP/1.1200 OK //状态⾏,分别为协议版本、状态码、状态描述符
Date: Mon,27 Jul 200912:28:53 GMT//响应报头
Server: Apache//响应报头
Last-Modified: Wed,22 Jul 200919:15:56 GMT//响应报头
ETag:"34aa387-d-1568eb00"//响应报头
Accept-Ranges: bytes//响应报头
Content-Length:51//响应报头
Vary: Accept-Encoding//响应报头
Content-Type: text/plain//响应报头
//空⾏,即\r\n
//这⾥是响应正⽂
HTTP 响应头信息
Allow: 服务器⽀持哪些请求⽅法(如GET、POST等)。
Content-Length : 表⽰内容长度。只有当浏览器使⽤持久HTTP连接时才需要这个数据。如果你想要利⽤持久连接的优势,可以把输出⽂档写⼊ ByteArrayOutputStream,完成后查看其⼤⼩,然后把该值放⼊Content-Length头,最后通过
byteArrayStream.OutputStream()发送内容。
Content-Type : 表⽰后⾯的⽂档属于什么MIME类型。Servlet默认为text/plain,但通常需要显式地指定为text/html。由于经常要设置Content-Type,因此HttpServletResponse提供了⼀个专⽤的⽅法setContentType。
Date: 当前的GMT时间。你可以⽤setDateHeader来设置这个头以避免转换时间格式的⿇烦。
Expires: 应该在什么时候认为⽂档已经过期,从⽽不再缓存它?
Last-Modified: ⽂档的最后改动时间。客户可以通过If-Modified-Since请求头提供⼀个⽇期,该请求将被为⼀个条件GET,只有改动时间迟于指定时间的⽂档才会返回,否则返回⼀个304(Not Modified)状态。Last-Modified也可⽤setDateHeader⽅法来设置。
Location: 表⽰客户应当到哪⾥去提取⽂档。Location通常不是直接设置的,⽽是通过HttpServletResponse的sendRedirect⽅法,该⽅法同时设置状态代码为302。
Server: 服务器名字。Servlet⼀般不设置这个值,⽽是由Web服务器⾃⼰设置。
Set-Cookie : 设置和页⾯关联的Cookie。Servlet不应使⽤response.setHeader(“Set-Cookie”, …),⽽是应使⽤HttpServletResponse提供的专⽤⽅法addCookie。参见下⽂有关Cookie设置的讨论。
HTTP状态码(HTTP Status Code)
当浏览者访问⼀个⽹页时,浏览者的浏览器会向⽹页所在服务器发出请求。当浏览器接收并显⽰⽹页前,此⽹页所在的服务器会返回⼀个包含HTTP状态码的信息头(server header)⽤以响应浏览器的请求。
HTTP状态码分类
HTTP状态码由3个⼗进制数字组成,第⼀个⼗进制数字定义了状态码的类型,后两个数字没有分类的作⽤。acceptlanguage
HTTP状态码共分为5种类型:
分类类别分类描述
1**Informational(信息状态吗)信息,服务器收到请求,需要请求者继续执⾏操作
2**Success(成功状态码)成功,操作被成功接收并处理
3**Redirection(重定向状态码)重定向,需要进⼀步的操作以完成请求
4**Client Error(客户端错误状态码)客户端错误,请求包含语法错误或⽆法完成请求
4**Server Error(服务器状态码)服务器错误,服务器在处理请求的过程中发⽣了错误
下⾯是常见的HTTP状态码:
200 - 请求成功
301 - 资源(⽹页等)被永久转移到其它URL
404 - 请求的资源(⽹页等)不存在
500 - 内部服务器错误

本文发布于:2024-09-21 19:50:35,感谢您对本站的认可!

本文链接:https://www.17tex.com/tex/3/371746.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:请求   服务器   状态   协议
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议