计算机网络基础3:HTTP

上文絮絮叨叨,都不知道再说啥,直接进入第二章算了,既然是自顶向下,那么肯定是从最上层的协议层次开始了,那么我们就不用再去管啥传输层,网络层了,直接看应用层,顾名思义,应用层即直接面向我们日常活动的层次,我们不需要知道数据是怎么传输到其他终端上的,我们只需要规定传输的报文数据的具体含义即可,目前我们常用的应用有:QQ,Foxmal,网络游戏等,数不胜数。当然在这些应用光鲜的背后,还是离不开各个硬件层次的默默付出滴! 但是,在那么多的应用中,是否存在某些体系结构呢? 为啥要提出体系结构?因为我们的应用在使用在不可避免的遇到下列一个问题,在如此多的终端上安装了如此多的应用,这些终端应用程序到哪里交换数据呢?是从一个超级数据终端还是无数个安装了此应用的其他主机呢? 这两种不同的方式就是现代网络应用主流的两种体系结构:客户-服务器体系结构(C/S)、对等体系结构(P2P)

简单的描述,c/s结构即所有的数据都是从一个服务中心来与客户端进行数据传输,当然,这里的一个服务中心并不是指一个服务器主机,而是一整片服务集群,采用分布式的方式,如DNS轮换等,这种方式典型的应用就是门户搜索类网站,如google等,这种方式的好处显而易见,服务器集群提供了十分稳定的带宽,并且具备丰富的数据资源,另一种就是p2p结构,这���种在互联网上把雷锋精神体现的淋漓尽致,在这种体系中,由于每一个客户端都具备了数据资源的一部分,那么对于服务中心的依赖就变得微乎其微,p2p所在的各个应用终端同时充当的服务端和客户端,典型的应用就是文件下载,如迅雷等,但是这样的方式虽然节省的服务中心高昂的服务和带宽成本,把负载分发到每一个终端,但是无法保证数据传输的稳定性,还会因为频繁的网络数据广播请求而加重家庭网络的负担,关于p2p相关在后面分析,因此两种不同的结构需要适当的选择。

当然,简单的了解了应用的体系结构,我们还是要回归正题阿,别忘了我们的标题可是HTTP!!

刚刚我们了解了,对于这类的门户类web来说,绝大多数是c/s结构,大家都知道http协议典型的应用就是浏览器上网。因此,我们就直接用这个例子来切入我们今天的主题,我们脑补一下:

当你通过浏览器访问www.baidu.com到浏览器显示百度界面,中间需要发生什么呢?

访问baidu---->发送请求到服务器---->服务器接收到请求--->服务器返回数据----->显示出baidu

       

这里一步一步思考?

1:发送请求到服务器,发送到哪,怎么知道?

因为网络层的IP地址以及数据链路层的MAC地址

2:到了服务器,服务器怎么知道这是浏览器的请求?而不是QQ的请求?

因为传输层的维护端口号,唯一的标记了服务器上的一个服务(进程)

3:到了服务器,它怎么知道这是一个请求,而不是其他的含义?

因为应用层协议规定了这段数据的意思是请求的意义,这个协议就是http协议.

关于操作系统上怎么来描述一个应用程序的,其实是以进程的概念来描述的,这么不再说明进程的概念,因为实在是说不清,有必要自行了解操作系统相关即可,当我们的应用运行后就产生了一个进程,当然服务器程序也是一个进程,就会监听一个端口,以便和访问它的客户机进行通讯。

还是回到我们的主要目的,http协议,我们上面简单的描述了访问baidu的大致流程。服务器怎么知道传输过来的数据代表啥含义呢?  下面我们就具体来了解一下http协议。

Http(超文本传输协议),是web的应用层核心协议。HTTP是典型的C/S结构,有一个客户程序和服务程序组成,通过HTTP报文进行数据交换,HTTP1.0以前采用的TCP短连接,HTTP1.1以后采用了TCP长连接。

长连接和短连接的概论其实很简单,假如我们要发3帧数据,如果每发一帧就重新建立一次握手连接,发完一帧后关闭,这样发三帧就需要建立3次连接的做法就是短连接,而长连接则是建议1次握手直接发完3帧。两种传输选择使用地各有不同,短连接适合于数据请求不频繁,但是终端用户多的应用,以关闭连接节省TCP连接链路。而长连接则适合于数据量大,请求频繁的应用,以减少建立连接的次数来降低访问的时延。

这里直接参考W3Cschool上对http 1.1协议的讲解进行分析,上面我们简要的分析了访问百度需要的3个重要部分:请求-应答-数据传输。因此直接给出相关的结构:

请求行包含的信息:

方法:http请求包的请求类型

URL:URL (Uniform Resource Locator,统一资源定位符),类似于文件系统中的路径,URL就是网络资源在internel上的地址路径

版本: 当前使用的http协议的版本不同,因为不同版本可能协议的实现程度不一致,比如HTTP1.0请求类型就不支持OPTIONS等

回车换行结束

 

方法类型:

URL:例如/hello.txt;  /index.html;  /test.mp3等

版本:HTTP/1.0或HTTP/1.1

请求头部包含的信息:请求头部的一些属性参数,采用了key-value键值对的方式设置,如date、cookie等

回车换行结束

头部可以分成三个部分,为常用头域、请求头域、实体头域。其中常用头域和实体头域部分内容在响应协议部分也有相同的定义。

常用头域):

请求头域):

实体头域):

 

这里书中特别说明了请求头域中的host属性:

这里我们可以通过这个简单的请求头发现很多有效的信息:

请求行:GET(type)   /somedir/page.html(url)    HTTP/1.1(version)

请求头:host:www.someschool.edu (访问的域名)

    Connection:close (关闭长连接,使用短连接)

User-agent: Mozilla/5.0 (使用的Firefox浏览器)

Accept-language: fr (希望得到请求对象的法语版本,如网页多语言的实现)

这里是否有一个疑问?http传输协议是在tcp连接建立之后进行传输的,这时候终端与服务器之间已经存在一条TCP通信链路,为什么还需要指定host属性,这里额外补充的是web缓存机制,类似于cpu中的cache机制,用户可以配置浏览器将所有http请求指向web缓冲器,当用户访问百度时,会先进行与web缓冲器进行tcp连接,并对请求的资源进行搜索,如果存在即直接返回资源,如果没有则使用host参数由web缓存器重新建立域名ip之间的tcp连接,由缓存器获取资源后自我备份后再返回给用户终端,这样就极大的改善了服务器的负荷和用户的访问速度。

但是这里又会产生另一个问题,缓冲器上面的数据可能是陈旧的,服务器上的资源已经被修改,针对这样的一个问题,http定义了一个类似于时间戳查询的协议,美名其曰:条件GET

在浏览器请求资源并且此资源在缓存器中存在时,缓存器会使用:if-Modified-Since属性对服务器上的资源进行时间戳对比,如果不匹配服务器会在应答包中重新传输资源。

如果服务器资源没有更新,服务器响应报文:

请求数据:html文本、媒体数据等

状态行包含的信息:

版本:HTTP/1.0或HTTP/1.1

状态码:响应结果定义码

原因短语: 输出结果原因

响应头部包含的信息:响应头部的一些属性参数,仍采用了key-value键值对的方式向客户端相关信息。

到这里我们终于介绍完了http协议相关的内容,针对http协议还是非常容易理解的,这里直接盗图一张,俗话说:一图胜千言。下一篇我们将使用linux c简单的模拟一个web服务器。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值