Contents
  1. 1. TCP/IP 详解(卷1:协议)
  2. 2. 概述
  3. 3. 链路层
    1. 3.1. 链路层
      1. 3.1.1. 环回接口
    2. 3.2. ARP
      1. 3.2.1. 引言
      2. 3.2.2. 例子
      3. 3.2.3. ARP高速缓存
      4. 3.2.4. ARP的分组格式
      5. 3.2.5. ARP例子
      6. 3.2.6. ARP代理
      7. 3.2.7. 免费ARP
      8. 3.2.8. ARP命令
    3. 3.3. ICMP:internet控制报文协议
      1. 3.3.1. 引言
      2. 3.3.2. ICMP报文的类型
      3. 3.3.3. ICMP地址掩码请求与应答
      4. 3.3.4. ICMP时间戳请求与应答
      5. 3.3.5. ICMP端口不可达差错
  4. 4. 应用层
    1. 4.1. ping程序
      1. 4.1.1. 引言
      2. 4.1.2. ping程序
      3. 4.1.3. ip记录路由选项
    2. 4.2. Traceroute程序
      1. 4.2.1. 引言
      2. 4.2.2. Traceroute操作
      3. 4.2.3. 局域网输出
      4. 4.2.4. 广域网输出
      5. 4.2.5. ip源站选路选项
  5. 5. IP 层
    1. 5.1. IP
      1. 5.1.1. 引言
      2. 5.1.2. IP首部
      3. 5.1.3. IP路由选择
      4. 5.1.4. 子网寻址
      5. 5.1.5. 子网掩码
      6. 5.1.6. 特殊情况的ip地址
      7. 5.1.7. 子网例子
      8. 5.1.8. ifconfig命令
      9. 5.1.9. netstat命令
    2. 5.2. IP选路
      1. 5.2.1. 引言
      2. 5.2.2. 路由原理
      3. 5.2.3. ICMP主机与网络不可达差错
      4. 5.2.4. ICMP重定向差错
      5. 5.2.5. ICMP路由器发现报文
    3. 5.3. 动态选路协议
      1. 5.3.1. 引言
      2. 5.3.2. 动态选路
      3. 5.3.3. RIP选路信息协议
      4. 5.3.4. RIP 版本2
      5. 5.3.5. OSPF开放最短路径优先
      6. 5.3.6. BGP边界网关协议
  6. 6. UDP
    1. 6.1. UDP
      1. 6.1.1. 引言
      2. 6.1.2. UDP首部
      3. 6.1.3. UDP检验和
      4. 6.1.4. IP分片
      5. 6.1.5. ICMP不可达差错(需要分片)
      6. 6.1.6. Traceroute确定路径MTU
      7. 6.1.7. 采用udp的路径mtu发现
      8. 6.1.8. UDP和ARP之间的交互作用
      9. 6.1.9. 最大UDP数据报长度
      10. 6.1.10. ICMP源站抑制差错source quench
      11. 6.1.11. UDP服务器的设计
    2. 6.2. 广播和多播
      1. 6.2.1. 引言
      2. 6.2.2. 12.2 广播
      3. 6.2.3. 广播的例子
      4. 6.2.4. 多播
    3. 6.3. IGMP:Internet 组管理协议
    4. 6.4. DNS
      1. 6.4.1. 引言
      2. 6.4.2. DNS 基础
      3. 6.4.3. DNS 报文格式
      4. 6.4.4. 简单的栗子
      5. 6.4.5. 指针查询
      6. 6.4.6. 资源记录
      7. 6.4.7. 高速缓存
      8. 6.4.8. UDP 还是 TCP
  7. 7. TCP
    1. 7.1. TCP
    2. 7.2. TCP连接的建立与终止
      1. 7.2.1. 建立和终止连接
      2. 7.2.2. 连接建立的超时
      3. 7.2.3. 最大报文段长度
      4. 7.2.4. TCP的半关闭
      5. 7.2.5. TCP状态变迁图
      6. 7.2.6. 复位报文段
      7. 7.2.7. 同时打开
      8. 7.2.8. 同时关闭
      9. 7.2.9. TCP选项
      10. 7.2.10. TCP服务器设计
    3. 7.3. TCP的交互数据流
      1. 7.3.1. 引言
      2. 7.3.2. 交互式输入
      3. 7.3.3. 经过时延的确认
      4. 7.3.4. Nagle 算法
      5. 7.3.5. 小结
    4. 7.4. TCP 的成块数据流
      1. 7.4.1. 引言
      2. 7.4.2. 正常的数据流
      3. 7.4.3. 滑动窗口
      4. 7.4.4. 窗口大小
      5. 7.4.5. PUSH标志
      6. 7.4.6. 慢启动
      7. 7.4.7. 成块数据的吞吐量
      8. 7.4.8. 紧急方式
    5. 7.5. TCP 的超时与重传
      1. 7.5.1. 引言
      2. 7.5.2. 超时与重传的简单例子
      3. 7.5.3. 往返时间测量
      4. 7.5.4. 往返时间 RTT 例子
      5. 7.5.5. 拥塞举例
      6. 7.5.6. 拥塞避免算法
      7. 7.5.7. 快速重传与快速恢复算法
      8. 7.5.8. 按每条路由进行度量
    6. 7.6. TCP 的坚持定时器
    7. 7.7. TCP 的保活定时器
    8. 7.8. TCP 的未来和性能
      1. 7.8.1. 路径 MTU 发现
  8. 8. 更新汇总

TCP/IP 详解(卷1:协议)

这是我阅读 TCP/IP详解 的笔记,有了新内容会持续进行更新,谢谢!

概述

tcp/ip 四层协议:

  • 链路层:设备驱动程序及接口卡
  • 网络层:处理分组在网络中的活动
  • 运输层:为两台主机上的应用程序提供端到端的通信
  • 应用层:处理应用程序细节

应用层用到End-to-end协议,端到端
网络层是Hop-by-hop协议,点到点

网络层IP是不可靠的服务,只是尽可能快地把分组从源节点送到目的节点,但是不保证可靠
TCP在不可靠的IP层上提供了可靠的运输层,使用了超时重传,发送和接收端到端的确认分组等机制

路由器:在IP层把网络连在一起

以太网数据帧的物理长度在46~1500字节之间

链路层

链路层

TCP/IP支持多种不同的链路层协议,取决于网络所使用的硬件,如以太网,IEEE,SLIP,PPP封装格式

loopback interface:127.0.0.1 localhost

