2.1 应用层协议原理
    研发网络应用程序的核心是写出能够在运行在不同的端系统 且 通过网络彼此通信的程序。根据应用程序在各种端系统上的组织形式,可分为“客户-服务器体系”结构和“对等(P2P)”体系。
    迅雷、Skype、BT
    进程通信
    客户、服务器
    进程和计算机网络之间的接口—套接字
    套接字是进程和传输层协议之间的接口
    进程寻址:IP地址+端口号
    可供应用程序使用的运输服务:
    当发送端的应用程序将报文推进套接字时,在套接字的另一侧,运输层协议负责使报文进入接收进程的套接字。许多网络提供了多种运输层协议,我们必须从中选择一种适当的。

    • 可靠数据传输:确保发送的数据正确,完全地交付。但是对一些可以容忍丢失的应用,如多媒体应用,就可以使用不提供可靠数据传输的服务。
    • 吞吐量:具有吞吐量要求的应用程序称为带宽敏感应用,例如多媒体应用。而弹性应用能根据情况调整可供使用的吞吐量,如电子邮件,文件传输等。
    • 定时:例如对发送方注入进套接字中的每个比特到达接受方的套接字在多少时间之内。
    • 安全性:发送方加密,接受方解密。

    容忍丢失的应用—如音频、视频应用
    因特网提供的运输服务:

    • TCP 服务:

    面向连接的服务:在应用层数据报文开始流动之前,TCP让客户与服务器互相交换运输层控制信息。
    可靠的数据传送服务:依靠TCP交付所有发送的数据。注:TCP还具有拥塞控制机制。TCP没有提供加密机制,SSL是TCP的安全加强版(属于应用层)

    • UDP 服务:没有握手过程,没有拥塞控制机制,提供一种不可靠数据传输服务。

    没有用拥塞控制机制、不控制顺序(有可能乱序)

    • 因特网运输协议不提供的服务:因特网通常可以为时间敏感应用提供满意的服务,但不提供任何定时或带宽保证。

    应用层协议:
    定义了运行在不同端系统上的应用程序进程如何相互传递报文。

    • 交换的报文类型
    • 各种报文类型的语法
    • 字段的语义
    • 一个进程何时以及如何发送报文

    有些应用层协议是由RFC文档定义的,因此它们位于公共域中。应用层协议只是网络应用的一部分。
    公共域、专用域应用层协议
    Web和HTTP
    Web的应用层协议是超文本传输协议(HTTP),它是Web的核心。HTTP由一个客户程序和一个服务器程序实现,HTTP使用TCP作为它的支撑运输协议。
    注:服务器向客户发送被请求的文件,而不存储任何关于该客户的状态信息,所以说HTTP是一个无状态协议(stateless protocol)。
    两种连接方式:

    • 非持续连接:每个TCP连接在服务器发送一个对象后关闭,即该连接不为其他的对象而持续下来。每个TCP连接只传输一个请求报文和一个响应报文。
    • 持续连接:HTTP的默认方式。服务器在发送响应后保持该TCP连接打开。

    HTTP报文格式 P70
    请求报文:请求行+首部行
    GET
    POST
    HEAD 调试
    PUT 向服务器上传对象
    DELETE 删除服务器上对象
    响应报文:请求行+首部行
    状态行:协议版本+状态码+短语(OK)
    常见状态码
    用户与服务器的交互:cookie
    cookie用于标识一个用户
    cookie有四个组件:
    1、在HTTP响应报文中的一个cookie首部行;
    2、在HTTP请求报文中的一个cookie首部行;
    3、在用户端系统中保留一个cookie文件,并由用户的浏览器进行管理;
    4、位于Web站点的一个后端数据库。
    Web缓存:
    也叫代理服务器,是能够代表初始Web服务器来满足HTTP请求的网络实体,它有自己的磁盘存储空间,并在缓存器中保存最近请求过的对象的副本。Web缓存器是服务器同时也是客户。
    Web缓存器可以大大减少客户请求的响应时间,特别是当客户与初始服务器之间的瓶颈带宽远低于客户与Web缓存器之间的瓶颈带宽时更是如此。另外,Web缓存器能够大大减少一个机构的接入链路到因特网的通信量。
    CDN 内容分发网络Content Disributed NetWork
    条件GET方法:P77
    保存在缓存器中的对象副本可能是旧的,条件GET方法用来证实缓存器中的对象是最新的。
    如果请求报文使用GET方法,并且请求报文中包含一个“if-Modified-Since:”首部行。那么这个HTTP请求报文就是一个条件GET请求报文。
    2.3文件传输协议
    FTP 使用两个并行的TCP连接来传输文件,一个是控制连接(control connection,21端口),一个是数据连接(data connection,20端口)。控制连接贯穿了整个用户会话期间,但是对会话中的每一次文件传输都需要建立一个新的数据连接(即数据连接是非持续的)。FTP服务器必须在整个会话期间保留用户的状态,而HTTP是无状态的。
    HTTP 带内传送,是无状态的
    FTP 带外传送,必须对整个会话期间保留用户的状态。
    20端口,用于数据传输,都是由服务器主动连接来客户端的。每次要新传输一个文件,都要建立一个新的数据连接。
    因特网中的电子邮件
    由三个部分组成:用户代理,邮件服务器,简单邮件传输协议(SMTP)。
    SMTP 是因特网电子邮件应用的核心。SMTP一般不使用中间邮件服务器发送邮件。
    SMTP和HTTP的区别:
    1、HTTP是一个拉协议(pull protocol),TCP连接由想接收文件的机器发起。而SMTP是一个推协议(push protocol),TCP连接由要发送文件的机器发起。
    2、SMTP要求每个报文使用7个比特ASCII码格式,而HTTP不受限制。
    3、HTTP把每个对象封装到它自己的HTTP响应报文中,而SMTP则把所有报文对象放在一个报文中。
    邮件访问协议:由于SMTP是一个推协议,接受方的用户代理不能使用SMTP取回邮件服务器上的邮件,于是引入了一些邮件访问协议。POP3 和IMAP
    SMTP发送方的邮件服务器传输到接受方的邮件服务器;SMTP也用来将邮件从发送方的用户代理传输到发送方的邮件服务器;然后邮件访问协议用来将邮件从接受方的邮件服务器传输到接受方的用户代理。
    POP3:一个非常简单的邮件访问协议。通过打开一个到邮件服务器端口110上的TCP连接开始工作,有三个阶段:特许,事务处理和更新。
    IMAP:IMAP服务器把每个报文与一个文件夹联系起来,收件人能够把邮件移到一个用户创建的文件夹中,浏览邮件,删除邮件等。另外它还具有允许用户代理获取报文组件的命令。
    注:IMAP服务器维护了IMAP会话的用户状态信息。
    基于Web的电子邮件:用户代理就是浏览器,用户和他的远程邮箱之间的通信用HTTP进行。
    DNS:因特网的目录服务
    识别主机有两种方式:主机名或者IP地址。
    DNS Domain Name System域名系统
    DNS是:1、一个由分层的DNS服务器实现的分布式数据库;2、一个使得主机能够查询分布式数据库的应用层协议。
    DNS服务器通常是运行在BIND软件的UNIX机器,DNS协议运行在UDP上,使用53号端口。
    DNS提供的另外的服务:1、主机别名;2、邮件服务器别名;3、负载分配。
    分布式、层次数据库:根DNS服务器 > 顶级域DNS服务器 > 权威DNS服务器。
    0注:本地DNS服务器也是重要的组成部分。
    一般的DNS查询中,从请求主机到本地DNS服务器的查询是递归的,其余查询是迭代的。
    递归查询和迭代查询的区别
    (1)递归查询
    递归查询是一种DNS 服务器的查询模式,在该模式下DNS 服务器接收到客户机请求,必须使用一个准确的查询结果回复客户机。如果DNS 服务器本地没有存储查询DNS 信息,那么该服务器会询问其他服务器,并将返回的查询结果提交给客户机。
    (2)迭代查询
    DNS 服务器另外一种查询方式为迭代查询,DNS 服务器会向客户机提供其他能够解析查询请求的DNS 服务器地址,当客户机发送查询请求时,DNS 服务器并不直接回复查询结果,而是告诉客户机另一台DNS 服务器地址,客户机再向这台DNS 服务器提交请求,依次循环直到返回查询的结果
    为止。
    DNS缓存:改善时延性能并减少在因特网上到处传输的DNS报文数量。
    DNS记录和报文:共同实现DNS分布式数据库的所有DNS服务器存储了资源记录(RR),RR提供了主机名到IP地址的映射。
    资源记录是一个包含了下列字段的4元组:(Name, Value, Type, TTL)。
    Name 和 Value 的值取决于 Type :

    • Type=A时,Name是主机名,Value是该主机名对应的IP地址。这条记录提供了标准的主机名到IP地址的映射。
    • Type=NS时,Name是个域,Value是个知道如何获得该域中主机IP地址的权威DNS服务器的主机名。这条记录用于沿着查询链来路由DNS查询。
    • Type=MX时,Value是个别名为Name的邮件服务器的规范主机名。

    DNS数据库中插入记录
    nslookup命令
    DNS的安全性:显示了对抗攻击令人惊讶的健壮性
    2.6 P2P应用
    BitTorrent
    分布式散列表
    2.7 TCP 套接字编程
    Socket套接字提供给的接口是用于连接应用层和传输层,而实际上,开发者在应用层的一侧可以控制所有东西(业务逻辑),而对传输层的一侧基本上没有控制权。
    TCP是一个面向连接的协议,因此客户机和服务机在发送数据之前,必须通过“三次握手”建立连接:
    客户端套接字地址(客户端IP和端口号)与服务端套接字地址之间的链接。
    连接建立之后,只需要将数据推送给TCP连接就可以了(不需要再额外想分组中添加目标主机的IP和端口号)。
    “三次握手”和“四次挥手”是TCP连接中十分重要的过程,后面也会提到。
    欢迎套接字:所有要与服务器通信的客户的起始接触点
    连接套接字:随后为与每个客户通信而生成的套接字