【入门系列】关于HTTP协议与协议的一些理解

概述

在刚学习网站的时候,一直都有一个避不开的角色,即HTTP协议。由于没有计算机基础,一直搞不懂什么是协议,更不用提什么是HTTP协议了。现在就学习网站的一年中,总结一下。

这篇文章的主要目的是尽量通俗地告诉读者什么是协议,以及HTTP协议。

题外话:我个人认为,语言都是人为了能与某种物体交流而定义的,说话用的语言是为了交流,而编程语言是为了与计算机交流。而被定义的语言能被另一个物体(人,计算机等),应该是双方都遵守一定的规则,按照规则将语言翻译成自己的大脑(或者处理器)能够理解的东西。协议就是这么一种规则。

一:什么是协议

先看一个情景:假设AB两个人需要通话,需要考虑哪些问题?

最重要的应该是语言

只有两个人的语言相通,他们才能交流。

即,A说的话,B可以理解。这点主要指语法,语言的规则。

那么假设两台计算机需要通讯,最重要的问题应该也是交流所用的单词,语法,双方需要都可以理解。

我们先粗略地将这种语言理解成协议。

协议定义了一些规则,只要双方计算机都能知道,并遵守这些规则,那么双方就可以交流。

就像人,只要双方都知道语法,以及单词的含义,那么双方就能交流。

 

那么协议怎么在计算机上实现?

我们知道,计算机通常运行的是程序。

那么协议应该也是一个程序

在此,我们先不管双方是通过什么方式传话的(不管你是用电话,手机,还是面对面之类的),先假设一个前提,即双方能听到对方的话。

放在计算机上来说,就是两台计算机能收到对方传来的信息。

那么计算机如何理解这些信息?使用相关程序来解释这些信息。

先来看下面这个程序:

char* func(char* message) {
	if (message == "give me food") {
		return "food";
	}
	else if (message == "give me water") {
		return "water";
	}
	else {                  
		return nullptr;
	}
}

上面的程序中,func函数接受一个参数message,然后根据message的内容来返回对应的内容。

这就是一个最简单的解释程序。

这个程序只能解释字符串(参数是字符串),只能解释两种字符串。你如果传给他别的参数,如“give me money”,这个程序就无法解释了。

这个程序我们就可以将其叫做 ‘give me 协议’。

以上只是为了说明一个道理,计算机是通过人为预先制定的规则来解析接收的信息,从而完成理解信息,完成通讯的工作的

一次通信过程

假设现在有A,B两台计算机。

A发送给B “give me food”这条信息,来通知B计算机A想要food。在此我们假设B安装了 ”give me 协议” 这个程序。

当B收到“give me food”这条信息的时候,B会调用 ”give me 协议”这个程序来解释这个信息。最终“give me 协议”返回了 “food”。

二:HTTP协议简单介绍

http协议就是这么一种程序。

http全称是HyperText Transfer Protocal ,即:超文本传输协议

顾名思义,就是用来传输超文本的协议,或者说程序。

我们先来猜测下这个程序的功能:

  1. 这个程序可以解析超文本
  2. 这个程序能在计算机间传输超文本,即拥有传输,接收,发送超文本的功能

利用HTTP协议这个程序,如果通信双方计算机都安装了这个程序,那么双方传输超文本便成为了可能。

什么是超文本?

关于超文本的具体定义,在此不在多提,可以自行百度。在本文,可以简单将其看成超级文本, 即比普通文本多了点功能的文本。。

C/S模型,请求与响应

C/S模型,即client/server,客户端与服务端。

现在最常见的互联网应用模型就是CS模型。

客户机(客户端的计算机)通过向服务端(服务器)发送请求,然后服务端根据请求的内容,将对应的服务资源响应给客户端。

什么是服务资源?

抽象一点地说,任何东西都可能成为资源。

比如:我们在浏览器的地址栏上输入URL:https://baidu.com,然后敲回车,就可以访问到百度的首页。而百度的首页,学过html的同学应该都知道,其实是用html5,css,js组成的代码。而这些代码,就是一种资源。