最大传输单元MTU:1500和1492字节等,不同传输介质有不同的MTU
如果IP层有一个数据报要传,数据长度比链路层MTU大,那就要分片fragmentation
路径MTU:重要的不是两台主机所在的网络的MTU值,而是两台通信主机路径中最小MTU,被称为路径MTU
两台主机之间的路径MTU不一定是个常数,他取决于所选择的路由,选路也不一定是对称的,所以路径MTU在两个方向上不一定是一致的。

环回接口

127.0.0.1 localhost

  • 传给环回地址的任何数据都作为ip输入
  • 传给广播或多播地址的数据报复制一份传给环回接口,然后送到以太网
  • 任何传给该主机ip地址的数据均送到环回接口

环回接口可以被看做网络层下面的另一个链路层,网络层把一份数据报传给环回接口,就像传给其他链路层一样,只不过环回接口把它返回到ip的输入队列

ARP

引言

ARP为ip地址到对应的硬件地址之间提供了动态映射

例子

网络接口有一个硬件地址,48bit的值
tcpip有自己的地址:32bit的ip地址
内核必须知道目的端的硬件地址才能发送数据
ARP的功能就是在32bit的ip地址和采用不同网络技术的硬件地址之间提供动态映射

ARP发送一份称为ARP请求的以太网数据帧给以太网上的每一个主机,这个过程称作广播

ARP高速缓存

arp -a
每个主机上都有一个ARP高速缓存,每一项大概20分钟存活时间
48bit的以太网地址用6个十六进制来标示

ARP的分组格式

电缆上的所有以太网接口都要接受广播的数据帧

ARP例子

ff:ff:ff:ff:ff:ff 是以太网广播,电缆上的每个以太网接口都要接受这个数据帧对它进行处理,以太网最小长度是60字节,ARP请求或者回答的数据帧都是42字节,所以每一帧都必须加入填充字符以达到以太网的最小长度要求,有一些书最小长度64字节,因为算了4字节的以太网帧尾

ARP request is broadcast,The ARP reply is sent directly to the requesting host; it is not broadcast.

请求不存在主机的ARP请求时,会超时,tcpdump命令输出的超时限制是29.5秒,大多数BSD实现把完成TCP连接请求的时间限制为75秒

直到ARP回答返回,tcp报文段才可以被发送,因为硬件地址这时候才知道

完整表项超时20分钟,不完整3分钟

ARP代理

如果ARP请求时从一个网络主机发往另一个网络的主机,那么连接这两个网络的路由器就可以回答该请求,这个过程称作委托ARP或者ARP代理(Proxy ARP),路由器的功能相当于目的主机的代理

路由器识别出ip地址术语它的一个拨号主机,于是它把自己的以太网接口地址作为硬件地址来回答

免费ARP

主机发送ARP查询自己的ip地址

两个作用:

  • 一个主机可以通过它来确定另一个主机是否设置了相同的ip地址
  • 如果发送免费arp的主机改变了硬件地址,那么这个额分组就可以使其他主机告诉缓存中的旧的硬件地址进行相应的更新

ARP命令

-a显示-d删除-s增加

ICMP:internet控制报文协议

引言

ICMP传递差错报文和其他需要注意的信息
ICMP报文前四个字节是一样的,剩下的其他字节互不相同

ICMP报文的类型

ICMP地址掩码请求与应答

请求报文进行广播,然后打印所有应答,广播会包括自己的环回地址

RFC规定,除非系统是地址掩码的授权代理,否则不能发送地址掩码应答,但是大多数主机收到请求时都发送一个应答,甚至还是错误的应答,有bug

ICMP时间戳请求与应答

请求允许系统向另一个系统查询当前的时间
difference减去RTT的一半,就是调整值

ICMP端口不可达差错

这是一种差错报文
UDP的规则之一,如果收到一份udp数据报而目的端口与某个正在使用的进程不相符合,那么udp返回一个icmp不可达报文,可以用TFTP强制生成一个端口不可达报文

差错报文,必须包括差错报文的数据报IP首部,还必须至少包括跟在ip首部后面的前8个字节

包含在udp和tcp首部中的内容是源端口号和目的端口号

应用层

ping程序

引言

目的为了测试另一台主机是否可达,程序发送一份icmp回显请求报文给主机,并等待返回icmp回显应答

ping程序

允许观察分组丢失,失序,重复

LAN输出:当前时间减去icmp报文中的时间,就是往返时间,ttl位于ip首部
第一个返回时间要大因为arp请求

wan输出:有可能丢失分组,或者有重复或者失序的分组

slip:比较慢

ip记录路由选项

ping程序提供-R选项,提供记录路由的功能,记录经过的所有路由器的地址,但是ip首部只有有限的空间来存放ip地址,37个字节可以(60-20-3),3个是rr选项,20个师首部,所以只能存放9个ip地址
由于有限制,所以用Traceroute工具更好
始终把出口的ip地址加入清单中,然后把自己的入口ip地址也加入清单中

Traceroute程序

引言

可以让我们看到ip数据报从一台主机传到另一台主机所经过的路由

Traceroute操作

为什么要取代ping -R

  • 不是所有路由器都支持记录路由选项,Traceroute不需要中间路由器具备任何特殊的功能
  • 路由记录一般是单向的选项
  • ip首部留给选项的空间有限,不能存放太多的路径

Traceroute利用ICMP报文和ip首部的TTL字段(生存周期)

每个处理数据报的路由器都需要把TTL的值减1或减去在路由器中停留的秒数

TTL字段的目的是为了防止数据报在选路时无休止的在网络中流动

当路由器收到一份ip数据报,如果TTL为0或1,那路由器不转发数据报,路由器丢弃数据报,并发给源机一份ICMP“超时”信息,Traceroute程序通过这份ICMP信息的ip报文知道路由器的ip地址

先发送TTL为1的,然后发2,以此类推

Traceroute程序发送一份UDP数据报给目的主机,但是选择了一个不可能的值作为UDP端口号(大于30000),目的主机产生端口不可达错误

Traceroute程序区别接受到的ICMP超时或者ICMP端口不可达,就能知道所有的信息

局域网输出

第一行

  • 目的主机名和ip地址
  • 最大TTL值 hops max
  • 字节数(20字节ip首部,8字节udp首部和用户数据)

对于每个TTL值,发送三份数据报,每季收到一份ICMP报文,打印往返时间,5秒内没收到任意一份,就打一个星号
Traceroute给出的时总往返时间

注意

  • 不能保证现在的路由就是将来的路由,甚至两份连续的ip数据报都有可能采用不同的路由
  • 不能保证icmp报文的路由鱼Traceroute程序发送的ucp数据报采用同一种路由,往返时间可能不能真正体现数据发出和返回的时间差
  • icmp报文中的信源ip地址是udp数据报到达的路由器接口的ip地址,而ping是发送接口地址,所以从A到B运行Traceroute和从B到A运行Traceroute所得到的结果是不同的
  • Traceroute程序获得是ip地址,所以给定ip地址的情况下,要做一个反向域名查看来获取域名

