[TOC]
概述
- 网络层,处理分组在网络中的活动。在TCP/IP协议族中,网络层协议包括IP协议,ICMP协议,IGMP协议。
- 传输层主要为两台主机上的应用程序提供端到端的通信。在TCP/IP协议族中,有两个互不相同的传输协议:TCP传输控制协议,UDP用户数据报协议。
- IP地址长32bit,有abcde五类互联网地址。有三类P地址:单播地址,广播地址,多播地址。
- 由于TCP,UDP,ICMP和IGMP都要向IP传送数据,因此IP必须在生成的IP首部中加入某种标识,以表明数据属于哪一层。所以它在首部存入了一个8bit的数值,称为协议域。6为TCP,17标识UDP。
- 很多应用程序使用TCP或UDP来传输数据。传输层协议在生成报文首部时存入一个应用程序的标识符。TCP和UDP都用一个16bit的端口号来标识不同的应用程序。
- 网络接口要发送和接收IP,ARP,RARP数据,所以也要在以太网帧首部加入16bit的帧类型域,指明生成数据的网络层协议。
DNS:域名系统
- DNS是一种用于TCP/IP应用程序的分布式数据库,他提供主机名字和IP地址之间的转换及有关电子邮件的选路信息。
链路层
- 以太网是当今TCP/IP采用的主要的局域网技术。IEEE 802是另一个不同的标准集。两种帧格式都采用48bit的目的地址和源地址。ARP和RARP协议对32bit的IP地址和48bit的硬件地址进行映射。
- 大多数产品支持环回接口Loopback Interface,以允许运行在同一台主机上的客户程序和服务器程序通过TCP/IP进行通信。A类网络号127就是为环回接口预留的。根据惯例大多数系统把127.0.0.1分配给这个接口。
- 以太网和802.3对数据帧的长度都有一个现实,其最大值分别是1500和1492字节。链路层这个特性叫做MTU,最大传输单元。如果IP层有一个数据报要传,而且数据长度比链路层的MTU要大,那么IP层就要进行分片。
- 如果两台主机之间的通信需要经过多个网络,那个每个网络的链路层就可能有不同的MTU。重要的不是两台主机所在网络的MTU的值,而是路径中最小的MTU。他被成为路径MTU。两台主机之间的路径MTU不一定是常数,取决于当时所选择的路由。而且选路不一定是对称的,因此路径MTU在两个方向上不一定是一致的。
- MTU降到256以下,将降低传输大块数据的最大吞吐量。
IP:网际协议
-
所有TCP,UDP,ICMP,IGMP数据都以IP数据报格式进行传输。
-
不可靠的意思是他不能保证IP数据报能成功地到达目的地。如果发生某种错误,如某个路由器暂时用完了缓冲区,IP会丢弃该数据报,然后发送ICMP消息报给信源端。
-
无连接指IP并不维护任何关于后续数据报的状态信息。每个数据报的处理都是相互独立的。这说明相同信源发送两个连续数据报,他们都独立选择路由,可能到达次序不确定。
-
TTLtime-to-live生存时间字段设置了数据报可以经过的最多路由器数。它指定了数据报的生存时间。TTL的初始值是由源主机设置通常为32或64,一旦经过一个处理它的路由器,他的值就-1.当该字段值为0时,数据报就被丢弃,并发ICMP报文通知源主机。
-
每一份IP数据报都包含源IP地址和目的IP地址。
-
IP路由选择是简单的。如果目的主机与源主机直接相连或者在同一个共享网络上,那么IP数据报就直接送到目的主机上。否则就把数据报发往一默认路由器上。
-
IP层在内存中有一个路由表,当收到一份数据进行发送时,它都要对该表搜索一次。
路由表的每一项都包含如下信息:
目的IP地址。它既可以是一个完整的主机地址,也可以是一个网络地址(0.0.0.0),以指代网络中的所有主机。
下一跳路由器next-hop router的IP地址,或者有直接连接的网络IP地址。下一站路由器是指一个在直接相连网络上的路由器,通过它可以转发数据报。
标志。其中一个标志目的IP地址是网络地址还是主机地址。
为数据报的传输指定一个网络接口。
-
IP路由选择是逐条地hop-by-hop进行的。IP并不知道到任何目的地完整路径。所有IP路由选择只为数据传输提供下一站路由器的IP地址。IP路由选择主要完成如下功能:
搜索路由表,寻找能与目的地址完全匹配的表目(网络号和主机号都要匹配)。
搜索路由表,寻找能与目的网络号相匹配的表目。如果能找到,把报文发送给该表目指定下一站路由器或者直接连接的网络接口。这个要考虑子网掩码。
搜索路由表,寻找标为默认的表目。
如果上面步骤都没完成,则会返回主机不可达的错误。
数据报中的目的IP地址始终不发生任何变化。
-
IP地址不被单纯看做由一个网络号和一个主机号组成,而是把主机号再分成一个子网号和一个主机号。
-
子网掩码是一个32bit的值,其中值为1的bit留给网络号和子网号,0的bit留给主机号。
ARP:地址解析协议
-
数据链路比如以太网或令牌环网都有自己的寻址机制(通常为48bit地址)。当一台主机把以太网数据帧发送到位于同一局域网上的另一台主机主机时,是根据48bit的以太网地址来确定目的接口的。
ARP为IP地址到对应的硬件地址之间提供动态映射。 -
当用户输入ftp bsdi的时候,如上图步骤:
FTP客户端调用DNS解析gethostbyname把主机名转换成32bit的IP地址。
FTP客户端请求TCP用得到的IP地址建立连接。
封包,TCP和IP包。如果是内网直接送到目的主机。如果是远程网络通过IP选路确认下一跳路由器地址。
假定是一个以太网,那么发送端主机必须把32bitIP地址转换成48bit的以太网地址。
从逻辑Internet地址到对应的物理硬件地址需要进行翻译。这就是ARP的地址。
ARP发送一份叫做ARP请求的以太网数据帧给以太网上的每个主机。这个过程叫广播。如上图虚线。
目的主机的ARP层收到这份广播报文后,发送一个ARP应答,包含IP地址及对应的硬件地址。
收到ARP应答后,使用ARP进行一应答交换的IP数据报现在就可以传送了。
发送IP数据报到目的地址。
在ARP后有一个概念,网络接口有一个硬件地址(48bit的值,表示不同的以太网或令牌环网络接口)。在硬件层面上进行的数据帧交换必须有正确的接口地址。但是TCP/IP有自己的地址:32bit的IP地址。ARP的功能是在32bit的IP地址和采用不同网络技术的硬件地址之间提供动态映射。
-
在以太网报头前两个地址是以太网的源地址和目的地址,目的地址全为1的是广播地址,所有以太网接口都要接受广播的数据帧。
当ARP回复时会把硬件地址填进去。
-
如果ARP请求是从一个网络主机发往另外一个网络的主机,那么连接这两个网络的路由器就可以回答该请求,这个过程称为委托ARP或者ARP代理。这样就可以欺骗发起ARP请求的发送端,使他误以为路由器就是目的主机。路由器的功能相当于目的主机的代理。
Traceroute程序
开始时发送一个TTL为1的UDP数据报,然后将TTL字段每次+1,以确定路径中的每个路由器。每个路由器在丢弃UDP数据报的时候都返回一个ICMP超时报文,而最终目的主机则产生一个ICMP端口不可达的报文。
IP选路
-
查看主机路由表netstat -rn,route,noName。
(略)
用n参数把主机名变成ip,否则会是default或者zl-link之类的。
flags有几种重要的标志:
U 该路由可以使用
G 该路由是到一个网关
H 该路由是到一个主机。也就是说目的地址是一个完整的主机地址。如果没有该标志,则说明该路由是到一个网络,而目的地址是一个网络地址:一个网络号,或者网络号和子网号的组合。
-
标志G非常重要,他区分了间接路由和直接路由。
区别:
发往直接路由的分组中不但指明目的端的IP地址,还具有其链路层地址。
发往间接路由,IP地址指明了最终目的地,但是链路层地址是下一站路由器。
-
H的标志标明目的地地址是一个网络地址(如169.254)。
当为某个目的地的IP地址搜索路由表时,主机地址必须与目的地址完全匹配,而网络地址项只需要匹配目的地址的网络号和子网号。
-
Refcnt列出了正在使用路由的活动进程个数。
-
use显示的是通过该路由发送的分组数。
-
使用路由表的步骤:
首先进行主机地址的匹配。假设目的地址是140.252.13.33,先看路由表的Destination中是否有这个地址。这是要根据flags为H的来找。如果有这个地址,其flags同时又HG,代表其还间接路由,链路层地址将是网关的链路层地址。
如果没有则进行网络地址匹配,比如找到了140.252.13.65,这样网络号和子网号都匹配了。这个时候看flags,如果没有G标志则是直接路由,所以此时链路层地址将是目的地地址,而不是下一跳路由的地址。
如果要通过Internet给外网主机发送一个数据报,找主机地址和网络地址都失败后,将使用默认表。
-
当路由器收到一份IP数据报但又不能转发时,就要发送一份ICMP『主机不可达』差错报文。
-
主机表项比网络表项具有更高的优先级,而网络表项比默认项具有更高的优先级。
动态选路协议
- 当相邻路由器之间进行通信,以告知对方每个路由器当前所连接的网络,这时就出现了动态选路。路由器之间必须采用选路协议进行通信,这样的选路协议有很多种,入RIP,OSPF,BGP。
- 动态选路并不改变上面说的内核在IP层的选路方式。这儿变化的仅仅是路由表中的信息变化了,它随着时间由路由守护程序动态地增加或删除。
- RIP报文包含在UDP数据中。每个RIP报文最多携带25条路由。routed程序运行时请求其每个接口发送一个报文,要求其他路由器发送完整路由表。并在每30s定期更新。每条路由都有与之相关的定时器,一条路由在3分钟内未更新,则将该路由设置为无穷大,并标注为删除。再过60s删除该路由,避免其被传播开。
- RIP所使用的度量是以跳hop计算的。所有直接连接接口的跳数为1.如果从一个路由器到一个网络有多条路由,那么路由器将选择跳数最小的路由。跳数最大值为15.跳数为16则表示无路由到达该IP地址。
UDP:用户数据报协议
- 大多数UDP服务器是重复型服务器。这意味着,单个服务器进程对单个UDP端口上的所有客户端进行处理。来自不同客户的差不多同时到达的请求将由UDP自动排队。接受到的UDP数据报以其接受顺序交给应用程序。排队溢出造成内核中UDP模块丢失数据报的可能性是存在的。
TCP:传输控制协议
-
TCP提供一种面向连接的、可靠的字节流服务。
-
面向连接意味着两个使用TCP的应用在彼此交换数据之前必须先建立一个TCP连接。
-
在一个TCP连接中,仅有两方进行彼此通信。广播和多播不能用于TCP。
-
应用数据被分割成TCP认为最适合发送的数据库。这和UDP完全不同,UDP应用程序产生的数据报长度将保持不变。TCP传递给IP的信息单位成为报文段或段segment。
TCP发出一个段后,将启动一个定时器,等待目的端确认收到这个报文段。如果不能,将重发这个报文段。
当TCP收到发自TCP连接的另一端的数据,它将在几分之一秒后发送一个确认。
TCP将保持它首部和数据的检验和。如果有任何差错,将丢弃这个报文段。
TCP报文段作为IP数据报来传送,IP数据报到达可能失序,因此TCP报文段也可能会失序。TCP将在必要时对收到的数据进行重新排序。
TCP还能提供流量控制。TCP连接的每一方都有固定大小的缓冲空间。TCP的接收端只允许另一端发送接收端缓冲区所能接纳的数据。这将防止较快主机致使较慢主机的缓冲区溢出。
TCP对字节流的内容不做任何解释。它不清楚传输的字节流是什么格式数据。
-
有时,一个IP地址和一个端口号也称为一个插口socket。插口对socket pair包含客户IP客户端口服务IP服务端口的四元组可唯一确定互联网络中每个TCP连接的对方。
序号用来表示从TCP发端向TCP收端发送的数据字节流。TCP为应用层提供全双工服务。这意味数据能在两个方向上独立进行传输。
TCP首部有六个标志比特,他们中的多个可同时被设为1.
URG 紧急指针有效
ACK 确认序号有效
PSH 接收方应该尽快将这个报文段交给应用层
RST 重新连接
SYN 同步序号用来发起一个连接
FIN 发端完成发送任务
TCP连接的建立与终止
-
看一段例子,TCP报文的输出格式
00:20:14.626034 IP 192.168.1.150.38329 > 192.168.1.1.23: Flags [S], seq 1634332606, win 14600, options [mss 1460,sackOK,TS val 620471935 ecr 0,nop,wscale 7], length 0
00:20:14.626797 IP 192.168.1.1.23 > 192.168.1.150.38329: Flags [S.], seq 3225218442, ack 1634332607, win 5840, options [mss 1460,nop,nop,sackOK,nop,wscale 2], length 0
00:20:14.627542 IP 192.168.1.150.38329 > 192.168.1.1.23: Flags [.], ack 1, win 115, length 0
00:20:14.629107 IP 192.168.1.150.38329 > 192.168.1.1.23: Flags [P.], seq 1:25, ack 1, win 115, length 24
00:20:14.629495 IP 192.168.1.1.23 > 192.168.1.150.38329: Flags [.], ack 25, win 1460, length 0
00:20:15.134589 IP 192.168.1.1.23 > 192.168.1.150.38329: Flags [P.], seq 1:102, ack 25, win 1460, length 101 -
格式为源 > 目的:标志
这里的标志代表TCP首部中6个标志比特中的4个。
S SYN 同步序号
F FIN 发送方完成数据发送
R RST 复位连接
P PSH 尽可能快地把数据送往接收进程
. 以上四个标志比特均置0
-
win 4096发端通告的窗口大小。
mss 1024表示由发端指明的最大报文段长度选项。发端将不接受超过这个长度的TCP报文段。这通常是为了避免分段。
-
为了建立一条TCP连接:
请求端发送一个SYN指明客户打算连接的服务器端口,以及初始序号(ISN,如上面的1634332606)。
服务器发回包含服务器的初始序号的SYN报文段作为应答。同时,将确认序号设置为客户的ISN+1以对客户的SYN报文段进行确认。一个SYN将占用一个序号。
客户必须将确认序号设置为服务器的ISN+1以对服务器的SYN报文段进行确认。
这三个报文段完全连接的建立。这个过程也称为三次握手。
发送第一个SYN的一端将执行主动打开。接受这个SYN并发回下一个SYN的另一端执行被动打开。
当一端为建立连接而发送它的SYN时,它为连接选择一个初始序号。ISN随时间而变化,因此每个连接都将具有不同的ISN。
终止一个连接需要经过4次握手,这是由TCP的半关闭造成的。既然一个TCP连接是全双工,因此每个方向必须单独地进行关闭。这原则就是当一方完成它的数据发送任务后就能发送一个FIN来终止这个方向连接。当一端收到一个FIN,它必须通知应用层另一端终止了那个方向的数据传送。
收到一个FIN只意味着在这一方向上没有数据流动。一个TCP连接在收到一个FIN后仍能发送数据。
当服务器收到这个FIN,它发挥一个ACK,确认序号为收到的序号+1.和SYN一样,一个FIN将占用一个序号。
接着这个服务器程序关闭连接,导致它的TCP端发送一个FIN,客户必须发回一个确认,并将确认序号设置为收到序号+1.
-
默认情况下tcpdump只在显示SYN报文段时显示完整的序号,而对其后的序号则显示他们与初始序号的相对偏移值。
-
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 *:ssh : LISTEN 3278/sshd
tcp 0 0 *:microsoft-ds : LISTEN 4258/smbd
tcp 0 0 localhost:mysql : LISTEN 2808/mysqld -
如上显示netstat -ap
本地显示为*:ssh,星号通常称为通配符。表示传入的连接请求SYN将被任何一个本地接口所接受。
远端显示*.*,表示还不知道远端IP地址和端口号,因为该端还处于LISTEN状态。
TCP的交互数据流
-
tcp的数据包括成块数据和交互数据。其需要同时处理这两类数据,但是使用的处理算法有所不同。
-
当客户端键入一个字符时,会产生四个报文段,首先客户端发给服务器一个数据字节,然后服务器的按键确认,然后来自服务器的按键回显,然后是客户的按键回显确认。一般可以将报文2和报文3合并。
-
交互数据总是以小于最大报文段的分组发送。在Rlogin中通常只有一个字节从客户发送到服务器。Telnet允许一次发送一行输入数据,但是目前大多数实现仍然发送一个字节。
对于这些小的报文段,接收方使用经受时延的确认方法来判断确认是否可被推迟发送,以便与回送数据一起发送。这样通常会减少报文段的数目,尤其是对于需要回显用户输入字符的Rlogin会话。
在较慢的广域网环境中,通常使用Nagle算法来减少这些小报文段的数目。这个算法限制发送者任何时候只能有一个发送的小报文段未被确认。
TCP的成块数据流
- 进行成块数据有效传输的最重要的方法是TCP的滑动窗口协议。我们考察了TCP为使发送方和接收方之间的管道充满来获得最可能快的传输速度而采用的方法。我们用带宽时延乘积衡量管道的容量,并分析了该乘积与窗口大小之间的关系。
- 滑动窗口(待)
TCP的超时和重传
-
TCP通过在发送时设置一个定时器来解决丢失问题。当定时器溢出时还没收到确认,就重传该数据。对每个连接,TCP管理4个不同的定时器。
重传定时器使用于当希望收到另一端的确认。
坚持persist定时器使窗口大小信息保持不断流动,即使另一端关闭了其接受窗口。
保活keepalive定时器可检测到一个空闲连接的另一端何时崩溃或重启。
2MSL定时器测量一个连接处于TIME_WAIT状态的时间。
-
当断开后重传,其时间在每次重传时增加1倍并直至64秒。这个倍乘关系被称为指数退避exponential backoff。
首次分组传输与复位信号传输(最后一次)之间的时间差约为9分钟,该时间在目前的TCP实现中是不可变的。
-
TCP超时与重传中最重要的部分就是对一个给定连接的往返时间RTT的测量。由于路由器和网络流量均会变化,因此我们认为这个时间可能经常会发生变化,TCP应当跟踪这些变化并相应改变其超时时间。
TCP的坚持定时器
-
TCP通过让接收方指明希望从发送方接收的数据字节数(窗口大小)来进行流量控制。如果窗口大小为0将有效阻止发送方传送数据,直到窗口变为非0为止。
如果一个确认丢失了,则双方就有可能因为等待对方而使连接终止:接收方等待接收方数据(因为他已经向发送方通告了一个非0的窗口),而发送方在等待允许它继续发送数据的窗口更新。
为了防止这种死锁情况发生,发送方使用一个坚持定时器persist timer来周期性地向接收方查询,以便发现窗口是否已增大。这些从发送方发出的报文段称为窗口探查window probe。
-
在连接的一方需要发送数据但是对方已通告窗口大小为0时,就需要设置TCP的坚持定时器。发送方使用重传间隔时间,不断探查已关闭的窗口。
TCP的保活定时器
-
如果客户已经消失了,使得在服务器上留下一个半开放连接,而服务器又在等待来自客户的数据,则服务器将永远等待下去,保活功能就是试图在服务器端检测到这种半开放的连接。
-
如果一个给定的连接在两个小时之内没有任何动作,则服务器就向客户发送一个探查报文段。客户端必须处于以下4个状态之一。
客户主机正常运行。TCP响应正常。服务器在两小时以后将保活定时器复位。
客户主机已经崩溃,并且关闭或者正在启动。服务器将不能收到对探查的相应,并在75s后超时。服务器总共发送10个这样的探查,每个间隔75s。如果服务器没有收到一个响应,他就认为客户主机已经关闭并终止连接。
客户主机崩溃并已经重新启动。这时服务器将收到一个对其保活探查的响应,但是这个响应是一个复位,使得服务器终止这个连接。
客户主机正常运行,但是从服务器不可达。和第二个状态相同。
Telnet和Rlogin:远程登录
-
Telnet协议可以工作在任何主机或任何终端之间。其规定了一种通用字符终端叫做网络虚拟终端NVTnetwork virtual terminal。NVT是虚拟设备,连接的双方,即客户端和服务器,都必须把他们的物理终端和NVT进行相互转换。也就是说不管客户进程终端是什么类型,操作系统必须把它转换成NVT格式。服务器也是。
NVT是带有键盘和打印机的字符设备。用户击键产生的数据被发送到服务器进程,服务器进程回送的相应则被输出到打印机上。这个输出是可改变的。
tcpdump程序
tcpdump通过将网络接口卡设置成混杂模式promiscuous mode来截获通过网络接口的每个分组。而正常情况下,用于诸如以太网媒体的接口卡只截获送往特定接口地址或广播地址的链路层的帧。
底层的操作系统必须允许将一个接口设置成混杂模式,并且允许一个用户进程截获帧。
计算机时钟
硬件按照一定的频率产生一个时钟中断。对于Sun SPARC和Intel 80386,时钟中断每10ms产生一次。
大多数计算机使用一种无补偿的晶体振荡器来生成这些时钟中断。你无法知道这种振荡器一天的偏差有多少。这意味着几乎没有计算机能维持精确的时间。
Unix系统中引起时间差错的另一个公共原因是10ms的中断只是引起内核给一个记录时间的变量增1.如果内核丢失了一个中断,时钟将失去10ms。
sock程序