思考重点
- 网页浏览器怎麽获取网站消息
- 当我们输入网时会发生什麽事
- 常见的404 not found意思
核心知识

主要流程
网页浏览器为了获取服务器上关于该网站的HTML文件,透过HTTP协议向服务器发起请求,不过我们在网页中是使用可以让人看得懂的域名地址,因此网页浏览器会调用socket库中关于获取DNS的函数,并把返回的IP地址与HTTP请求一併交给传输层,接下来作业系统会使用socket函数创建socket1、利用IP地址与Port(端口号)与服务器建立连线、收发封包、最后断开连结
HTTP
HTTP是甚麽?其实HTTP是超文本传输协定的缩写,那麽大家一定好奇它究竟是什麽意思,其实可以这样理解:
- 超文本
- 在早期文本指的是文字类型的内容,不过压缩资料、文字、图片这类内容在现在也可被HTTP视为是一种文本形式
- 超文本,例如常见的HTML是将图片、影片等内容的连结镶嵌在一份文件上,我们只需要向代表连结的服务器发出请求即可获取资料
- HTML的内容是多个文本的连结与文字内容,不过透过浏览器的解释,呈现给使用者的就是网页内容
- HTML文件中的连结不一定都指向不同的服务器端,有可能都存在于同一台服务器