广域网输出

同一个地点有时候时间会有很大的差别,不能区分是发出的数据报还是返回的icmp差错数据报被拦截

ip源站选路选项

源站选路(source routing)的思想史由发送者制定路由

  • 严格的源站路由选择,发送端志明ip之举报所必须经过的确切路由,如果路由器发现源路由所指定的下一个路由器不在其直接连接的网络上,它返回一个“源站路由失败”的ICMP差错报文
  • 宽松源站选择,发送端志明了一个数据报经过的ip地址清单,但是数据报在清单上指明的任意两个地址之间可以通过其他路由器

源站路由,必须在发送ip数据报钱填充ip地址清单,数量小于9个

源站路由运行过程:

  • 发送主机从应用程序接受源站路由清单,将第一个表项去掉,将所有剩余的项左移1个位置,并将原理啊的目的地址作为清单的最后一个
  • 每个处理数据报的路由器检查其是否为数据报的最终地址,不是的话就转发数据报
  • 如果该路由器是最终目的,且指针不大于路径的长度

-g是宽松路由选战的选项
最多制定8个中间路由器,最后一个是目的主机
会丢失路由器,这些丢失的路由器可能发生了与宽松路由选战选项数据有关的程序问题,所以没有显示
有星号说明失败,5秒内没有应答

-G严格路由选路
!S表明失败,失败时发送源站路由失败的差错报文

可以通过宽松的源站选路来进行往返路由

IP 层

IP

引言

不可靠(unreliable):不能保证IP数据报能成功地到达目的地
无连接(connectionless):不维护任何后续数据报的状态信息,每个数据报都是相互独立的,可以不按发送顺序接收,每个数据报独立地进行路由选择,可能选不同的路线。

IP首部

版本号:现在时4
首部长度:首部占32bit字的数目,不含选项时,普通IP数据报是5(45=20字节),如果有选项,最大是60字节(415=60)
服务类型:TOS,代表最小时延,最大吞吐量,最高可靠性,最小费用,只有一个为1bit,全为0就是一般服务
总长度:整个ip数据报的长度,最大65534,但是大多数情况会分片。由于一些链路层要填充数据达到最小长度,所以总长度字段可以知道有多少是ip数据报的内容
表示字段:唯一标示主机发送的每一份数据报
TTL:设置了数据报可以经过的最多路由器数,每经过一个减1,到0时数据报被丢弃
协议字段:识别哪个协议向ip传送字段
首部检验和字段根据ip首部计算的检验和码,不对后面的数据进行计算
发送方计算检验和放入,接收方计算所有的,全为1时说明正确,不是全1时丢弃,但是不产生差错报文,由上层发现,每通过一个路由器ttl减1,检验和增加

IP路由选择

路由表信息:

  • 目的ip地址
  • 下一站路由器ip地址
  • 标志
  • 网络接口

ip路游:

  • 搜索路由表,寻找目的ip地址完全匹配的表目,网络号和主机号
  • 寻找与网络号相匹配的表目,网络号
  • 使用默认表目

关键:

  • 数据报中的ip地址始终不发生变化
  • 每一次的链路层地址都不同,链路层地址指向下一站的链路层地址

子网寻址

ip地址由网络号和主机号组成
主机号可以分为子网号和主机号
16bit的主机号,8bit子网号,8bit主机号,就有254个子网,每个子网有254主机

子网对外部路由器是隐藏内部网络组织的
使用子网的B类地址,可以缩小internet路由器的规模,对外的路由器是透明的,只需要一个路由器表,缩小了路由表的规模

子网对子网内部的路由器是不透明的

子网掩码

除了ip地址外,主机还需要知道多少比特用于子网号及多少比特用于主机号,所以需要子网掩码
子网掩码:值为1的比特留给网络号和子网号,为0的比特留给主机号

这样,给定了ip地址和子网掩码以后,主机就可以确定数据报的目的

  • 本子网上的主机
  • 本网络中其他子网的主机
  • 其他网络的主机

知道ip地址,就知道他是否为a,b,c类,从ip地址高位得知,也就知道了网络号和子网号之间的分界线,通过子网掩码知道子网号和主机号的分界线

特殊情况的ip地址

特殊源地址,环回地址,广播地址

子网例子

变长子网:一个子网的网络使用多个子网掩码
11位子网中,前8位始终是13,后面3bit表示不同的子网,001表示以太网,010表示slip链路,对外来说只要知道13在哪里就行,对于内部的sun主机来说知道变长子网就行了

ifconfig命令

tcpip对网络接口进行配置和查询的命令

netstat命令

netstat -in
提供系统上的接口信息

IP选路

引言

主机必须配置成一个路由器,否则通过网络接口接收到的数据报,如果目的地址不是本机就会被丢弃

路由原理

内核维护路由表,路由表包含的信息决定了ip层所做的所有决定

ip搜索路由表步骤:

  1. 搜索主机地址
  2. 搜索网络地址
  3. 搜索默认表项

ip执行选路机制,路由守护程序提供选路策略

netstate -rn显示路由表,显示ip地址

flag:

  • U 该路由可用
  • G 该路由是一个网关(路由器),没有设置该标志说明目的地是直接相连的
  • H 是一个主机
  • D 该路由是由重定向报文创建
  • M 路由已经重定向报文修改

G:区分间接路由和直接路由,对于直接路由不设置标志G
直接路由:目的地端的ip地址+链路层地址
间接路由:最终目的地的ip地址+下一站路由器的链路层地址

H:目的地址是一个完整的主机地址
没有设置说明是一个网络地址
为了某个ip搜索路由表时,主机地址项必须完全与目的地址匹配,而网络地址只西药匹配目的地址的网络号和子网号就ok了

refs:正在使用路由的活动进程个数
use:通过该路由发送的分组数
interface:本地接口

初始化路由
初始化一个接口时,创建直接路由
对于点对点链路和环回接口,路由到达主机,H标志
对于广播接口,以太网等,路由是网络
route命令增加路由表的表项

复杂的路由表:
有可能有多个接口
netstate为直接路由打印出来的网关地址就是本地接口所用的ip地址

没有目的的路由
没有默认项和匹配项
本机产生:给发送该数据报的应用程序返回一个差错,主机不可达差错或者网络不可达差错
如果是转发数据报,给原始发送端一份ICMP主机不可达的差错报文

ICMP主机与网络不可达差错

返回主机不可达的回显请求报文

顶层选路域,有可能没有默认项,所以会返回不可达的回显请求报文

