Http协议简述

本文参考:TCP/IP详解卷三,https://www.linuxprobe.com/http-learning.html, 其中第五点URL格式完整拷贝自此链接:
https://www.linuxprobe.com/http-learning.html

一、应用层协议:

众所周知,Http协议是应用层协议,是万维网(World Wide Web,www,也简称web)的基础。何谓应用层协议?

要了解应用层协议就必须了解传输层协议(请自行百度),举个例子,对于传输层协议TCP来讲,新的连接到来都会经历三个过程,即三次握手确定连接建立,数据传输,最后四次分手确定连接结束。而在数据传输过程中,无论对于发送方还是接受方来讲,收到的数据都是字节,那我们怎么来确定收到的字节分别代表什么意义呢?这就需要应用层协议,当然,对于那些拥有独立服务器的公司来讲,即C/S架构的公司,应用层协议可以自己建立。对于B/S架构即现在的web开发公司来讲,需要使用Http协议。HTTP默认是基于传输层的TCP协议的。
讲到这里,你应该明白了web开发中的tomcat、nginx等第三方服务器主要为web开发做了什么:
1、维护传输层连接所必须的东西,包括套接字编程,并发处理等
2、基于Http协议的解析和编码

二、Http协议特点(基于HTTP/1.0):

1、无状态的(即短连接)

每个事务独立进行处理,事务结束时就释放这个连接。通俗点讲,就是浏览器发送请求,服务器处理请求,然后发送响应后立刻关闭发送套接字,close(int fd);就相当于啥子,相当于你在你的浏览器地址栏中输入地址,然后回车,如果成功会跳到你所请求的页面,此时TCP连接就结束了,如果你想点击页面的超链接再次请求,会新建一个TCP连接,服务器已经不认识你了,当然,现在web之所以能保存客户的浏览信息,是因为使用了cookie或session。

2、支持请求头与响应头

就是首部字段,比如字段名Content-Length,Content-Encoding,Content-Type,User-Agent等等。
首部字段由上述字段名和随后的冒号、一个空格和字段值组成,字段名不区分大小写
比如: Content-Length: 113
Content-Type: text/html

3、Response响应以一个响应状态行开始,Response包含的内容不只限于超文本

响应主体中还可以放置图片、电子邮件等

4、开始支持客户端通过POST方法向Web服务器提交数据,并支持GET、HEAD、POST方法

HTTP/1.0支持这三种请求方法,HTTP/1.1又增加了五种请求方法,分别是OPTIONS,PUT, DELETE, TRACE, CONNECT。
GET:请求指定的页面信息,并返回实体主体
HEAD 类似于get请求,只不过返回的响应中没有具体的内容,用于获取报头
POST 向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST请求可能会导致新的资源的建立和/或已有资源的修改。
PUT 从客户端向服务器传送的数据取代指定的文档的内容。 DELETE 请求服务器删除指定的页面。
CONNECT HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器。
OPTIONS 允许客户端查看服务器的性能。
TRACE 回显服务器收到的请求,主要用于测试或诊断。

一个URL地址用于描述一个网络上的资源,而HTTP中最基本的四个方法GET, POST, PUT, DELETE就对应着对这个资源的查,改,增,删4个操作。

5、支持长连接Keepalive

HTTP/1.0默认还是使用短连接,如果想要切换到长连接,就需要在请求头中加入如下首部字段。Connection: keep-alive
而HTTP/1.1默认使用长连接,如果想关闭长连接,需要加入首部字段。Connection: close

6、缓存机制以及身份认证

三、HTTP请求格式:

HTTP请求由请求行、请求头、请求主体三部分组成,其中如果是post请求,则有请求主体,如果是get请求,则没有请求主体。
请求行: 由三部分组成,第一部分请求方法(METHOD),就是GET或POST那8中方法。第二部分uri(URI),请求资源的地址,第三部分版本号(HTTPVERSION),比如 HTTP/1.1
请求头:(HEADERS)就是如果有首部字段的话,就一个首部字段占一行
请求主体:(BODY)注意,请求主体和请求头之间以空行分隔
则具体格式如下:
METHOD URI HTTPVERSION
HEADER1
HEADER2
<空行>
BODY
笔者实现的一个web服务器,截取到的浏览器发送的请求如下:

GET /index2.html HTTP/1.1
Host: 192.168.0.103:9090
Connection: keep-alive
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36 SE 2.X MetaSr 1.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Encoding: gzip, deflate, sdch
Accept-Language: zh-CN,zh;q=0.8

四、HTTP响应格式:

浏览器发送请求,服务器肯定也要响应请求,发送个浏览器的响应由三部分组成,第一部分,状态行(status-line),第二部分响应头,第三部分,响应主体
**状态行:**以版本号开始,后面跟着3位数字表示响应代码(响应码),最后是易读的响应短语
比如响应码: (200),响应短语 : (OK,请求成功)
400 错误的请求
404 没有找到请求资源 等等
**响应头:**和请求头一样,同样由0个或多个首部字段组成
**响应主体:**响应主体会显示在浏览器上,如果是HTML格式的,则浏览器会自动解析。
笔者服务器发送给浏览器的响应如下:

HTTP/1.0 404 Not Found
Content-Length: 85
Content-Type: text/html

<html><head><title>Not Found</title></head><body><h1>404 Not Found</h1></body></html>

(附:此时,未找到请求资源,则浏览器显示如下:)
http请求资源未找到

当然,对于请求成功,会发如下响应:

HTTP/1.0 200 OK
Content-Length: 113
Content-Type: text/html

<!DOCTYPE HTML>
<html>
	<head>
		<title>httpServer</title>
	</head>
	<body>
	make a html
	</body>
</html>

此时,浏览器显示如下:
http请求资源成功

五、请求和响应中的URI和URL的区别:

#1、URI,是uniform resource identifier,统一资源标识符,用来唯一的标识一个资源。Web上可用的每种资源如HTML文档、图像、视频片段、程序等都是一个来URI来定位的 URI一般由三部组成:
①访问资源的命名机制
②存放资源的主机名
③资源自身的名称,由路径表示,着重强调于资源。

#2、URL是uniform resource locator,统一资源定位器,它是一种具体的URI,即URL可以用来标识一个资源,而且还指明了如何locate这个资源。URL是Internet上用来描述信息资源的字符串,主要用在各种WWW客户程序和服务器程序上,特别是著名的Mosaic。 采用URL可以用一种统一的格式来描述各种信息资源,包括文件、服务器的地址和目录等。URL一般由三部组成:
①协议(或称为服务方式)
②存有该资源的主机IP地址(有时也包括端口号)
③主机资源的具体地址。如目录和文件名等

URL格式:

#1、什么是URL?URL是一种特殊类型的URI,包含了用于查找某个资源的足够的信息 URL,全称是UniformResourceLocator, 中文叫统一资源定位符,是互联网上用来标识某一处资源的地址。

#2、以下面这个URL为例,介绍下普通URL的各部分组成:http://www.aspxfans.com:8080/news/index.asp?boardID=5&ID=24618&page=1
#name一个完整的URL包括以下几部分:
#A.协议部分:http://该URL的协议部分为“http:”,在"HTTP"后面的“//”为分隔符。这代表网页使用的是HTTP协议。在Internet中可以使用多种协议,如HTTP,FTP等等。=>如果不写,浏览器会自动补全,但必须有
#B.域名部分:www.aspxfans.com一个URL中,也可以使用IP地址作为域名使用
=>必须有
#C.端口部分:8080跟在域名后面的是端口,域名和端口之间使用“:”作为分隔符。=>端口不是一个URL必须的部分,如果省略端口部分,将采用默认端口80
#D.虚拟目录部分:/news/从域名后的第一个“/”开始到最后一个“/”为止,是虚拟目录部分。
=>虚拟目录也不是一个URL必须的部分。
#E.文件名部分:index.asp从域名后的最后一个“/”开始到“?”为止,是文件名部分,如果没有“?”,则是从域名后的最后一个“/”开始到“#”为止,是文件部分,如果没有“?”和“#”,那么从域名后的最后一个“/”开始到结束,都是文件名部分。=>文件名部分也不是一个URL必须的部分,如果省略该部分,则使用默认的文件名
#F.参数部分:boardID=5&ID=24618&page=1从“?”开始到“#”为止之间的部分为参数部分,又称搜索部分、查询部分。参数可以允许有多个参数,参数与参数之间用“&”作为分隔符。
=>参数部分非必须
#G.锚部分:#name从“#”开始到最后,都是锚部分。===>锚部分也不是一个URL必须的部分

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值