-
传输
- 传输的定义是两个实体可以透过发送资料来达成沟通的目的
-
协定
- 一种约定俗成的沟通方式,详细请见[[计算机网路概述(一) 网路是甚麽#4 通讯协定]]
其实HTTP协议的核心概念就是,浏览器向指定服务器发出特定类型的需求,服务器再按照需求回传资料给浏览器。其实说到底就是针对谁做甚麽操作,谁指的是URI,而操作指的就是方法
当我们输入网址会发生甚麽事

上图示常见的URL格式,当我们在搜寻栏输入一连串http:// 开头字串时,这些网址准确的说就是URL(统一资源定位符),他不一定是要用http:// 作为开头,也可以是ftp://,这些都依照使用的应用程式而定
不过有人可能会好奇www.开头的是否是另一种网路协定呢?其实不是,www就是World Wide Web的缩写,是一种网页命名方式,他是早期用来开发网页以及HTML的编辑器名,算是一种历史传承吧
透过上图可以发现URL其实就是网页服务器中关于特定资料的文件路径,透过取得该文件,我们就可以再浏览器上显示出该网站的资讯了,不过网路的传输是使用所谓的IP地址,而非域名地址2,这部份我们会在DNS部分介绍
URL解析
我们紧接着把上图拆成5个部份来介绍,分别是:
- 协定名
- 应用层使用的通讯协定名称
- 身分认证讯息
- 使用者名称
- 密码
- 有些服务器会需要使用者的身分认证才允许访问
- 此项可省略
- 网路器域名
- 人们可以轻鬆看懂的网址格式,例如 www.yahoo.com.tw
- 端口号
- 指定服务器的端口号,若用户省略则使用预设端口号
- 网页预设端口号为80
- 此项可省略
- 文件路径名
- 类UNIX的文件系统表示法
- 指向请求资源在服务器端的位置
特殊表示法
但是可能有人会问,我在网址栏输入URL时只有打上 www.xxx.com 阿,并没有在字串尾部详细加上资源路径地址,这个URL是很精简没错,那麽到底服务器能不能找到确切资料?

一般来说URL会完整表示出档案路径,但是我们在浏览网页时常常会看到以/为结尾的路径名,其实URL的表达式可以允许文件名被省略,而且服务器会预先配置预设文件,假如文件名被省略的情况发生就去访问它,一般来说预设文件会是index.html或default.htm
- 例如选手A就会访问/dir/index.html文件
- 选手B直接连资料夹路径都省略了,只访问/3根目录,这种状况服务器会访问/index.html文件
- 选手C更过分,他连跟目录都没有告诉服务器,这种状况只要服务器有事先配置好预设文件,那结果也跟选手B一样会造访跟目录下的/index.html文件
- 选手D这个表达式更令人匪夷所思,它既不是/结尾的资料夹格式,也不是文件格式,那麽服务器该怎麽看待它呢?在这种情况下假如跟目录下有名为newitem的资料夹就以该资料夹下的预设文件来处理,若是跟目录下有名为newitem的文件名,则访问该文件
从这一部份可以带出网页浏览器的第一份任务→对URL进行解析,判断对谁进行操作
URL与URI的差别
我们先说说URI的定义,URI就是在某一规则下能把一个资源独一无二的表示出来,我们顺着这个思路来举个例子

假如我们透过学生证号来查询该名学生,这个学号是独一无二的,意思是在这个校园内不可能会有第二个拥有相同学号的学生,因此假若我们确切得知该生的学号那就一定可以确定是他 我们把焦点回到服务器上,例如文件名都有特定名称: xxx.html或是给该文件设定特定编号html: xxx
- 这种使用专属名称或编号来表示档案的方式就是URI的一种表达方式
同理我们使用绝对位置来寻找这名学生,透过电脑中遗留的线索发现他是哈哈大学电机系的学生,目前住在第二宿舍的301房2床,用这种绝对路径的方式也可以将该生找出来,且是独一无二的 这种表达方式我们并不陌生,例如 www.xxx.com.tw/dir/file/in… ,就是列出该文件的绝对路径
- 这种使用绝对路径来表达档案的方式是URL的达方式,但也符合独一无二的特性,所以也是URI的表达方式
相反的,我们若是用鬆散的资料来查找,例如王晓明同学,谁知道这个学校有几个王晓明?,电机系王同学会打排球?假如整个排球队都姓王勒?(别说不可能),这种没办法信誓旦旦地指出对方的方法就不属于URI

说到底URL其实也是URI的其中一种,它只是用路径定位的方式来表达唯一的文件,因此我们可以下一个结论: URL是URI的一个子集合
而在HTTP的发送请求中我们一般是将URL称作URI,不过我个人更偏好URL,因为这样从输入网址到解析URL,再到HTTP消息封装会更加直观好懂,除非真的访问一个有唯一编号名称的/dir/123456789.html文件
选择方法
所谓的method(方法)就是对服务器下达特殊的指令,决定对服务器进行什麽样的操作,我们称之为方法,服务器接收客户端请求后会按照方法来完成工作,以下介绍常见的几种方法
| 常见方法 | 含意 | 例子 |
|---|---|---|
| GET | 向服务器请求某个已经被URI定位的文件,目的是得到服务器返回响应 | GET /dir/index.html HOST: www.xxx.com.tw |
| POST | 客户端向服务器发送数据消息,一般来说在填表格或留言会用得上 | POST /submit.cgi HOST: www.xxx.com.tw Content-Length: 16004 |
| PUT | 更新服务器上被URI指定的文件,若是没有该文件则新创建一个 | PUT /file.html HOST: www.xxx.com.tw Content-Type: text/html Content-Length: 1600 |
| HEAD | 与GET方法类似,但只要求返回头部消息,多用在检查文件状态 | HEAD /dir/index.html HOST: www.xxx.com.tw |
| DELETE | 删除服务器上被URI指定的文件 | DELETE /dir/index.html HOST: www.xxx.com.tw |
| OPTIONS | 询问URI指定的资源支持那些方法 | OPTIONS* HOST: www.xxx.com.tw |
| TRACE | 服务器会返回它收到的请求。其目的是为了比对请求数据再传输过程中是否被窜改,Max-Foward字段在经过服务器时会减去1,直到变成0时则不再转发消息 | TRACE / HOST: www.xxx.com.tw Max-Fowards: 7 |
| CONNECT | 向代理服务器发起请求,要求建立TCP的Socket通道 | CONNECT proxy.xxx.com:8080 HOST: proxy.xxx.com |
浏览器发出请求

其实在浏览器上的不同操作会触发不同的方法,例如输入网址与发送表单使用的方法是不一样的。以下我们就大致介绍请求中各个区段的涵义
方法
如上一小节所描述,就是对服务器请求的种类,比较要注意的是该方法是否需要使用到消息主体
版本
浏览器使用的HTTP当前版本,常见如HTTP/1.1
首部字段
儘管方法已经告知服务器请求内容,但有些状况往往需要更具体的请求,例如日期、档案要多新、档案的长度、档案的压缩类型等等,这些就是首部字段的功用,作为方法的补充,再请求中常会见到3种首部字段,分别是请求首部字段、通用首部字段、实体首部字段5
为请求方法附加更多详细内容的字段就是请求首部字,例如接受的文件类型、语言、长度等等
| 请求首部字段 | 含意 |
|---|---|
| Accept | 可接受的文件类型 |
| Accept-Encoding | 可接受的编码 |
| Accept-Language | 可接受的语言 |
| If-Modified-Since | 获取资源的更新状态 |
| If-Range | 若资源未更新时发送具有范围的请求 |
| Range | 若资源未更新则依照这个范围的byte作为请求 |
通用首部字段就是请求与响应都会用到的首部字段,例如日期、选用连线状态等等
| 通用首部字段 | 含意 |
|---|---|
| Cache-Control | 控制服务器缓存 |
| Connection | 使代理删除首部字段与持久连接控制 |
| Date | 创建封包的时间消息 |
| Pragma | 通常用在不接受缓存消息上 |
| Transfer-Encoding | 指定封包编码方式 |
| Upgrade | 检查是否要更高版本的协定可用 |
补充请求与响应的消息主体附加讯息
| 实体首部字段 | 含意 |
|---|---|
| Content-Encoding | 消息主体的编码方式 |
| Content-Language | 消息主体使用的语言 |
| Content-Length | 消息主体的大小 |
| Content-Range | 消息主体的资料范围 |
| Last-Modified | 资源的最后修改时间 |
消息主体
所有使用者需要的消息以及欲收发的文件都包含在这裡
消息主体部分就会依照方法来决定是否要启用,例如PUT与POST方法就需要加入一个文件到消息主体中,而GET仅需要方法、版本、首部字段就可以进行传输了
响应格式

服务器完整收到客户端发送来的请求后会依照请求方法来处理资料,并将文件处理的结果以及客户端所需要的资料连同首部字段返回给客户端,该资料封包就称为HTTP响应,其实HTTP响应与HTTP请求只差在状态行与方法,剩下的首部字段与消息主体逻辑是雷同的
版本
同请求部分,只是响应的版本资讯放在第一个
状态行

状态码就是服务器处理请求时的状态描述,例如我们常见的404 not found就是服务器无法找到请求的资料位置的状态回报,如上图所示,我们会大概介绍一下常见的几种状态码以及他们的含意
1XX
1xx为一种过渡阶段,表示请求正在处理中,不过这个状态码比较少见
2XX
2xx表示客户端请求已经被指定服务器接收,并且正确的处理,这是我们最想看见的结果,常见的状态码有:
| 状态码 | 含意 | 备註 |
|---|---|---|
| 200 OK | 表示请求被正确处理,服务器依照需求返回客户端需要的数据 | -- |
| 204 No Content | 请求被处理成功,但返回的响应不包含消息主体 | 一般运用在客户端发送请求但不需要返回响应时 |
| 206 Partial Content | 响应返回成功,但返回的消息主体只是整个消息主体的其中一部分 | 常见于HTTP的分批下载与断点续传 |
3XX
目标资源位置发生变动,需要客户端进行重定向处理
| 状态码 | 含意 | 备註 |
|---|---|---|
| 301 Moved Permanently | 访问的该资源已经永久移到别处,需要使用新的URI访问 | 响应会附加Location首字段标示新的URI |
| 302 Found | 资源找到了,但暂时需要用另一个URI访问 | 响应会附加Location首字段标示新的URI |
| 304 Not Modified | 服务器允许请求访问资源,但资源并不符合请求的附加条件 | 其实该条状态码与重定向无关,另外响应不包含消息主体部分 |
4XX
客户端在访问服务器时发生错误或缺乏权限
| 状态码 | 含意 | 备註 |
|---|---|---|
| 400 Bad Request | 客户端发送请求格式错误,服务器无法理解 | -- |
| 403 Forbidden | 客户端没有权限访问该笔资源 | -- |
| 404 Not Found | 服务器不存在该资源 | -- |
5XX
服务器在处理请求的过程中发生错误,返回响应让客户端知道
| 状态码 | 含意 | 备註 |
|---|---|---|
| 500 Internal Server Error | 服务器在处理请求时发生错误 | 也有可能是Web发生bug导致 |
| 501 Not Implemented | 服务器尚不支援该请求的功能 | -- |
| 503 Service Unavailable | 服务器忙碌中,暂时无法处理客户端请求 | 服务器会返回带有Retry-After首部字段的响应,告诉客户端等等再发送一次 |
首字段
服务器响应中的首字段与请求大致相同,主要差别在响应首部字段。不过这并不并代表同一个请求与响应的通用首部字段与实体首部字段会完全相同,还是要依据消息状态类型来判断,只是说两边都有可能使用到相同的共用首字段,例如Date字段
响应首部字段多用于补充资料消息以及告诉客户端收到响应该做什麽
| 响应首部字段 | 含意 |
|---|---|
| Accept-Ranges | 是否可以接受范围请求 |
| Age | 告诉客户端服务器在多久之前创立响应 |
| Location | 告知客户端重定向URI位置 |
| Retry-After | 告知客户端多久以后再发起请求 |
消息主体
响应的消息主体就是服务器依照客户端请求返回的文件或资料,消息主体的内容会以二进制方式表示
总结
最后我们可以利用这张简单的示意图来回想客户端是如何利用HTTP协定与服务器沟通,从而获得某个网站的页面(该页面有一个名为abc的图档)