ICMP重定向差错

当ip数据报应该被发送到另外一个路由器时,收到数据报的路由器就要发送ICMP重定向差错报文给ip数据报的发送端

重定向报文标志位D

ICMP路由器发现报文

初始化路由表的方法:

  • 配置文件中制定静态路由,经常用来设置默认路由
  • 利用ICMP路由器通告和请求报文
    主机在引导之后广播或者多播传送一份路由器请求报文,一台或多台路由器响应一份路由器通告报文。
    路由器定期地广播或多播传送他们的路由器通告报文,允许每个监听的主机相应更新路由表

路由器操作

  • 路由器启动时,广播或者多播接口上发送通告报文,不定期随机发送,450到600秒,生命周期30分钟
  • 路由器关闭时,发送最后一份通告报文,生命周期为0
  • 路由器监听来自主机的请求报文,发送路由器通告报文回应
  • 多台路由器,系统管理员来设置路由器的设置优先级别

主机操作

  • 引导期间发送三份路由器请求报文,收到一份有效的就停止
  • 监听来自相邻路由器的请求报文

动态选路协议

引言

静态选路:

  • 配置接口时,默认方式生成路由表项
  • 通过route命令
  • 通过ICMP重定向生成表项
    限制:
  1. 网络很小
  2. 与其他网络知有单个连接点
  3. 没有多余路由时可行

如果3个限制不能全部满足,通常用动态路由

  • RIP(routing information protocal)
  • OSPF
  • BGP
  • 无分类域间选路的新的选路技术

动态选路

相邻路由器进行通信,告知对方每个路由器所在网络,就是动态选路,有一个路由守护程序维护routing daemon

当路由随时间变化,路由是由路由守护程序进行增加或者删除,而不是来自于引导程序的route命令
路由守护程序有选路策略,维护路由表

internet以自治系统组织(AS,Autonomous system)

每个自治系统可以选择该自治系统中各个路由器之间的选路协议

  • 内部网关协议IGP(Interior Gateway protocol)
  • 域内选路协议(intradomain routing protocol)
  • 常用的时RIP

外部网关协议

  • EGP
  • BGP

RIP选路信息协议

运行,RIP常用UDP端口是520

  • 初始化:启动一个守护程序,判断启动哪些接口,每个接口上发送一个请求报文,要求其他路由器发送完整路由表,命令字段为1,地址字段为0,度量字段16这事一份要求另一端完整路由表的特殊请求报文
  • 接收到请求,处理请求中每一个表项
  • 接受响应,更新路由表
  • 定期选路更新,每过30秒,所有或者部分路由器发送完整路由表给相邻路由器,广播或者点对点
  • 触发更新

每个路由都有与之相关的定时器,如果rip发现系统中一条路有3分钟没有更新了,就设置为16,标注为删除

度量:
度量以跳hop计算,直接连接的接口跳数为1

每个路由器都发送其路由表给相邻站,如果在AS内从一个路由器到一个网络有多条路由,选择跳数小的
跳数最大是15,16表示无法到达的ip地址

问题

  • 没有子网概念
  • 发生故障后要很长时间稳定下来
  • 度量15限制了rip的网络大小

RIP 版本2

利用了版本1中必须为0的一些字段传递信息

选路域
选路标记
子网掩码
下一站ip地址

OSPF开放最短路径优先

BGP边界网关协议

IGP:RIP
EGP:BGP
还在研究和发展

UDP

UDP

引言

UDP是一个简单的面向数据报的运输层协议,进程的每个输出操作正好产生一个UDP

UDP首部

UDP长度字段指的是UDP首部和UDP数据的字节长度,最小为8个字节

UDP检验和

UDP检验和覆盖UDP首部和UDP数据
IP首部检验和只覆盖IP的首部,不包括数据包中的任何数据

UDP检验和是可选的,UDP和TCP数据报都含有一个12字节的伪首部

计算检验和为奇数长度就填充0
检验和计算为0,就存入全1
如果检验和为0,说明发送端没有计算检验和

UDP检验和(包括tcpip所有的检验和)是简单的16bit和,检验不出交换两个16bit的差错

不是所有的以太网数据帧都是ip数据报,至少还有arp协议
不是所有的ip数据报都是udp或tcp数据,icmp也用ip传送数据

IP分片

  • ip把mtu与数据报长度进行比较,如果需要分片,分片可以发生在发送端主机,也可以在中间路由器
  • 每一份ip数据包分片以后,只有到达目的地才进行重新组装,组装由ip层完成,目的是让分片和充足对运输层透明
  • 发送端发送的每份ip数据报,标识字段都包含一个唯一值,该值在数据报分片时被复制到每个片中。标识字段用其中一个比特标识“更多的片”,除了最后一篇,其他都是1。片偏移字段指的是该片偏移原始数据包开始处的位置,数据报备份片后,每个片的总长度都要改成改片的长度
  • 标志字段有一个比特位“不分片”位,如果是1,ip将不对数据报进行分片,相反会丢弃并发送一个icmp差错报文(需要进行分片但设置了不分片比特)
  • 被分片后,每个片都成为一个分组,都有自己的ip首部,路由时也是独立的,到达时时失序的,但是有足够信息重组
  • 即使丢失一片数据,也要重传所有

    frag是标识字段的值
    @前面是数据长度,后面是偏移量


分组和数据报区别

ICMP不可达差错(需要分片)

通过ping程序,逐步增加数据分组长度,知道看见进入的分组被分片为止

Traceroute确定路径MTU

设置Traceroute不分片,逐步减小分组长度,如果路由器发送的icmp错误报文是新格式,包含出口的mtu,那就用这个作为下一个mtu值来发送,不用依次减少来不断测试

利用mtu发现机制,应用程序可以充分利用更大的mtu来发送报文

采用udp的路径mtu发现

ip当知道发往该目的地址的数据报不能将DF比特置1,因此,ip要对数据报进行分片
建议每10分钟来查看MTU是不是变大了

UDP和ARP之间的交互作用

当arp没有缓存时,发送一个8192自己的udp数据报,会产生6个数据报片—ip分片

每个分片都会有arp请求。
收到arp应答时,只将最后一个报文发送到制定目的主机
这事ARP洪范,arp flooding,高速率重复发送到同一个ip地址的arp请求

而且没有icmp组装超时差错
因为一般来说,第一个数据报片出现,ip必须启动一个定时器,30秒或者60秒,如果定时器超时那这个数据报的所有数据片未能全部到达,就全部丢弃

没看到有两个原因

  • berkeley派生的不产生这个差错
  • 没有接收到包含udp首部的偏移量为0的第一个数据报片,除非第一个数据报片到达,不然不知道运输层的首部,无法区分是哪个进程发送的数据报被丢弃