再比如:一些在线计算网站,提供了对一种问题的计算服务。计算这种问题的程序保存在服务器中。我们无需下载计算这种问题的程序本身。我们只需要将我们要计算的参数发送给这个网站服务器,服务器在收到你的参数后,调用计算程序计算出结果,最终将计算结果以响应的方式发送给你。这个计算服务,就是一种资源。

上述两个例子中,我们(客户端)发送请求,向服务器请求一种服务。服务器收到请求后,将我们要的服务资源发送给我们。这就是最基础的请求/响应模式。

URL,一种用来标记互联网资源的标识

请仔细理解我上面所讲的内容,不知道有没有同学注意到一个问题,互联网上资源那么多,一个服务器上也会有很多服务资源,那么服务器是怎么知道我们请求的是什么服务呢?

如果你能注意到这个问题,那么说明你是认真的在看这篇博客了,并且进行了一些思考。

其实互联网的缔造者早已想到了这个问题,并制定了一些规则,其中之一就是URL,即Uniform Resource Locator,统一资源定位符,俗称网页地址。

URL通用的格式:scheme://host[:port#]/path/…/[?query-string][#anchor]

目前我们只需要知道 scheme,host,path的含义就可以了。

举个例子:比如我现在要用百度搜索的服务。一般我们会先输入https://www.baidu.com/,访问(在这里我们可以看成获取)百度的首页,然后在搜索框中敲入HTML,按下回车,然后会跳到搜索页面,里面是搜索出的内容。这个时候这个页面的地址栏是这样的:

我们可以看到,在这个请求的URL中:

协议类型是https(一种在http协议的基础上,增加了一些安全措施的协议)

主机是www.baidu.com(这个其实是域名,之后会被浏览器解析成IP地址),

port,我们没有看到,其实有一个约定是,没有指定的port的话默认就是80

path,是 /s(可以想一下为什么定义成s)

参数,在URL中,?后边表示之后的字符串是参数(上表中的query-string),格式是 ?name=value,如果有多个参数的话,则是          name=value&name=value&name=value.。在这个例子中,我们只关注第一个参数wd=HTML,就是我们刚才要搜索的的值。

如果我们不进入百度的首页怎么使用百度的搜索功能?

我们可以直接在浏览器的地址栏中这样写:https://www.baidu.com/s?wd=HTML,然后敲下回车,你会发现同样也能达到搜索的功能。

如何用我们之前的知识来理解这个过程?

首先我们在地址栏中敲入https://www.baidu.com/s?wd=HTML,然后回车。浏览器检测到URL中指定的https协议,然后会调用浏览器内置的http协议程序解析这个URL所指定的服务器地址(IP),即域名部分。然后就可以向这个服务器发送请求。当服务器收到这个请求后,会根据这个URL的path以及参数,来调用指定的服务(比如/s就代表搜索服务),最终将搜索的结果返回给我们。

下面是一个简单的http服务器的伪代码示例(并不能跑!):

struct URL
{
	char* path;  //路径
	char* query; //参数
};

struct Request
{
	URL url;
	char* from;   //来自哪里
	//something about request
};


char* search(char* wd) {
	return "some search result";
}

void response(char* data) {
	//响应操作
}

//当服务器检测到有请求时,会调用这个函数
void httpHandler(Request req) {
	if (req.url.path == "/s") {
		char* searchc_result = search(req.url.query);  //搜索
		response(searchc_result);
	}
	else if(req.url.path == "/action/calculate"){
		// do some caluculate
		response("calculate result");
	}
	else {
		//当服务器没有URL所指定的服务时,则会发送这句话
		response("404 Not Found!");   
	}

}

以上便是HTTP协议的简单理解。如有不妥,还望指正。

关于http以及URL的更多细节,可以继续看这篇文章:在浏览器地址栏输入一个URL后回车,背后会进行哪些技术步骤?

下一篇会讲到最简单的HTTP服务器程序。

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值