文章目录
使用c表示client客户端;
使用s表示server服务器;
1、生成HTTP请求消息
1.1 URL
【URL】:如http://开头的一串网址;
- FTP:文件传输协议,端口为25;
- HTTP:超文本传送协议,Web服务器,端口为80;
- URL中包含域名、文件路径、以及参数;
URL解析:
【解析】:URL的格式多种多样,伴随着协议的不同而不同;
【URL中省略文件名的情况】:
- 以`/dir/`结尾的URL:表示后续还有文件名但本省略了;(由于事先再服务器上设置的默认文件名)
- 以`.com/`结尾的URL:表示访问一个名为`/`的目录,文件名省略;
- 以`.com`结尾,当没有路径名时,代表已设置好访问根目录下的默认文件;
- 以`/name`结尾,该name可以为文件名或者目录;
1.2 HTTP基本思路
当解析完url即可使用HTTP协议来访问Web;
【基本思路】:首先c会向s发送请求消息(对什么和进行怎样的操作);
- 其中对什么(访问目标)被称为【URI】;
- 而进行怎样的操作(让Web server完成什么工作)被称为【方法】;
【URI】是一个存放网页数据的文件名或一个CGI程序的文件名,也可直接使用URL来作为URI;
- 【CGI】:对Web Server调用其他程序的规则所做的定义;
HTTP请求
【GET】:能够发送只有几百个字节;
【POST】:超过几百个字节需POST发送;
方法 | HTTP1.0 | HTTP1.1 | 含义 |
---|---|---|---|
GET | yes | yes | 获取URI指定的信息,URI为文件,则返回文件内容;若为CGI程序,则返回程序的输出数据 |
POST | yes | yes | 从c向s发送data; |
HEAD | yes | yes | 和GET基本相同,但其只返回HTTP的消息头,不返回数据的内容,用于获取文件最后更新时间等信息 |
OPTIONS | yes | 用于通知或查询通信选项 | |
PUT | yes | 替换URI指定的服务器上的文件,若URI不存在,则创建该文件 | |
DELETE | yes | 删除URI指定的服务器上的文件 | |
TRACE | yes | 将s收到的请求行和header直接返回给c;用于在使用代理的环境中检查改写请求的情况 | |
CONNECT | yes | 使用代理传输加密消息时使用的方法 |
当c向s发送数据时,会先发送头字段,在发送数据;s收到请求后,进行解析,通过URI和方法执行,将结果存放在响应消息中;
【GET请求】:请求消息中写上Get方法,在URI中写上存放网页数据的文件名,表示要获取该文件的数据;当Web s收到请求后,
读取该文件的数据,存放到响应消息中,并返回给客户端;
【POST请求】:URI会指向Web s中允许的一个应用程序的文件米,在请求中,需要另外加上表单信息,Web s收到请求后将消息发送给URI中指定的程序,后Web s从该程序中接收结果,放到响应消息中;
1.3 生成HTTP请求消息
当解析了URL后,浏览器确定了Web服务器和访问路径,在根据这些信息生成HTTP请求消息;
- 【请求行】:告诉Web s应进行怎样的操作末尾需要加上HTTP版本号;
- 【消息头】:用来存放额外信息;
- 【空行】:在下完消息头后;
- 【消息体】:GET方法不需要;
-
常用字段
1.4 发送请求后会收到响应
响应信息上第一行的内容为状态码和响应短语,告知程序的执行结果;
【含义】:
1xx:告知请求的处理进度和情况;
2xx:成功;
3xx:表示需要进一步操作;
4xx:客户端错误;
5xx:服务端错误;
当网页中含有图片的请求
当网页含有图片时,遇到HTML内有图片相关标签,则会预留图片空间,然后再次访问Web s获取图片;
- 每个请求消息只能写一个URI,每次只能获取1个文件,若要获取多个文件则需要对每个文件单独发送一条请求;
2、向DNS服务器查询Web服务器的IP地址
2.1 IP地址
扫描二维码关注公众号,回复:
14208349 查看本文章