大多数arp实现在等待arp应答时只保留最近传送给目的端的数据报

最大UDP数据报长度

理论最大ip长度65535,取出首部是65507字节,但是有两个限制导致数值小

  1. 应用程序可能会受到程序接口的限制
  2. tcpip的内核实现限制

ICMP源站抑制差错source quench

接受数据报的速度比处理的速度快,就可能产生这个差错
“可能”是因为即使一个系统没有缓存并丢弃数据报,可不要求它一定要发送源站抑制报文

新的RFC中,提出路由器不应该产生这个报文,因为他小号网络带宽,而且对拥塞来说是一种无效而且不公平的调整

UDP服务器的设计

通常一个客户启动后直接鱼单个服务器通信,然后就结束了,而对于服务器来说,它启动后处于休眠,等待客户请求的到来,对于udp,客户数据报到达时,服务器苏醒

需要客户ip地址和端口号

需要目的ip地址,因为有广播

UDP输入队列
单个服务器进程对单个udp端口上的所有客户请求进行处理
udp自动排队,接收到的udp数据报以其接受顺序给应用程序

排队会溢出

  • 应用程序不知道输入队列何时溢出,只是udp对超时数据报进行丢弃处理
  • 没有发回任何信息告诉客户数据报被丢失
  • udp是fifo
  • arp是lifo

可以限制本地ip地址的端口和远端ip地址的端口,通常一个程序端口与某个本地ip地址及udp端口号想关联

广播和多播

引言

三种ip地址

  • 单播
  • 广播
  • 多播

广播和多播仅仅用于tcp,他们对需要将报文同时传给多个接受者的应用十分重要。
tcp是一种面向连接的协议,是两个主机内的两个进程间的一个连接

广播:向网上的所有其他主机发送帧
多播:单播和广播之间

接口会被设置为混杂模式,这种模式能接收到每个帧的一个复制,如tcpdump

多播地址:01:00:00:00:00:00
广播地址:ff:ff:ff:ff:ff:ff

广播会增加对广播数据不感兴趣主机的处理负荷
多播减少了应用不感兴趣主机的处理负荷,使用多播可以加入一个或者多个多播组

12.2 广播

受限的广播地址:255.255.255.255
该地址用于主机配置过程中ip数据报的目的地址
系统初始启动时用

任何情况,都不转发受限的,仅仅出现在本地网络中

指向网络的广播
A类,netid.255.255.255

指向子网
128.1.2.255
子网掩码255.255.255.0

指向所有子网的广播
128.1.255.255

广播的例子

相应广播前,发送arp请求

多播

ip多播服务

  • 向多个目的地址传送数据
  • 客户对服务器的请求

能够接受王法一个特定多播组地址数据的主机集合成为主机组,一个主机组可以跨越多个网络,主机中的成员随时可以加入或者离开主机组,主机组对主机的数量没有限制,同时不属于某一主机组的主机可以向该组发送消息

多播组地址到以太网地址映射转换

IGMP:Internet 组管理协议

多播的一组协议

DNS

引言

主机名字和 ip 地址之间的转换
解析器通常是应用程序的一部分。在一个应用程序请求 TCP 打开一个连接或使用 UDP 发送一个数据报之前,必须将一个主机名转换成一个 IP 地址。操作系统内核中的 TCPIP 协议族对于 DNS 一点也不知道

DNS 基础

FQDN(full qualified domain name)
顶级域名三部分

  • arpa 用于地址到名字转换的特殊域
  • 7个3字符的普通域
  • 所有2字符的国家域名

一个区域的管理者为该区域提供主名字服务器和至少一个辅助名字服务器。主,辅名字服务器必须是独立和冗余的。

每个名字服务器必须知道根的名字服务器。根服务器知道所有二级域中的每个授权名字服务器的名字和位置

超高速缓存

DNS 报文格式

查询报文:

相应报文

简单的栗子

nslookup
dig

压缩回答报文

  • 返回的结果中包含查询的问题
  • 在返回的结果中会有许多重复的域名,就要用到压缩
    压缩方法就是用指针,最高位为11,他表示这是一个16bit 指针而不是8bit 的计数字节。指针中的剩下14bit 说明在该 DNS 报文中标识符所在的位置。
    一个指针可能指向一个完整的域名,也可能指向一个域名的结尾部分。

指针查询

给定一个 ip 地址,返回与该地址相应的域名
顶级域名arpa 和下面 in-addr 域。当一个组织进入 internet,就获得 DNS 域名空间的授权165.226.125.74.in-addr.arpa
DNS 名字是由 DNS 树的底部逐渐向上书写的

➜  cs615 git:(master) host 74.125.226.165                    
165.226.125.74.in-addr.arpa domain name pointer lga15s45-in-f5.1e100.net.

如果 DNS 树中没有独立的分支来处理这种地址名字的转换,就无法反向转换

资源记录

  • A:ip 记录
  • PTR:指针记录查询,ip 地址被当做 in-addr.arpa 下的一个域名
  • CNAME:别名 alias,规范名字 canonical name
  • HINFO:主机信息
  • NS:名字服务器
  • MX:邮件交换记录,如果发往 linliu.me,会被提醒发送到smtp.secureserver.net
1
2
3
➜ cs615 git:(master) host -t mx linliu.me
linliu.me mail is handled by 10 mailstore1.secureserver.net.
linliu.me mail is handled by 0 smtp.secureserver.net.


第一列域名,第二列寿命值,ttl 为599秒,第三列 IN 就是 internet 类,然后就是类型,然后还有更高的优先值,0或10

1
2
3
4
➜ cs615 git:(master) dig linliu.me
;; ANSWER SECTION:
linliu.me. 599 IN A 192.30.252.154
linliu.me. 599 IN A 192.30.252.153

高速缓存

高速缓存由 NS 维护。
host 命令指出回答不是授权的,因为这个回答来自NS 的高速缓存,而不是来自授权的 NS。

UDP 还是 TCP

大部分时间用 udp
当长度超过时,用 tcp,辅助 ns 启动时,使用 tcp 问主ns 查询有没有变化,这里的传输数据很多

TCP

TCP

  1. 面向连接
  2. 可靠的
  3. 字节流服务

面向连接:

  • 交换数据钱要建立一个tcp连接,握手
  • 仅有两方通信

可靠:

  • 应用数据被tcp分割成合适的发送数据块
  • 发送一个段后,启动定时器,等待目的端确认,不然重发
  • 收到数据,发送一个确认
  • 保持首部和数据的检验和
  • 有可能失序,tcp进行重新排序可以
  • tcp接收端会丢弃重复数据
  • 提供流量控制,有缓冲空间

