在上一篇已经提到过, 计算机网络, 最核心的功能就是个产生信息, 发送信息.而并不关注其中的接受方究竟是人, 机器.
而协议, 就是双方约定的 可以表达一定含义的 消息内容. 符合协议的, 就能够被机器解读, 并进行下一步操作, 可能还会返回一定的响应内容.
而应用层, 有相应的服务器, 和客户端. 而服务器及客户端也可能处于同一台设备上. 角色也可能会相互转换.
在P2P中, 每一方都即是接收者, 又是发送者. 因此就充当了服务器和客户端的两个角色.
但在这里, 并不打算对应用层的协议本身进行过多的探讨, 在初次接触的过程中, 对整体脉络的把控对我而言更为重要, 至于其中的细节, 反倒无需牵扯太多精力. 如果有兴趣, 不如看看对应的 RFC文档, 都有极为详尽的描述.
在应用层之下, 是传输层. 数据从客户端产生, 通过套接字(Socket)向 传输层发送数据, 当数据流转到 服务器时, 服务器同样通过套接字接受数据, 解读, 并响应. 在一个传输过程中, 主动发起请求的被称为客户端, 而处于等待状态的则是服务器.
而套接字则是运输层和应用层之间的接口. 这样就很好地将两层分离开来.
而协议主要有以下几种:
-
HTTP(超文本传输协议),在web和服务器之间进行通信的协议. 这之间的过程简化来说就是, HTTP向服务器发起请求, 服务器接受请求, 并按照自己的处理方式, 在服务器上找到相应的文件(html, css, js等其他文件), 返回并传输相应的页面交给浏览器进行解读, 最终显示在浏览器上.
在这里, 客户端请求的资源主要是页面, 以及与页面相关的渲染文件.
而在这里, 大多情况下使用的是TCP可持续链接, 稍后再提.且需要提到的一个概念是HTTP是无状态协议, 也就是并不保存相应的信息, 每一次请求都会被当做一次全新的请求, 不记录用户的身份标识等其他. 但在web开发的过程中, 却又明显感觉这是有状态的, 记录了用户的身份标识. 记录了当前会话, 这又是怎样一回事呢?
这就不得不提到Cookie, 无论是会话的SessionID, 又或是其他的登陆状态等等信息, 甚至包括个人喜好浏览等等都保存在相应的 cookie中, 才能够对你进行甄别, 如果你关闭了cookie, 大多数网站你都无法进行登陆, 因为无法保存你的登陆状态, 每一次请求都会被当成是一次全新的会话进行处理(保有疑问,对会话的低层机制不是非常了解), 除非在每次请求相应都在参数中传递相应的信息(.).
cookie是怎样被传递的呢?也是定义在协议中的东西, 需要在响应头中添加, Set-cookie 键, 传输相应的值, 被浏览器解读.
但可持续链接与不可持续又该怎样理解呢?
如果你请求一个网页, 网页中含有9个CSS及JS文件, 加HTML文件本身就有10个文件, 因此在非持续性链接中, 总计就需要创建10次TCP链接, 传输相应的文件, 每次TCP链接又都需要进行相应的TCP握手, 断开连接等流程, 增加不必要的时间, 因此默认采取了可持续链接, 在一个TCP链接中传输所有的10个文件, 同时在 HTTP超时后, 断开相应链接.
-
SMTP(简单邮件传输协议);
P2P(对等传输), 每一个文件的下载者又作为相应的上传者贡献资源, 加快传输速度;
FTP(文件传输协议), 与HTTP不同的是, 保有两条TCP链接, 一条用来传送文件, 另一条为控制连接, 传输相应的登陆校验信息, 同时传递一部分指令, 用以在服务器的文件目录进行移动, 同时更改目录结构. 同时TCP链接 会在每次需要传送一个文件时创建, 传送结束之后关闭(无论传送方向是什么).
-
DNS(Domain Name System), 域名系统.
DNS是一个由分层的DNS服务器实现的分布式数据库, 是一个使得主机能够查询分布式数据库的应用层协议.
我们在日常生活中访问网址所使用的都是用的是主机名或者IP地址的方式, 更多的人倾向于使用主机名, 如 www.baidu.com 通过这样的方式去访问百度的主页. 因为便于记忆. 但同样也可以 通过61.135.169.125访问百度主页. IP的一台设备在网络中的唯一标识, 通过局域网的方式, 可以做到IP复用, 但是在公网上的IP地址却是绝对的唯一, 通过一个Ip只能定位到一台主机.
那么既然Ip是唯一标识, 又如何通过主机名访问到对应的主机呢? DNS, 将主机名映射到对应的IP. 也就是说, 事实上当我们在浏览器上输入 www.baidu.com 的时候, 并不是首先向对应的服务器发起请求.而是:
先将主机名发送至本地DNS服务器, 可能在公司, 校园网等地方. 在本地DNS服务器中如果能够找到对应的 主机名映射(或者知道去哪里能够找到对应的映射), 就直接返回IP地址, 否则的话则是向 根DNS服务器发起请求.
根DNS服务器告知本地Dns服务器该向某个 *域DNS服务器(TLD, 如.com .net .edu .org等其他)发起请求, 而后本地服务器再度向TLD发起请求, TLD告知应该去哪个权威服务器找到对应的映射( 多数大学公司会维护自己的权威DNS服务器).
最后本地服务器向权威DNS服务器请求查找到对应的IP地址.
这样就找到了真实的IP地址, 而后再向对应的IP发起HTTP请求.
但这同样会存在问题, 我们每次访问一个网站, 都需要经过8次请求响应才能定位到最终的地址. 这无疑是不合适的, 因此会存在DNS缓存, 如果地址被访问, 且不在相应的列表中, 最终会添加进来, 否则可以直接返回对应的IP地址.
我们常常会遇到的QQ可以登录, 而网页无法访问, 邮件无法发送, 正是因为这两者都是通过DNS转换域名, 而其他的程序则明确知道对应的IP,端口. 可以进行访问.
当你配置一个错误的DNS时, 依然可以通过61.135.169.125 访问百度的首页.