当生成HTTP消息后,需要委托系统将消息发送给Web s,但还需要先查明服务器域名对应的IP地址;
- 我们通过IP地址判断出访问对象服务器的位置,从而将消息发送到服务器
2.2 为什么域名和IP地址并用及DNS如何查询IP
从效率上,使用IP在路由的转发上效率更高;
如果Web服务器使用了虚拟主机功能,可能不误通过IP地址来访问;
中间借用DNS未桥梁,在域名和IP之间进行转换;
2.3 Socket库提供查询IP地址的功能
Socket库中有一个解析器,向DNS发送查询消息,并接收返回的响应消息;
在C中调用Socket库中的gethostbyname,并传入域名,即可取出IP地址,将其写入浏览器的内存中;
内部原理
解析器委托操作系统内的协议栈向DNS发送查询消息,协议栈会执行发送消息的操作,然后通过网卡将消息发送给DNS
服务器;
【协议栈】:操作系统内部的网络控制软件;
【DNS服务器】:其IP地址已被事先设置;
DNS基本工作
基本工作:接收来自客户端的查询消息(查询域名和记录类型相关的记录),然后根据消息的内容返回响应;
【客户端的查询消息类型】:
- 域名;
- Class:用来识别网络的信息
【IN】表示互联网;
- 记录类型:表示域名对应何种类型的记录,
【A】表示域名的IP地址;
【MX】表示邮件服务器;
域名层次结构
DNS域名用句点分隔:(www.baidu.com)句点分隔开的为不同层次的界限(越靠右的位置其层级越高);
- 一个层级的部分称为域;故上述网址中:顶层为com域,下一层为baidu域....;
- 具有层次结构的域名信息会注册到DNS服务器中,一个域的信息可作为一个整体存放在DNS中(不可拆分);
- 可创建下级域供下级使用;
- 根域为DNS服务器最顶层,任何DNS都能够访问;
寻找相应的DNS获取域名IP地址
下级域一般将其DNS服务器的IP地址注册到上级DNS中;故我们将从上级查询;
- 首先c将会访问最近的一台DNS服务器,若最近的没有存放该网址对应的域名,故从顶层向下查找;
通过缓存加快DNS服务器的响应
一台DNS服务器能够管理多个域的信息,其具有缓存功能(具有时效性),提高后续访问速度;
2.4 委托协议栈发送消息
当知道IP地址后,就可以委托操作系统内部的协议栈向目标IP发送消息(HTTP消息是一种数字消息);
- 使用Socket来进行收发数据,将数据送入管道,在从另一端取出,该数据流动是双向的;
【连接】:
首先双方通信要建立管道,其出入口称为套接字,即先创建套接字形成管道;
服务器创建好套接字后等待客户端连接,客户端的套接字创建成功后即可连接上,随后即可通信;
【断开】:
当数据全部发送完毕后,管道将会被断开,在连接时由客户端发起,断开时可由任意一方发起;
只要其中一方断开,则另外一方也会被断开,紧接着套接字也会被删除,即通信结束;
【步骤】:创建套接字 - c连接s - 收发数据 - 断开管道删除套接字(该操作都由系统协议栈来执行);
创建套接字
创建套接字只需调用socket即可,创建成功后会返回一个描述符;
- 描述符:用来识别不同的套接字;
连接阶段
使用connect即可,需要传入描述符、服务器IP地址和端口号;
- 描述符:创建套接字所返回的;
- 服务器IP地址:通过DNS服务器查询;
- 端口号:自己指定,在创建套接字时,协议栈会随机分配一个,在连接时,会将这个端口号通知给服务器;
收发数据
发送数据使用write即可,需要指定发送的数据以及描述符,将数据送入套接字;
接收数据使用read即可,需要指定存放接收响应消息的内存地址(接收缓冲区);
断开阶段
Web服务器发送响应消息后,应主动执行断开操作,web服务器会先调用close来断开,该操作传达到后,c的套接字也会进入断开阶段;
- 重复的断开和连接效率会很低,后续在HTTP1.1后可以使用一次连接多次请求和响应;