字节流:

  • 两个应用程序交换8bit的字节构成的字节流
  • tcp不对字节流内容做任何解释,应用层来解释,和unix操作系统的方式很像

20字节

  • 端口号:一个ip地址和一个端口号成为一个socket,两组这个就是一个唯一的tcp连接双方
  • 序号用来标识从tcp端法相收端的数据字节流,对每个字节进行计数
  • 确认序号包含发送确认的一段所期望的下一个序号,确认序号是上次已成功收到的数据字节序号加1,ack标志为1时有效
  • 全双工服务,两个方向上独立进行传输,每一段都保持每个方向上的传输数据序号
  • 首部长度,最多60字节
  • 6个标志比特,多个同时为1

  • 窗口大小用来流量控制

  • 强制检验和,tcp首部和tcp数据,还要用伪首部
  • urg为1时紧急指针有效
  • 可选项中最常见的时mss,maximum segment size
  • 数据部分是可选的,连接建立和终止时,双方报文段只有tcp首部,没有数据,超时时也是只有首部

TCP连接的建立与终止

建立和终止连接

建立连接:三次握手

  • 发送SYN段,加上序号
  • 发回SYN报文段,带上确认序号和自己的序号,一个 SYN 占用一个序号
  • 对序号加1发回一个ack
    enter image description here
    初始序号初始化为1,每0.5秒增加64000

终止:四次握手
因为tcp是半关闭,全双工,所以每次要单独关闭,要4次
一个 FIN 占用一个序号

连接建立的超时

第一次6秒,第二次24秒
默认建立时长是75秒,如果没有建立成功就放弃

使用定时器

最大报文段长度

MSS表示TCP传往另一端的最大块数据的长度,建立时要告诉对面各自的mss,一般来说越大越好,利用率最高,mss值设置为外出接口上的MTU长度减去固定的ip首部和tcp首部长度,一个以太网就是1460
mss选项只能出现在syn报文段中

接受到mss后,发送较小的mss,这样避免分段。如果接口的大,路径中有的比较小,那就要用MTU发现机制

TCP的半关闭

TCP提供连接的一端在结束它的发送后还能接受来自另一端数据的能力
使用FIN

TCP状态变迁图

TIME_WAIT状态也称作2MSL等待状态,这个具体TCP实现必须选择一个报文段最大生存时间MSL,它是任何报文段被丢弃前在网络内的最长时间

结果是2MSL等待时TCP连接的socketip和端口不能再被使用,只有等结束后才能被使用,一般msl时间为30秒,1分钟,2分钟

TCP重启后MSL秒内不能建立任何连接,这个称为平静时间

复位报文段

  1. 到不存在的端口的连接请求
    产生复位的常见情况就是目的端口没有在监听

  2. 异常终止一个连接
    FIN是有序释放
    复位是异常释放
    优点:

  • 丢弃任何带发数据并且利器发送复位报文
  • 另一端知道是异常关闭还是正常关闭,应用程序可以做响应
    rst报文段包含序号和确认序号,另一端不会产生任何响应
    收到rst的一方终止连接,并且通知应用层是异常结束
  1. 检测半打开连接
    一边异常中断另一边不知道,就是板打开

同时打开

两个应用程序同时彼此执行主动打开,只建立一条连接
进行四次交换

同时关闭

TCP选项

TCP服务器设计

并发的,多进程或者多线程

到达多个请求,服务器忙的时候,就有队列
没有空间的话就丢弃tcp报文,也不发回任何报文
队列满时,不理会syn,也不发出rst作为应答

TCP的交互数据流

引言

交互数据:Telnet,Rlogin
成块数据:FTP,电子邮件,新闻

交互式输入

Rlogin 连接上键入交互命令,每一个交互按键都产生一个数据分组.
因此一个按键就有4个报文

可以合并按键确认和按键回显的报文一起发送,这样就只要3个报文

经过时延的确认

通常 tcp 在接收到数据时并不立即发送 ACK, 而是推迟发送,以便将 ACK 与需要演这个方向的数据一起发送,捎带 ACK, 大部分时延是200MS

Nagle 算法

Rlogin 连接每次发送41个字节长的分组,被称为小分组
在广域网上,小分组太多会引起拥塞,所以使用 Nagle 算法

该算法要求一个TCP 连接上最多只能有一个违背确认的未完成的小分组,该分组的确认到达之前不能发送其他的小分组,相反 TCP 收集这些少量的分组,在确认到来时以一个分组的方式发出去.
算法是自适应的,确认的越快,数据发送越快.

在以太网中,回显时延比较快,所以很少使用这个算法.

在广域网中时延大,所以会使用到.客户只有在收到前一个数据的确认后才能发送已经收集的数据,16个字节只要9个报文段

客户端发送3个字节,但是回显1个,这说明服务器端还没有读取完另外两个,但是可以先发送确认的报文段

小结

Rlogin 一个字节传送
Telnet 允许一行
小德报文段,使用经受时延的确认,减少报文段数据
减慢的广域网,使用 Nagle 算法减少报文段数目

TCP 的成块数据流

引言

滑动窗口协议是一种流量控制方法,该协议允许发送方在停止并等待确认钱可以连续发送多个分组

正常的数据流

TCP 的滑动窗口协议,接收方不必确认每一个收到的分组, ACK 是累计的

使用窗口更新来标示窗口有新的空间

滑动窗口

三个行为:

  • 合拢
  • 张开
  • 收缩,不建议使用

窗口大小

PUSH标志

发送方使用该标志通知接收方将所受到的数据全部提交给接受进程,这里的数据包括鱼 PUSH 一起发送的数据以及接收方 TCP 已经为接受进程收到的其他数据。

一个好的 TCP 实现可以自行决定何时设置这个标志

每次写操作清空发送缓存时就发送 PUSH,因为是最后一个报文段

慢启动

当发送方发送太多报文,中间的路由器必须缓存分组,这样会耗尽中间路由器的存储器空间,虽然接收方的还有很多缓存

慢启动 slow start 算法是观察新分组进入网络的速率应该与另一端返回确认的速率相同而进行工作的

慢启动为 tcp 增加了一个窗口:拥塞窗口(congestion window),cwnd。

当建立tcp 连接时,拥塞窗口初始化为1个报文段,没收到一个 ACK,拥塞窗口增加一个报文段。
发送方取拥塞窗口与通告窗口中的最小值作为发送上限
拥塞窗口是发送方使用的流量控制
通告窗口是接收方使用的流量控制
启动时,是指数的增长关系
在某个点可能达到了互联网的容量,于是中间路由器开始丢弃分组,这就通知发送方它的拥塞窗口过大了。。。。就要用到超时重传机制

