《TCP/IP详解》卷一

发布于 2017-09-27 11:47:37

  • 分层结构
    • 应用层
      • 协议
        • Telnet、Rlogin:远程登录
        • FTP:文件传送协议
        • SMTP:简单邮件传送协议
        • SNMP:简单网络管理协议
        • DNS:域名系统
          • 使用的传输层协议
            • TCP
              • 当名字解析器发出一个查询请求,并且返回响应中的 TC(删减标志)比特被设置为1时,它就意味着响应的长度超过了512个字节,就会用TCP重新请求
              • 辅域名服务器会定时(一般时3小时)向主域名服务器进行查询以便了解数据是否有变动
                • 数据量大
                • 保证准确性
            • UDP
          • 报文格式
            • 查询报文的问题部分
            • 响应报文的资源记录部分
              • 回答字段
              • 授权字段
              • 附加信息字段
            • 类型
              • A:IP地址
              • NS:名字服务器
              • CNAME:规范名称
              • PTR:指针记录
                • 指针查询: 给定一个IP地址,返回与该地址对应的域名
                • IP地址被看作是in-addr.arpa域下的一个域名(标识符串)
                • host <ip>
              • HINFO:主机信息
              • MX:邮件交换记录
                • 16bit的优先值
          • 名字解析器
            • 递归解析
          • 名字服务器
            • 提供缓存
          • nslookup命令
        • TFTP:简单文件传送协议
          • 基于UDP;和基于TCP的FTP相对应
          • 适用
            • 只读存储器
            • 无盘系统进行系统引导
          • 没有提供安全特性
        • SFTP
        • BOOTP:引导程序协议
        • NFS:网络文件系统
        • X窗口系统
          • 客户-服务器应用程序
          • 服务器是一个软件,用来管理显示器、键盘和鼠标
          • 客户是一个应用程序,它与服务器在同一台主机上或者在不同的主机上
          • 如果在不同主机上,客户与服务器之间通信的通用形式是TCP
    • 传输层
      • 为两台主机提供端到端的通信
        • 协议
          • TCP
            • 概论
              • 把数据分成小块(段,segment)交给网络层,确认接收到的分组,设置确认超时时间
              • 提供面向连接的、可靠的字节流服务
              • 不支持广播和多播
              • 对每个段开启定时器
              • 对确认的延迟发送
              • 保持数据和首部的检验和
                • 应用于端到端
                • 丢弃并不发送确认,利用超时来重发
              • 对收到数据段重新排序
              • 丢弃重复数据
              • 流量控制:两端都有缓冲,接收端只允许发送端发送所能接纳的数据
              • 两个应用程序通过TCP连接交换8 bit字节构成的字节流
                • 一端将字节流放到TCP连接上,同样的字节流将出现在TCP连接的另一端
                • 不对内容作解释
              • 首部结构(20字节)
                • 16位源端口号
                  • 最大65535
                  • 加上IP首部的IP地址确定一个TCP连接
                  • 一个IP和一个端口合称为一个插口(socket);衍生出插口对(socket pair)
                • 16位目的端口号
                • 32位序号
                  • 0 ~ 2^32-1
                  • 连接建立时的序号成为初始序号ISN(initial sequence number)
                  • 该主机要发送数据的第一个字节序号为这个ISN加1,因为SYN标志消耗了一个序号
                • 32位确认序号
                  • 包含发送确认的一端希望收到的下一个序号
                  • 确认序号应当是上次已成功收到数据字节序号加 1
                  • 只有ACK标志为1时此序号有效
                  • 发送ACK无需任何代价
                    • 我们看到一旦一个连接建立起来,这个字段总是被设置
                    • ACK标志也总是被设置为1
                  • 因为TCP是全双工的,每一端必须保持每个方向上的传输数据序号
                  • TCP可以表述为一个没有选择确认或否认的滑动窗口协议
                    • 没有选择确认:仅对每个独立的段进行确认,忽略收到的其他段
                      • 存在可能重复发送的隐患?
                    • 没有选择否认:只能简单的发送希望收到的下一个段
                • 4位首部长度
                  • 20字节+任选字段
                • (保留6位)
                • 6标志
                  • URG
                    • 紧急指针(urgent pointer)有效
                  • ACK
                    • 确认序号有效
                  • PSH
                    • 接收方应尽快将这个报文段交给应用层
                  • RST
                    • 重建连接
                  • SYN
                    • 连接建立
                  • FIN
                    • 发送端完成发送任务
                • 16位窗口大小
                  • 单位是字节
                  • 最大65535字节
                • 16位检验和
                  • 覆盖TCP首部和TCP数据
                  • 计算方式和UDP类似,使用了伪首部
                • 16位紧急指针
                  • 紧急指针是一个正的偏移量,和序号字段中的值相加表示紧急数据最后一个字节的序号
                  • 紧急方式是发送端向另一端发送紧急数据的一种方式
                • (前面共20字节)
                • 选项
                  • 最长报文大小 MSS: maximum segment size
                • 数据
                  • 在一个连接建立和一个连接终止时,双方交换的报文段仅有TCP首部
                  • 在处理超时的许多情况中,也会发送不带任何数据的报文段
            • 连接的建立和终止
              • tcpdump格式
                • 源:目的:标志
                • 状态标志
                  • S SYN
                  • F FIN
                  • R RST
                  • P PSH
                  • . 以上四个比特均置零
                • 内容:分组序号:隐含的结尾序号(数据字节数)
                  • 显示条件
                    • 报文段至少包含一个字节
                    • S,F或R被设置为1
              • 三次握手四次挥手
              • 连接建立的超时
              • MSS
              • 半关闭
              • 状态变迁图???
              • 2MSL(maximum segment lifetime)等待状态:TIME_WAIT状态
                • RFC规定2分钟,现实30s、1min、2min
                • 当一端关闭连接,并发回最后一个ACK;该连接必须在此状态停留2MSL
                  • 目的
                    • 可让TCP再次发送最后的ACK以防丢失
                    • 另一端超时并重发最后的FIN
                  • 效果
                    • 这个等待期间,这个插口不能再被使用
                    • 任何迟到的报文都将被丢弃
              • 平静时间
                • TCP在系统重启后的MSL秒内不能重新建立任何连接
                • 不过很少被实现
              • 关闭连接
                • 客户端主动关闭
                  • FIN_WAIT_1:已发送FIN
                  • FIN_WAIT_2:已接收ACK
                  • TIME_WAIT:已接收FIN
                  • CLOSED
                • 服务器被动关闭
                  • CLOSE_WAIT:已接收FIN并发送ACK
                  • LAST_ACK:已发送FIN
                  • CLOSED
              • 复位报文段
                • 无论何时一个报文段发往基准的连接(referenced connection)(接口对)出现错误,TCP都会发出一个复位报文段?
                • 情况
                  • 到不存在的接口的请求
                  • 异常终止一个连接
                    • 丢弃任何待发数据并立即发送复位报文段
                    • RST的接收端判断是正常关闭还是异常关闭
                  • 检测半打开连接?
              • 同时打开
                • 需要每一方使用一个对方熟知的端口作为本地端口
                • TCP是特意设计为了可以处理同时打开,对于同时打开它仅建立一条连接而不是两条连接
                • SYN_SENT - SYN_RCVD - ESTABLISHED
              • 同时关闭
                • FIN_WAIT1 - CLOSING - TIME_WAIT
              • TCP选项
                • RFC 793 & 1323
                • kind=0:选项表结束
                • kind=1:无操作
                • kind=2:最大报文段长度
                • kind=3:窗口扩大因子
                • kind=4:时间戳
              • TCP服务器的设计
                • 服务器端口号
                • 限定的本地IP地址
                • 限定的远端IP地址(不常用)
                • 呼入连接请求队列
                  • TCP接受一个连接是将其放入这个队列(三次握手已经完成)
                  • 而应用层接受连接是将其从该队列中移出
                  • 应用层将指明该队列的最大长度,这个值通常称为积压值 (backlog)
                    • 它的取值范围是0 ~ 5之间的整数
                    • 这个积压值对系统所允许的最大连接数,或者并发服务器所能并发处理的客户数,并无影响
                    • 积压值和最大的排队连接数并不一定相等
                      • 传统的BSD系统为 积压值×3/2+1
                    • 空满情形
                      • 满:不理会SYN,不发回RST
                      • 空:三次握手后应用层才知道,这段时间空隙TCP收到的数据放入缓冲队列
            • 交互数据流
              • 经受时延的确认
                • 数据捎带ACK:以便将ACK与需要沿该方向发送的数据一起发送
                • 绝大数采用200ms
                • Nagle算法
                  • 要求一个TCP连接上最多只能有一个未被确认的未完成的小分组,在该分组的确认到达之前不能发送其他的小分组
                  • 插口API用户可以使用TCP_NODELAY选项来关闭Nagle算法
              • 窗口大小通告
                • 服务器通常通告窗口大小为8192个字节,这是因为服务器在读取并回显接收到的数据之前,其TCP没有数据发送。
            • 成块数据流
              • 因为Nagle,ACK可以确认两个收到的报文段
              • 滑动窗口协议
                • 接收方不必确认每一个收到的分组
                • ACK确认序号是积累的
                • 接收方的“滑动窗口”
                  • 三种动作
                    • 窗口合拢:左窗口只能右滑动,数据已被ACK
                    • 窗口张开:右窗口向右滑动,发生在接收端进程读取已经确认的数据并释放了TCP的接收缓存
                    • 窗口收缩:右窗口向左滑动,不常见
                  • 窗口大小
                    • 2048, 4096字节
                    • 接收方的窗口大小可以由接收进程控制,将影响TCP的性能
              • PUSH标志
                • 发送方使用该标志通知接收方将所收到的数据全部提交给接收进程
                • 包括与PUSH一起传送的数据以及接收方TCP已经为接收进程收到的其他数据
                • 如果待发送数据将清空发送缓存,则大多数的源于伯克利的实现能够自动设置PUSH标志
                • 无法对它的设置与否进行控制
              • 慢启动 slow start
                • 该算法通过观察到新分组进入网络的速率应该与另一端返回确认的速率相同
                • 发送方的拥塞窗口(congestion window),记为cwnd
                • 过程
                  • 初始化为1个报文段
                  • 每收到一个ACK就增加一个报文段,是一种指数增加的关系
                  • 发送方取拥塞窗口与通告窗口中的最小值作为发送上限
                  • 拥塞窗口是发送方使用的流量控制,而通告窗口则是接收方使用的流量控制
              • 通道容量
                • capacity(bit) = bandwidth(b/s) × round-trip time(s)
                • 带宽时延乘积
              • 拥塞
                • 大的管道向一个较小的管道发送时便会发生阻塞
              • 紧急方式
                • 如何设置
                  • URG比特被置1
                  • 并且一个16bit的紧急指针被置为一个正的偏移量
                    • 该偏移量必须与TCP首部中的序号字段相加,以便得出紧急数据的最后一个字节的序号
                • 人们常常错误地称其为“带外数据”
                • 只是一个从发送方到接收方的通知
                • 应用程序使用的有关紧急数据部分的编程接口常常都不是最佳的
            • 超时和重传
              • 对于每个连接,TCP管理4个不同的定时器
                1. 重传定时器
                  • 希望收到确认
                2. 持续(persist)定时器
                  • 保持窗口大小信息不断流动
                3. 保活(keepalive)定时器
                  • 可检测一个空闲连接的另一端何时崩溃或重启
                4. 2MSL定时器
                  • 测量一个连接处于TIME_WAIT状态的时间
              • 指数退避(exponential backoff)
                • 12次重传?最终发送RST
                • 从首次传输到复位信号传输的时间差为9分钟,在当前TCP实现中不可变
              • 往返时间(RTT)测量
                • 被平滑的RTT估计器,记为(O)
                  • 90%取自前一个估计,10%取自新的测量
                  • 重传超时时间RTO=Rβ,β是推荐值为2的时延离散因子
                  • 在RTT变化起伏很大时,基于均值和方差来计算RTO
                    • 差的线性因子比10%大,再加上4倍的被平滑的均值偏差
                    • 较大的偏差将使RTO快速上升
              • Karn算法
                • 重传多义性
                • 当一个超时和重传发生时,在重传数据的确认最后到达之前,不能更新 RTT估计器,因为我们并不知道ACK对应哪次传输?
              • Jacobson快速重传算法
                • 源于伯克利的TCP实现对收到的重复ACK进行计数,当收到第3个时,就假定一个报文段已经丢失并重传自那个序号起的一个报文段
                • 在重传后继续正常传输数据,并不需要等待对方的重传确认
                • 重传接收方在收到数据后,并不在意已收到的其他后续数据,只是无脑地返回重传数据尾序号加1的ACK
                  • 为什么这不会导致重复的数据重传?
                    • 由于通告窗口很大,发送方连续发送多个报文段
                    • 丢失一个报文段,后续报文段成功接收
                    • 重传丢失报文段后收到一个ACK
                    • 发送方需要重复发送后续报文段吗?
                      • 后续正常接收的失序报文段的数据被临时保存,但是产生的ACK序号却是和丢失的报文段一样
                      • 重复的ACK序号导致重传
                      • 接收到丢失的报文段后,响应一个对从丢失报文段到已接收的最末尾的报文段的一个确认
                        • 此时ACK序号发生巨大跳跃
                        • 发送方收到确认后,数据传输恢复正常的有序传输
                      • 问题
                        • 重复的ACK序号不会导致发送多次缺失报文吗?
                          • 缺失报文的确认超时?
                        • 多个缺失报文的情况会变得怎样复杂,如何简单化?
              • 拥塞避免算法
                • 是一种处理丢失分组的方法
                • 假设由于分组受到损坏引起的丢失是非常少的(远小于1%)
                  • 分组丢失则意味着中间网络发生了拥塞
                    • 发生超时
                    • 收到重复的确认
                • 拥塞发生时,希望降低分组进入网络的传输速率,调用慢启动来实现;拥塞避免算法和慢启动通常一起实现
                • 这两个算法对每个连接维持两个变量
                  • 拥塞窗口cwnd(拥塞限制)(对当前网络状态的估计)
                  • 慢启动门限ssthresh(对慢启动的限制)(避免对网络的冲击,是一种保守策略)
                    • 慢启动实际并不慢,而是指数形式增长cwnd;而cwnd将决定发送速率
                    • 这个门限就是对这个“快启动”进行控制
                • 过程
                  • 初始化:cwnd为1个报文段,ssthresh为65535字节
                  • TCP输出不能超过拥塞窗口大小(对网络的估计,网络优化的可能点)和接收方通告窗口大小(接收方缓存)
                    1. 拥塞发生时,ssthresh被设置为当前窗口大小(cwnd和通告窗口大小的最小值)的一半,至少为2个报文段
                    1. 慢启动:每个新报文段被对方确认时,就增加cwnd
                    • 两种情况
                      • cwnd <= ssthresh:慢启动状态
                        • 对每个确认,cwnd增加1报文段大小
                        • 窗口大小会指数式增长
                      • cwnd > ssthresh:拥塞避免状态
                        • 在一个往返时间内最多为cwnd增加一个报文段
                        • 线性增长
              • 快速重传和快速恢复算法
                • 接收到失序报文段,立即产生一个重复的ACK并发送
                  • 对于数据发送方
                    • 丢失报文段
                    • 出现了几个报文段的重新排序
                  • 继续等待少量重复的ACK到来
                    • 如果是重新排序,则只能产生1~2个重复的ACK
                    • 收到3个或以上的ACK:确认报文段丢失
                      • 立即重传丢失报文段,而不等待超时定时器溢出(以上过程就是快速重传算法)
                      • 接下来执行拥塞避免算法(这就是快速恢复算法)
                        • 为什么不执行慢启动算法
                          • 重复的ACK说明其他后续报文段被收到并进入对方缓存
                          • 不希望执行慢启动(cwnd将被设置为1个报文段大小)来突然减少数据流
                • 具体实现的过程
                  • 收到3个重复ACK,将ssthresh设置为当前拥塞窗口cwnd的一半;重传丢失的报文段;设置cwnd为ssthresh加上3倍的报文段大小
                  • 收到另外一个重复的ACK,cwnd增加一个报文段大小并发送一个分组(如果新的cwnd允许发送(因为可能会有其他的后续分组也被同时发送?))
                  • 当下一个确认新数据的ACK到达,设置cwnd为ssthresh(减少发送速率)
              • 按每条路由进行度量
                • 保存历史通信信息以备下次使用
                  • 被平滑的RTT
                  • 被平滑的均值偏差
                  • 慢启动门限
              • ICMP的差错
                • TCP常见ICMP差错
                  • 源站抑制
                    • 拥塞窗口cwnd被设置为1,但ssthresh没有变化
                    • 窗口将打开知道开放了所有通路或者发生了拥塞
                  • 不可达差错
                    • 主机、网络不可达
                    • 不可达错误被忽略,连接不必被断开,不断重试即可
              • 重传分组
                • TCP超时并重传时,不一定要重传同样的报文段,可以重新进行分组而发送较大的报文段(使用字节序识别数据)
            • 持续(persist)定时器
              • 避免接送双方的等待死锁
                • 接收方发送了非0的窗口(但是丢失)
                  • TCP不对ACK报文进行确认,只确认那些包含有数据的ACK报文段
                • 发送方在等待允许它继续发送数据的窗口更新
              • 在连接的一方需要发送数据但对方已通告窗口大小为0时,就需要设置TCP的持续定时器
              • 定时器时使用了普通的TCP指数退避
              • 窗口探查(window probe):发送方使用一个持续定时器 (persist timer)来周期性地向接收方查询,以便发现窗口是否已增大
              • 糊涂窗口综合征(SWS,Silly Window Syndrome)
                • 基于窗口的流量控制方案所导致
                • 症状:少量的数据通过连接进行交换,而不是满长度的报文段
                • 应对措施
                  • 接收方:不通告小窗口,除非窗口增大值大于一个报文段大小
                  • 发送方
                    • 发送满长度的报文段
                    • 发送至少是接收方通告窗口大小一半的报文段
                    • 发送任何数据并且不希望接收ACK(没有未被确认的数据);或者连接上不能使用Nagle算法
            • 保活定时器
              • 初学者会很惊奇地发现可以没有任何数据流通过一个空闲的TCP连接
              • 客户进程或服务器进程 — 都没有使用应用级的定时器来检测非活动状态
              • 保活并不是TCP规范中的一部分
              • 保活定时器的存在与否仍是争议的话题
                • 如果没有保活定时器,则应该由应用层提供保活功能
              • 不适用保活定时器的理由
                • 避免因为短暂差错使非常好的连接释放掉
                • 耗费额外带宽
              • 假定使用保活的是服务端,并没有使客户不能使用这个选项
                • 无活动超时后服务器发出探查,客户主机的四种情况
                  • 正常运行,并且可达
                    • 2小时定时器在交换数据后复位
                  • 崩溃并已经重新启动
                    • 服务器收到RST
                  • 正常运行,但服务器不可达
                    • 探查,75秒超时;共尝试10次
                  • 已经崩溃
                    • 同上
            • TCP的未来和性能
              • 路径MTU发现
                • 对端声明的MSS,非本地目的地址默认256
                • IP数据包都被设置DF比特标志位
                • 产生不能分片ICMP差错
                • TCP减少段大小并重传
                • 10分钟后尝试一个较大值
              • 长肥管道
                • 带宽时延乘积,连接的容量
                • 乘积变得越来越大时,TCP的局限性就会暴露出来
                  • 称为长肥网络(Long Fat Network,LFN)
                  • 运行在LFN上的TCP连接称为长肥管道
                  • 管道可以被水平拉长(增加RTT)或者垂直拉高(较高带宽)
                  • 长肥管道遇到的问题
                    • TCP首部的16bit限制了窗口大小;通过窗口扩大选项来解决
                    • LFN内的分组丢失会使吞吐量急剧减少;有选择的确认(不知道实现没)
                    • TCP对每个RTT仅进行一次测量,LFN需要更好的RTT测量机制;时间戳选项
                    • TCP可能在连接仍有效时重复出现包含N字节序的报文段
                      • TCP头的32bit的序号最大范围、最大报文段生存时间(MSL)和管道容量之间的矛盾
                      • 使用TCP的时间戳选项的PAWS(Protection Against Wrapped numbers)算法(回绕序号保护)
                    • 千兆比网络下,时延限制占主要地位(由光速决定),看待网络的视角需要转换
              • 窗口扩大选项
                • 使TCP的窗口定义从16bit增加为32bit
                  • 首部仍然使用16bit
                  • 定义一个选项实现对16bit的扩大操作
                • 过程
                  • 只能出现在一个SYN报文段中;连接建立后,每个方向的扩大因子是固定的
                  • 只能主动建立连接的一方发送这个选项,被动一方只能在接收到这个选项后才能发送这个选项
                  • 两个方向上的扩大因子可以不同
                  • 对扩大因子进行移位操作(所以新的窗口大小不是准确值)
                  • tcpdump中的扩大因子被记为wscale
                • Host Requirements RFC 要求TCP接受在任何报文段中的一个选项,同时忽略任何它不理解的选项
              • 时间戳选项
                • 在每个报文段中放置时间戳值,接收方在确认中返回这个值,从而允许发送方为每个收到的ACK(可能一个ACK确认多个报文段)计算RTT
                • 时间戳值
                  • 单调递增
                  • 两方并不需要进行时钟同步
                  • 推荐单位递增的间隔在1ms到1s之间
                • 包含这个选项的TCP首部将从20字节增加到32字节
              • PAWS:防止回绕的序号
                • 结合发送序号和时间戳来判重
              • T/TCP:为事务用的TCP扩展
                • TCP提供的是一种虚电路方式的运输服务
                • 是否事务的判定标准
                  • 避免连接建立和连接终止的开销
                  • 等待时间应该减少到等于RTT(往返时间)和SPT(服务器处理时间)之和
                  • 服务器能检测出重复的请求,并且收到重复请求时不重新处理事务
                • TCP需要改进的地方
                  • 避免三次握手
                    • T/TCP使用加速打开来避免三次握手
                      • 为每个连接记录一个连接计数CC(Connetion Count)值
                      • 主机缓存每个主机上一次的CC值
                        • 如果新收到的CC值较大,则该SYN是新的
                        • 否则,执行正常的三次握手过程
                  • 缩短WAIT_TIME状态
                    • 基于在两个主机之间测量RTT来动态计算TIME_WAIT的延时,可以缩短TIME_WAIT状态
                • 具有这些特征的改进TCP的最小事务序列是交换3个报文段
                  • 一个主动打开:SYN、客户数据、客户的FIN、客户的CC
                  • 服务器响应:服务器的SYN、服务器数据、服务器的FIN、对客户FIN的ACK、服务器的CC、对客户CC的CCECHO
                  • 客户端的ACK:确认了服务器的SYN、数据和FIN
                • T/TCP兼容现有的TCP,同时进行了最小的修改
                • 可作为替换的通用报文事务协议(Versatile Message Transaction Protocol)
                  • 处理差错检测、重传和重复压缩
                  • 支持多播通信
              • TCP的性能
                • TCP的最高运行速率的真正上限是由TCP的窗口大小和光速决定的
          • UDP
            • 只负责发送,不保证该数据报能到达另一端;可靠性由应用层来提供
            • 结构
              • UDP首部
                • 16位源端口号
                • 16位目的端口号
                • 16位UDP长度
                  • 包含UDP首部和内容
                  • 最小值为8字节,即允许空内容
                • 16位UDP检验和
                  • 覆盖UDP首部和UDP数据;IP首部校验和只覆盖IP首部
                  • 可选的;TCP首部校验和是必须的
                  • 为计算校验和而设置的伪首部:包含IP首部一些字段
              • 内容(可选)
            • TCP和UDP的端口号是相互独立的(根据IP首部的协议字段值)
            • 源站抑制(source quench)差错:当一个系统(路由器或主机)接收数据报的速度比其处理速度快时
            • UDP服务器的设计
              • TODO
            • 广播和多播
              • 仅用于UDP
              • 当地址中最高字节的最低位设置为1时表示该地址是一个多播地址
                • 用十六进制可表示为 0 1 : 0 0 : 0 0 : 0 0 : 0 0 : 0 0
                • 以太网广播地址ff : ff : ff : ff : ff : ff可看作是以太网多播地址的特例
              • 接收的处理
                • IP层根据IP地址中的源地址和目的地址进行更多的过滤检测
                • UDP层
                  • 如果没有进程使用该目的端口号就丢弃该数据报并产生一个ICMP不可达报文
                  • 如果校验出错,将被丢弃
                  • 增加了那些对广播数据不感兴趣的主机的负荷,直到UDP层才会被丢弃
              • 广播
                • 受限的广播
                  • 255.255.255.255
                  • 路由器不转发此类广播,仅存在于本地网络中
                  • 通常只在系统初始启动时才会用到
                • 指向网络的广播
                  • 网络号全为1的地址,netid.255.255.255
                • 指向子网的广播
                  • 主机号全为1且有特定子网号
                  • 需要了解目的子网的掩码
                • 指向所有子网的广播
              • 多播
                • 目的
                  • 向多个目的地址传送
                    • 有可能使用TCP替代
                  • 客户对服务器的请求
                    • 而不是使用广播而造成额外负荷
                • 多播组地址
                  • D类IP地址被称为多播组地址
                  • D类:1110+28位多播组ID
                  • 主机组
                    • 能够接收发往一个特定多播组地址数据的主机集合
                    • 一个主机组可跨越多个网络
                    • 主机组中成员可随时加入或离开主机组
                    • 主机组中对主机的数量没有限制
                    • 不属于某一主机组的主机可以向该组发送信息
          • 端口号
            • TCP和UDP都用一个16 bit的端口号来表示不同的应用程序
            • TCP和UDP把源端口号和目的端口号分别存入报文首部中
            • 客户端对端口号无所谓
              • 保留端口号
                • 1~1023
              • 临时端口号
                • 1024~5000之间
                • 5000:为其他服务器预留

            • 大多数Unix系统的文件 /etc/services 都包含了人们熟知的端口号
    • 网络层
      • 处理分组在网络中的活动
      • 包含协议
        • IP协议
          • IPv4
            • 长32bit,4个字节
            • 分为五类,开头分别为:
              • A: 0 (网络主机位数1:3)
                • 0000001 ~ 1111110(10~126)
                • 0001010(10) 私有地址
                • 1111111(127) 循环测试用
              • B: 10 (2:2)
                  1. ~ 191.
                • 169.254.X.X是保留地址
                • 172.16.0.0—172.31.255.255是私有地址
              • C: 110 (3:1)
                  1. ~ 223.
                • 192.168.X.X是私有地址
              • D: 1110
                • 剩下位数都是多播组号
                  1. ~ 239.
              • E: 11110
                • 剩下位数留待启用
                  1. ~ 255.
              • 剩余比特:ABC类分为网络号和主机号,D为多播组号,E为留待后用
              • A类保留给政府机构,B类分配给中等规模的公司,C类分配给任何需要的人,D类用于组播,E类用于实验
            • 互联网网络中心为接入互联网的网络分配IP地址
            • 分为三类
              • 单播地址
              • 广播地址
              • 多播地址
          • 特性
            • 不可靠:不保证能成功到达目的地
            • 无连接:每个数据报的处理是相互独立的
          • 组成
            • 版本 4 bit
            • 首部长度 4
            • 服务类型 TOS 8
            • 总字节数长度 16:所以总长度最大为65535字节
            • 标识 16:唯一地标识主机发送的每一份数据报,每发送一份报文就加1
            • 标志 3
            • 位偏移 13
            • 生存时间 TTL 8:数据报可以经过的最多路由器数,当该字段的值为 0时,数据报就被丢弃,并发送 ICMP 报文通知源主机
            • 协议 8
            • 首部校验和 16:是根据IP首部计算的检验和码。它不对首部后面的数据进行计算。
            • 源IP地址 32
            • 目的IP地址 32
            • 前面共20字节
            • 选项(可选)
              • 安全和处理限制
              • 记录路径
              • 时间戳
              • 宽松的源站选路:为数据报指定一系列必经的IP
              • 严格的源站选路:只能经过指定IP
              • 并非所有主机和路由器支持这些选项
            • 数据
          • 采用大端字节序传输(网络字节序)
          • 直接访问IP的应用程序
          • IP的选路
            • 单机操作
              1. 检查目的IP地址是否本机的IP地址之一或IP广播地址
              2. IP层是否被设置为路由器功能
              3. 被丢弃
            • 路由表包含:
              • 目的IP地址
                • 完整主机地址
                • 网络地址
              • 下一跳路由器IP地址,或直接相连的网络IP地址
              • 标志
                1. 网络地址还是主机地址
                2. 是真正的下一跳路由器,还是直接相连的接口
              • 为数据报的传输指定一个网络接口?
            • 路由表搜索顺序
              • 主机地址
              • 网络号
              • 默认条目
              • ICMP响应报文
            • 为一个网络指定一个路由器,而不是每个主机
            • netstat -rn
              • FLAGS
                • U 该路由可用
                • G 该路由是一个网关,如果没有此标志说明目的地址是直接相连的
                • H 该路由是到一个主机;否则目的地址是一个网络,网络号或者网络号与子网号的组合
                • D 该路由是由重定向报文创建的
                • M 该路由已被重定向报文修改
            • ICMP重定向差错报文
            • ICMP路由器发现报文
              • 随机定时广播或多播通告报文
              • 主机引导期间发送三次路由器请求报文,每3秒一次直到接收到响应
                • 监听相邻路由器?可改变默认路由
                • 默认路由器会超时(30min),路由器10min发送通告报文
              • 由用户进程(守护进程)的创建和处理
            • 静态选路
              • 默认方式生成路由表项(直接相连的接口)
              • route命令增加表项(从系统自引导程序文件)
              • ICMP重定向生成表项(默认路由出错)
            • 动态选路
              • 相邻路由器之间进行通信,以告知对方每个路由器当前所连接的网络
              • 动态选路协议,用于路由器间的通信
                • RIP, Routing information protocol, 大多数TCP/IP实现都包含这个协议
                  • RIP报文包含在UDP数据报中
                  • 常用的端口是520
                  • 每个报文最多携带25个路由
                  • 可能需要多个报文
                  • 超时和删除
                  • 度量
                    • 以跳(hop)计算,直接连接接口的跳数为1
                    • 跳数的最大值为15,16表示无法到达
                  • 限制
                    • RIP无法区分非零部分是一个子网号还是一个主机地址
                    • 最大跳数限制了可以使用RIP的网络大小
                  • ripquery程序
                • OSPF, open shortest path first, 开放最短路径优先
                • BGP, 边界网关协议
                • 无分类域间选路:现在Internet上正在开始采用该协议以保持B类网络的数量
              • Internet是以一组自治系统(autonomous system)方式组织的
                • 用于同一自治系统各路由器之间的内部网关协议
                  • 内部网关协议 IGP, Interior gateway protocol
                  • 域内选路协议, introdomain routing protocol
                • 用于不同自治系统内路由器通信的外部网关协议
                  • 外部网关协议 EGP
                  • 边界网关协议 BGP
              • Unix选路守护程序
                • routed
                • gated
          • 子网寻址
            • AB类地址为主机号分配了太多的空间
            • 缩减了路由表的规模
            • 子网对子网内的路由是不透明的
          • 子网掩码(略)
          • 特殊情况的IP地址
            • 特定的主机?
            • 环回地址
              • 是一个A类地址
              • 没有进行子网划分
            • 广播
              • 受限的广播
              • 向某个网络的广播
              • 向某个子网的广播
          • IP数据包的分片和组装
            • 分片
              • 标志字段用其中一个比特来表示“更多的片”;除了最后一片外,其他每个组成数据报的片都要把该比特置 1
              • 片偏移字段指的是该片偏移原始数据报开始处的位置
              • 标志字段中有一个比特称作“不分片”位。如果将这一比特置 1,IP将不对数据报进行分片。相反把数据报丢弃并发送一个ICMP差错报文。
              • 即使只丢失一片数据也要重传整个数据报。因为IP层本身没有超时重传的机制——由更高层来负责超时和重传
              • 任何运输层首部只出现在第1片数据中
            • 组装
              • 到达下一站就进行组装,对传输层是透明的
        • ICMP
          • IP协议的附属协议
          • 传递差错报文以及其他需要注意的信息;通常被IP层或其他高层(TCP、UDP)使用
          • 一些ICMP报文把差错报文返回给用户进程
          • 组成
            • IP首部
            • ICMP报文
              • 8位类型
              • 8位代码
              • 16位校验和
                • 覆盖整个ICMP报文
              • 其他
          • 类型和代码作为联合唯一键,总的又可分为查询报文和差错报文
            • 差错报文
              • 永远不能产生另一差错报文
              • 始终包含IP的首部和IP数据报(datagram)的前8个字节
              • 永远不会产生差错报文的情况:
                • ICMP差错报文
                • 目的地址是广播地址或多播地址(D类地址)的数据报
                • 作为链路层广播的数据报
                • 不是IP分片的第一片
                • 源地址不是单个主机的数据报
          • ICMP地址掩码应答与应答
            • RFC规定,必须是经过特殊配置的成为地址掩码的授权代理的系统才能发送地址掩码应答
          • ICMP时间戳请求与应答
          • ICMP端口不可达差错
            • 是立刻返回的
            • 结构:ICMP端口不可达报文的完整长度
              • 14字节以太网首部
              • 20字节IP首部
              • 8字节ICMP首部?
              • 数据部分
                • 20字节产生差错的数据报IP首部
                • 8字节UDP首部
          • Ping程序
            • 概念源于声呐
            • 服务器在内核中实现
            • 回显应答
              • 序列号
              • TTL:time to live
              • 往返时间
            • 包丢失统计
            • 往返时间(RTT, round-trip time)统计
          • Traceroute程序
            • 使用ICMP报文和IP首部中的TTL字段
            • 发送端初始TTL值为1,将TTL每次增大1
            • ICMP回显应答一般设为最大值255
            • 注意点
              • 同一TTL的路由可能变化
              • 不能保证ICMP报文的路由和UDP数据报的路由一致
              • ICMP信息的IP报文的信源地址是该路由器的IP地址
        • IGMP:Internet组管理协议,用来把一个UDP数据报多播到多个主机
          • 报文格式
            • 4位IGMP版本
              • enum(1)
            • 4位IGMP类型
              • enum(1, 2)
              • 1: 多播路由器发出
              • 2: 主机发出
          • 协议
            • 加入一个多播组
              • 多播的基础就是一个进程的概念,指操作系统执行的一个程序
              • 该进程在一个主机的给定接口上加入了一个多播组
            • IGMP报告和查询
            • 生存时间段
              • TTL为1则局限为在同一子网内传送
              • 更大的TTL值能被多播路由器转发
            • 所有主机组
              • 目的IP地址224.0.0.1
              • 该地址被称为所有主机组地址
      • 接口和网络基本信息(ipconfig)
        • 链路层封装格式
        • 硬件地址
        • IP地址
        • 子网掩码
        • 广播地址
        • MTU
        • 发送、接收数据包统计和总流量统计
        • 数据包冲突数量
        • 发送队列长度
      • nestat -in 打印出网络接口表
    • 链路层
      • 处理与电缆的物理接口细节
      • TCP/IP支持不同的链路层协议,取决于网络所使用的硬件
        • 以太网
          • IEEE(电子电气工程师协会) 802委员会公布了一个稍有不同的标准集
            • 其中802.3针对整个CSMA/CD网络
            • 802.4针对令牌总线网络
            • 802.5针对令牌环网络
            • 这三者的共同特性由802.2标准来定义,那就是802网络共有的逻辑链路控制(LLC)
          • 两种封装格式
            • RFC 894(以太网)封装格式(A)
            • RFC 1042封装格式(B)
            • 必须能够发送和接收A,应该能够接收AB的混合,也许能够接收B
            • AB都采用48bit(6byte)的目的地址和源地址(硬件地址)
        • 令牌环网
        • FDDI(光纤分布式接口)
        • RS-232
      • 环回接口
        • 允许运行在同一台主机上的客户程序和服务器程序通过 TCP/IP 进行通信
        • 传给环回接口的任何数据均作为IP输入
        • 传给广播或多播的数据报复制一份传给环回接口,然后送到以太网上(根据定义)
        • 任何传给该主机IP地址的数据均送到环回接口
      • 最大传输单元 MTU
        • 以太网和802.3对数据帧的限制分别为1500和1492字节
        • IP层数据报太长,则需要分片(fragmentation)
      • 路径MTU
        • 通信主机路径中最小MTU
        • 不一定对称
        • RFC 1191描述了其发现机制
          • ICMP和IP分片
          • ICMP不可到达错误
            • 路由器收到一份需要分片的数据报
            • 而在IP首部又设置了不分片(DF)的标志比特
          • traceroute程序
      • 串行线路吞吐量计算
        • 交互通信:Telnet、Rlogin和FTP的控制部分
      • 接收到以太网的帧后的分用
        • ARP
          • IP地址到以太网地址
          • 发送ARP请求的数据给同一网络中上的每一个主机
          • 目的主机发送一个ARP应答:包含IP地址和对应的硬件地址
          • 数据帧长42字节(28字节ARP数据,14字节以太网帧头)
          • ARP高速缓存的完整表项的超时时间为20分钟;不完整表项则为3分钟,当被再次使用时,则重设为20分钟
          • 路由器的ARP代理功能
          • 免费ARP(gratuitous arp)
            • 确认其他主机是否设置了相同IP
            • 如果当前主机更改了硬件地址,那这个分组可以使其他主机高速缓存中旧的硬件地址得到更新
          • 相关命令
            • arp 命令 - manipulate the system ARP cache
            • tcpdump -e
              • 在who- 后面的以太网地址是目的硬件地址,跟在tell后面的以太网地址是发送端的硬件地址
          • 对应用和系统管理员来说是透明的,是逻辑的IP地址和现实世界的物理硬件的映射纽带
        • RARP
          • 以太网地址到IP地址
          • 无盘机(X终端,无盘工作站)没有存储(记忆),需要通过RARP来获得它的IP地址:好像不太常见?
          • RARP请求是广播的方式传送,而RARP响应是单播(unicast)传送
          • RARP服务器的设计与系统相关而且比较复杂?
            • ARP:由于内核知道IP地址和硬件地址,只需用相应硬件地址来应答即可
            • RARP:RARP服务器的复杂性在于,服务器一般要为多个主机(网络上所有的无盘系统)提供硬件地址到IP地址的映射。该映射包含在一个磁盘文件中(在Unix系统中一般位于/etc/ethers目录中)。由于内核一般不读取和分析磁盘文件,因此RARP服务器的功能就由用户进程来提供,而不是作为内核的TCP/IP实现的一部分
            • 每个网络有多个RARP服务器,采用最先收到的应答
            • RARP请求是在硬件层面进行广播的,意味着不经过路由器转发
        • IP
          • ICMP
          • IGMP
          • TCP
          • UDP
  • 概念
    • 路由器(router):在网络层上对网络进行互连
    • 网关(gateway)(应用层):连接两个不同协议族的进程(如TCP/IP和SNA)
    • 网桥:在链路层上对网络进行互连,网桥使得多个局域网(LAN)组合在一起,这样对上层来说就好像是一个局域网。
    • 封装:
      • TCP段(TCP segment)
      • IP数据报(IP datagram)
      • 帧(frame)(通过以太网传输)
        • 以太网的最小长度要求: 60字节
    • 封装:
      • 以太网首部(14)
        • IP首部(20)
          • TCP首部(20)
            • 应用数据
              • 应用首部
                • 用户数据
      • 以太网尾部(4)
  • 结论
    • TCP/IP协议的另一个名称是Internet协议族(Internet Protocol Suite)
    • 尽管两台主机通过路由器进行通信,实际上以太网中的任何主机都可以与令牌环网中的任何主机进行通信
    • SLIP:Serial Line Internet Protocol,串行线路网络协议
comments powered by Disqus