成块数据的吞吐量

窗口大小,窗口流量控制,慢启动对于吞吐量的作用

一个分组的时间取决于两个因素

  • 传播时延
  • 媒体速率的发送时延

通路中,速率较慢时,发送时延主要作用
速度快的话就是传播时延主要作用

带宽时延乘积
capacity (bits) = bandwidth (bits/sec) x round-trip time (sec)

拥塞
当数据到达一个大的管道并向一个较小的管道,就会发生拥塞
当多个输入流到达一个路由器,而路由器的输出流小鱼这些输入流的总和时就会发生拥塞

紧急方式

TCP 的超时与重传

引言

数据丢失时,TCP 通过发送时设置一个定时器解决这个问题,定时器溢出时还没有收到确认,就重传。关键在于超时的间隔和如果确定重传的频率

4个不同的定时器:

  • 重传定时器用于希望收到另一端的确认,本节
  • 坚持定时器使窗口大小信息保持不断流动,22节
  • 保活定时器检测一个空闲连接的另一端合适崩溃或重启,23节
  • 2MSL 定时器测量连接 TIME_WAIT 状态的时间,18.6

超时与重传的简单例子

使用“指数退避”的方法
3,6,12,24,48,多个64秒来进行再一次确认,最后9分钟后放弃,返回错误

往返时间测量

往返时间 RTT 测量。

  1. 最初
    M:测量到的当前 RTT
    $$R\gets \alpha R+(1-\alpha )M$$
    a为0.9的平滑因子
    RTO 超时重传时间
    $$RTO=R\beta$$
    $\beta$推荐为2
    这种方法在 RTT 变化范围很大时,这个方法无法跟上这种变化,会引起不必要的重传,所以用到了方差

  2. 改进
    $$Err=M-A$$
    $$A\gets A+gErr$$
    $$D\gets D+h(|Err|-D)$$
    $$RTO=A+4D$$
    A是被平滑的 RTT
    D室被平滑的均值方差
    Err 是刚测到的测量结果鱼当前 RTT 估计值的差
    g 起平均作用,取值1/8
    偏差的增益 h,取值0.25
    RTT 变化时,较大的偏差增益会让 RTO 快速上升

karn 算法
发出分组时超时,发出多个重传的分组,接收到 ack 时不知道是哪一个,这就是重传多义性的问题
所以,当一个超时和重传发生时,在重传数据的确认最后到达时,不更新 rtt 估计器,因为不知道哪一个 ack 对应那次传输
由于数据被重传,rto 得到一个指数退避,在下一次传输时使用这个退避后的 rto,对一个没有被重传的报文,除非收到了一个确认,不要计算新的 rto

往返时间 RTT 例子

RTT 计算不是对所有的报文段
每个列检只测量一次 RTT 值,发送一个报文段是,如果定时器已经使用,那么这个报文段不会被计时,只有数据报文会被计时,ACK 是不会被计时的
当收到一个包含这个序号的确认后,定时器就会被关闭

RTT 估计的几个过程

  • 初始化,A和 D为0和3秒
    RTO=A+2D=6s
    初始化2D值在初始化时用,别的时候4D
  • 当 SYN 需要重传时,第一次6秒
    第二次的计算时间为
    RTO=A+4D=12s
    由于指数退避所以两倍24秒
    当 ACK 重传到达,A 和 D不会更新,因为 Karn 算法,所以还是24秒,虽然有一个 ack 了
  • 到达第一个报文 ack 时
    A=M+0.5=1.5+0.5=2
    D=A/2=1
    RTO=A+4D=6s
  • 第二个 ack 到达
    按照公式来算 RTO=6.3125
    浮点原因最后为6s

拥塞举例

收到3同样的 ack 时,重传
接收方不断产生一样的 ack,并且暂时保存接受到的失序数据

拥塞避免算法

两种分组丢失的指示:发生超时和收到重复的确认
拥塞避免算法和慢启动算法要对每个连接维持两个变量

  • 一个拥塞窗口 cwnd
  • 一个慢启动门限 ssthresh

算法过程:

  • 对一个给定连接,初始化 cwnd 为一个报文段,ssthresh 为65535个字节
  • tcp 输出不能超过 cwnd 和接收方通告窗口的大小
  • 发生拥塞时,ssthresh 被设置为当前窗口大小的一半(cwnd 和接收方通告窗口的最小值),如果超时引起了拥塞,把 cwnd 设置为1个报文段,就是慢启动
  • 当有数据确认时,增加 cwnd,增加的方法依赖于是慢启动还是拥塞避免,cwnd 小鱼 ssthresh 就是慢启动否则就是拥塞避免,慢启动一直持续到当拥塞发生时所处位置的一半的时候才停止转为拥塞避免

慢启动:1,2,4,8,对每一个 ack 增加1
拥塞避免:每收到一个确认就讲 cwnd 增加1/cwnd,加薪增长,希望在一个往返时间内最多为 cwnd 增加一个报文段

快速重传与快速恢复算法

收到失序的报文时,tcp 立即产生一个 ack,不应该被延迟,重复的 ack 目的是让对方知道收到的时一个失序的报文段。
收到3个 ack 时,崇春丢失的数据报文段,接下来不是慢启动算法而是拥塞避免算法,这就是快速恢复算法

算法实现

  1. 收到3个重复的 ack,将 ssthresh 设置为当前拥塞窗口 cwnd 的一半,重传丢失的报文段,设置 cwnd 为 ssthresh 加上3被的报文段大小
  2. 每次收到一个重复的 ack,cwnd 增加一个报文段大小并发送一个分组,如果新的 cwnd 允许发送,例子中庸的时 cwnd 取值和未被确认的数据大小比较
  3. 下一个确认新数据的 ack 到达时,设置 cwnd 为 ssthresh。这是对第一个步骤的确认也是对中间报文段的确认,这一步采用拥塞避免

按每条路由进行度量

tcp 连接关闭时可以记录下足够多的数据来统计

TCP 的坚持定时器

窗口为0时,发送方不发数据,接收方窗口大于0时,返回一个 ack,但是这个 ack 会丢失。这样就导致了死锁。
为了防止死锁,发送方使用一个坚持定时器来周期性向接收方查询,以发现窗口是否已经增大

当通告窗口为0,客户停止发送任何其他数据,这就引起了客户设置其坚持定时器,然后以指数退避的方法来不断发送询问,tcp 不会放弃发送窗口探查

糊涂窗口综合征:少量的数据将通过连接进行交换,而不是满长度。
接收方:

  • 不通告小窗口。接收方不通告一个比当前窗口大的窗口,除非窗口可以增加一个报文段大小或者可以增加接收方缓存的一半
    发送方:
  • 可以发送一个满长度的报文段
  • 可以发送至少接收方通告窗口大小一半的报文段
  • 能够发送手头的所有数据并且不希望接受 ack

TCP 的保活定时器

许多情况下一个服务器希望知道客户主机是否处于崩溃并关机或者崩溃又重启的状态,于是就提供了保活定时器

保活定时器比较有争议,有人认为不应该在 tcp 中实现,而是在应用层中实现

在连接两个端系统的网络出现零时鼓掌时候,保活选项会引起一个实际上很好的连接被终止

如果一个给定的连接两个小时之内没有任何动作,则服务器就向客户发送一个探查报文段

  • 客户主机依然正常运行,并从服务器可达
  • 客户主机已经崩溃,并且关闭或者正在重新启动
  • 客户主机崩溃并已经重新启动
  • 客户主机正常运行,但是服务器不可达

TCP 的未来和性能

路径 MTU 发现

更新汇总

——-First commit 2015/04/04 23:07———————————————————————————————-
提交更新 大部分主要内容

  • TCP
  • UDP
  • IP
  • ICMP
  • 链路层
  • 一些主要应用层协议
Contents
  1. 1. TCP/IP 详解(卷1:协议)
  2. 2. 概述
  3. 3. 链路层
    1. 3.1. 链路层
      1. 3.1.1. 环回接口
    2. 3.2. ARP
      1. 3.2.1. 引言
      2. 3.2.2. 例子
      3. 3.2.3. ARP高速缓存
      4. 3.2.4. ARP的分组格式
      5. 3.2.5. ARP例子
      6. 3.2.6. ARP代理
      7. 3.2.7. 免费ARP
      8. 3.2.8. ARP命令
    3. 3.3. ICMP:internet控制报文协议
      1. 3.3.1. 引言
      2. 3.3.2. ICMP报文的类型
      3. 3.3.3. ICMP地址掩码请求与应答
      4. 3.3.4. ICMP时间戳请求与应答
      5. 3.3.5. ICMP端口不可达差错
  4. 4. 应用层
    1. 4.1. ping程序
      1. 4.1.1. 引言
      2. 4.1.2. ping程序
      3. 4.1.3. ip记录路由选项
    2. 4.2. Traceroute程序
      1. 4.2.1. 引言
      2. 4.2.2. Traceroute操作
      3. 4.2.3. 局域网输出
      4. 4.2.4. 广域网输出
      5. 4.2.5. ip源站选路选项
  5. 5. IP 层
    1. 5.1. IP
      1. 5.1.1. 引言
      2. 5.1.2. IP首部
      3. 5.1.3. IP路由选择
      4. 5.1.4. 子网寻址
      5. 5.1.5. 子网掩码
      6. 5.1.6. 特殊情况的ip地址
      7. 5.1.7. 子网例子
      8. 5.1.8. ifconfig命令
      9. 5.1.9. netstat命令
    2. 5.2. IP选路
      1. 5.2.1. 引言
      2. 5.2.2. 路由原理
      3. 5.2.3. ICMP主机与网络不可达差错
      4. 5.2.4. ICMP重定向差错
      5. 5.2.5. ICMP路由器发现报文
    3. 5.3. 动态选路协议
      1. 5.3.1. 引言
      2. 5.3.2. 动态选路
      3. 5.3.3. RIP选路信息协议
      4. 5.3.4. RIP 版本2
      5. 5.3.5. OSPF开放最短路径优先
      6. 5.3.6. BGP边界网关协议
  6. 6. UDP
    1. 6.1. UDP
      1. 6.1.1. 引言
      2. 6.1.2. UDP首部
      3. 6.1.3. UDP检验和
      4. 6.1.4. IP分片
      5. 6.1.5. ICMP不可达差错(需要分片)
      6. 6.1.6. Traceroute确定路径MTU
      7. 6.1.7. 采用udp的路径mtu发现
      8. 6.1.8. UDP和ARP之间的交互作用
      9. 6.1.9. 最大UDP数据报长度
      10. 6.1.10. ICMP源站抑制差错source quench
      11. 6.1.11. UDP服务器的设计
    2. 6.2. 广播和多播
      1. 6.2.1. 引言
      2. 6.2.2. 12.2 广播
      3. 6.2.3. 广播的例子
      4. 6.2.4. 多播
    3. 6.3. IGMP:Internet 组管理协议
    4. 6.4. DNS
      1. 6.4.1. 引言
      2. 6.4.2. DNS 基础
      3. 6.4.3. DNS 报文格式
      4. 6.4.4. 简单的栗子
      5. 6.4.5. 指针查询
      6. 6.4.6. 资源记录
      7. 6.4.7. 高速缓存
      8. 6.4.8. UDP 还是 TCP
  7. 7. TCP
    1. 7.1. TCP
    2. 7.2. TCP连接的建立与终止
      1. 7.2.1. 建立和终止连接
      2. 7.2.2. 连接建立的超时
      3. 7.2.3. 最大报文段长度
      4. 7.2.4. TCP的半关闭
      5. 7.2.5. TCP状态变迁图
      6. 7.2.6. 复位报文段
      7. 7.2.7. 同时打开
      8. 7.2.8. 同时关闭
      9. 7.2.9. TCP选项
      10. 7.2.10. TCP服务器设计
    3. 7.3. TCP的交互数据流
      1. 7.3.1. 引言
      2. 7.3.2. 交互式输入
      3. 7.3.3. 经过时延的确认
      4. 7.3.4. Nagle 算法
      5. 7.3.5. 小结
    4. 7.4. TCP 的成块数据流
      1. 7.4.1. 引言
      2. 7.4.2. 正常的数据流
      3. 7.4.3. 滑动窗口
      4. 7.4.4. 窗口大小
      5. 7.4.5. PUSH标志
      6. 7.4.6. 慢启动
      7. 7.4.7. 成块数据的吞吐量
      8. 7.4.8. 紧急方式
    5. 7.5. TCP 的超时与重传
      1. 7.5.1. 引言
      2. 7.5.2. 超时与重传的简单例子
      3. 7.5.3. 往返时间测量
      4. 7.5.4. 往返时间 RTT 例子
      5. 7.5.5. 拥塞举例
      6. 7.5.6. 拥塞避免算法
      7. 7.5.7. 快速重传与快速恢复算法
      8. 7.5.8. 按每条路由进行度量
    6. 7.6. TCP 的坚持定时器
    7. 7.7. TCP 的保活定时器
    8. 7.8. TCP 的未来和性能
      1. 7.8.1. 路径 MTU 发现
  8. 8. 更新汇总