最新文章专题视频专题问答1问答10问答100问答1000问答2000关键字专题1关键字专题50关键字专题500关键字专题1500TAG最新视频文章推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37视频文章20视频文章30视频文章40视频文章50视频文章60 视频文章70视频文章80视频文章90视频文章100视频文章120视频文章140 视频2关键字专题关键字专题tag2tag3文章专题文章专题2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章专题3
当前位置: 首页 - 正文

TCP_IP学习笔记

来源:动视网 责编:小OO 时间:2025-09-30 22:24:39
文档

TCP_IP学习笔记

《TCP/IP详解》学习笔记1——链路层重点知识:链路层的作用、以太网的封装、SLIP和PPP协议以及链路的重要特性(MTU和串行线路吞吐量的计算)。1、链路层的作用为IP模块发送和接收IP数据报;为ARP模块发送ARP请求和接收ARP应答;为RARP模块发送RARP请求和接收RARP应答;2、以太网的封装SA(6)|DA(6)|TYPE(2)|DATA(46-1500)|CRC(4)两字节的TYPE字段定义了后续数据的类型,用来说明生成数据的网络层协议。0x0800表示数据类型为IP数据报,
推荐度:
导读《TCP/IP详解》学习笔记1——链路层重点知识:链路层的作用、以太网的封装、SLIP和PPP协议以及链路的重要特性(MTU和串行线路吞吐量的计算)。1、链路层的作用为IP模块发送和接收IP数据报;为ARP模块发送ARP请求和接收ARP应答;为RARP模块发送RARP请求和接收RARP应答;2、以太网的封装SA(6)|DA(6)|TYPE(2)|DATA(46-1500)|CRC(4)两字节的TYPE字段定义了后续数据的类型,用来说明生成数据的网络层协议。0x0800表示数据类型为IP数据报,
《TCP/IP详解》学习笔记1——链路层

重点知识:链路层的作用、以太网的封装、SLIP和PPP协议以及链路的重要特性(MTU和串行线路吞吐量的计算)。

1、链路层的作用

为IP模块发送和接收IP数据报;

为ARP模块发送ARP请求和接收ARP应答;

为RARP模块发送RARP请求和接收RARP应答;

2、以太网的封装

SA(6)   |   DA(6)   |   TYPE(2)  |   DATA(46-1500)  |   CRC(4)

两字节的TYPE字段定义了后续数据的类型,用来说明生成数据的网络层协议。0x0800表示数据类型为IP数据报,0x0806表示ARP请求/应答。此外,以太帧中数据段部分有最小长度要求46字节,在数据长度不够时需插入填充字节。

3、两种协议

SLIP——串行线路协议;PPP是点对点协议。两种协议都是在串行线路上封装IP数据报的方法,提供了一种低速接入的解决方案。以这种方式入网时,用户需要的设备包括一台PC、一条电话线、一台调制解调器(MODEM)、一根RS-232电缆,利用调制解调器通过公共电话网进行Internet连接。使用SLIP或PPP协议与主机通信,使本地PC具有IP地址,成为Internet的一部分。以这种方式上网的用户,每次在连接Internet时会被临时分配到一个IP地址,这样的地址称为动态IP地址。

4、链路的重要特性

每一种数据链路层协议对数据帧的长度都有一个,其最大值称为MTU,超过这个值就要进行分片。

串行线路吞吐量的计算:如果线路速率是9600 b/s,而一个字节有8bit,加上一个起始比特和一个停止比特,那么线路的速率就是9600 / ( 8 + 2 ) = 960 B/s(字节/秒)。如果传输1024字节就需要1024 / 960 = 1066 ms。

使用环回接口的原因:

为了标识和管理网络设备(如路由器、pc),我们通常会利用到这些设备的接口(包括物理接口和逻辑接口)上设置的IP地址。但很多情况下,尽管该设备未脱离网络,由于其管理地址所处的接口状态处于down,该设备便无法管理(因为物理连接断开,接口协议起不来)。为了解决这一问题,于是便出现了loopback接口,该接口为设备上一个逻辑接口,接口状态不受物理端口up/down的影响,只要设备的系统协议不出问题,该接口就不会down 掉。由此可见loopback接口的地址无疑是标示物理设备本身的最佳选择,只要设备运行正常,它将永处于up状态。

    在实际的使用中,环回接口主要用作测试,系统把IP地址127.0.0.1分配给它。

《TCP/IP详解》学习笔记2——IP协议、ARP协议

可以认为IP协议、ARP协议以及RARP协议处于同一层,所以把这三个协议放在一起学习。

1、IP网际协议

IP协议是TCP/IP协议族最核心的部分,所有的TCP,UDP,IMCP,IGCP的数据都以IP数据格式传输。IP提供不可靠无连接的数据服务,不可靠指不能保证IP数据报成功到达目的地,无连接指IP数据报的处理是相互的可以不按发送顺序接收。

IP协议中需掌握的知识点有:IP首部的格式,IP如何进行路由选择和如何进行子网寻址。

IP首度为20个字节,传输时按大字节序,即高字节的数据存放在低地址,低字节存放在高地址,传输时先传低地址的数据。IP首部中各个字节的含义用时再翻书也来得及。

如何进行IP路由选择?

当IP数据报组装完成后,如何将它送到目的地,这就是我们现在要解决的问题。

如果目的主机与源主机为点对点链路连接或者在同一个以太网上,IP数据报就直接送到目的主机上;

如果主机通过若干路由和目的主机进行连接,那么路由器就要通过IP包信息对数据报进行转发,IP的路由选择是逐跳进行的,有下面三部工作要做。

(1)搜索路由表(IP层在内存中有一个路由表),寻找能与目的IP地址完全匹配的表目;

(2)搜索路由表,寻找能与目的网络号相匹配的表目;

(3)搜索路由表,寻找标为“默认”的路由表。

如果上面步骤都为成功,该数据就不能被传送,这一点再次证明IP是不可靠的。

如何进行子网寻址及子网的划分?

IP地址=网络号+主机号,进行子网编码后将主机号再分为子网号+主机号。子网划分缩小了路由表的规模,许多网络可以通过单个表目就可以访问了。例如一个B类IP地址,网络号16位,剩下16bit中8bit用于子网号8bit用于主机号,就允许有254个子网,每个子网可以有254个主机。通过子网掩码知道多少比特用于子网号多少比特用于主机号。例如一个B类IP地址的子网掩码为255.255.255.192,它的子网号有10bit,主机号有6bit。

2、ARP协议

为了让报文在链路层上传送,即当一台主机把以太网数据帧发送到另一台主机时,必须知道目的主机的物理地址,即根据6字节的以太网地址来确定目的接口。此时需要实现32比特IP地址到48比特物理地址的映射,采用的是ARP协议。

ARP高效运行的关键是由于每个主机上都有一个ARP高速缓存,这个缓存存放了最近一段时间IP地址到硬件地址之间的映射记录。

当主机要发送一个IP包的时候,首先查一下自己的ARP高速缓存,如果查询的IP到硬件地址的映射不存在,那么主机就向网络发送ARP协议广播包,这个广播包里面就有待查询的IP地址,收到广播包的所有主机都会查询自己的IP地址,如果收到广播包的某一个主机发现自己符合条件,发送ARP应答,这个ARP应答包含IP地址及对应的硬件地址,而广播主机收到ARP包后会更新自己的ARP缓存。收到ARP应答后,使ARP进行请求-应答交换的IP数据报现在就可以传送了。

还有个知识点需要掌握,即ARP代理。如果ARP请求是从一个网络的主机发往另一个网络的主机,那么连接这两个网络的路由器就可以回答该请求,这个过程称作ARP代理。

下图是本机的ARP高速缓存信息,从中可以得到解析出的IP->硬件地址的映射。这样的高速缓存是有生存时限的。

TCP/IP详解学习笔记——ICMP

ICMP(英特网控制报文协议)是IP层的一个组成部分,它传递差错报文以及其他需要注意的信息,它经常被IP层或TCP,UDP使用,ICMP报文封装在IP数据包内进行传输。

ICMP报文格式如下:

类型(8位)| 代码(8位) | 校验和(16位)| 报文内容(根据类型和代码的不同而改变)

ICMP报文的类型由类型字段和代码字段共同决定。

由于ICMP报文的类型有15种,本章先举两个查询报文和一个差错报文做简单介绍。

ICMP地址掩码请求和应答。ICMP地址请求掩码用于无盘系统在引导过程中获取自己的子网掩码,请求和应答报文的格式如下:

类型(8位)| 代码(8位) | 校验和(16位)| 

标识符(16位)|序列号(16位)|

子网掩码(32位)

请求报文类型为17,应答报文类型18;请求报文发往广播地址,应答地址为单播地址。

ICMP时间戳请求与应答,时间戳请求允许系统向另一个系统查询当前的时间,根据查询的时间结果可以对本地时钟进行调整,以使本地时钟与主机始终匹配。

ICMP时间戳请求与应答报文的格式如下:

类型(8位)|代码(8位)|校验和(8位)

 标识符(16位)|序列号(16位)

    发起时间戳(4字节)

    接收时间戳(4字节)

    传送时间戳(4字节)

后面两个时间一般设定为相同值,往返时间rtt=收到应答时间-发送请求的时间。

ICMP端口不可达差错,它是ICMP目的不可达报文中的一种,使用UDP查看ICMP差错报文中附加信息。如果收到一份UDP数据报而目的端口与某个正在使用的进程不相符,UDP即返回ICMP不可达报文。

TCP/IP详解学习笔记——PING

PING程序是为了测试另一个主机是否可达,即我们俗称的另一个主机可否PING通。它所利用的原理是这样的:网络上的机器都有唯一确定的IP地址,我们给目标IP地址发送一个数据包,对方就要返回一个同样大小的数据包,根据返回的数据包我们可以确定目标主机的存在,可以初步判断目标主机的操作系统等。

运行PING程序的主机我们称作客户,而被PING的主机称为服务器,即客户机PING服务器。

发送的数据包为ICMP回显请求和回显应答报文,它们的格式如下:

类型(8位,0或8)|代码(8位,0)|校验和(16位)

    标识符(16位)|序号(16位)

         选项数据

一般来说可以进行三种PING测试:PING本地主机,PING网关IP,PING远程IP。

PING本地主机:

C:\\Documents and Settings\\Administrator>ping 192.168.1.102

Pinging 192.168.1.102 with 32 bytes of data:

Reply from 192.168.1.102: bytes=32 time<1ms TTL=128

Reply from 192.168.1.102: bytes=32 time<1ms TTL=128

Reply from 192.168.1.102: bytes=32 time<1ms TTL=128

Reply from 192.168.1.102: bytes=32 time<1ms TTL=128

Ping statistics for 192.168.1.102:

    Packets: Sent = 4, Received = 4, Lost = 0 (0% loss),

Approximate round trip times in milli-seconds:

Minimum = 0ms, Maximum = 0ms, Average = 0ms

如果显示内容为Request timed out则表明网卡安装或配置有问题。将网线断开再次执行此命令,如果显示正常,则说明本机使用的IP地址可能与另一台正在使用的机器IP地址重复了。如果仍然不正常,则表明本机网卡安装或配置有问题,需继续检查相关网络配置。

PING网关:

C:\\Documents and Settings\\Administrator>ping 192.168.1.1

Pinging 192.168.1.1 with 32 bytes of data:

Reply from 192.168.1.1: bytes=32 time=1ms TTL=

Reply from 192.168.1.1: bytes=32 time=3ms TTL=

Reply from 192.168.1.1: bytes=32 time<1ms TTL=

Reply from 192.168.1.1: bytes=32 time<1ms TTL=

Ping statistics for 192.168.1.1:

    Packets: Sent = 4, Received = 4, Lost = 0 (0% loss),

Approximate round trip times in milli-seconds:

Minimum = 0ms, Maximum = 3ms, Average = 1ms

此时表明本地局域网路由器运行正常。

PING远程IP:过程与上面两种相类似,如果能PING通说明该客户能够接入到互联网中。

观察PING的结果:

bytes=32是指ICMP报文的大小为32个字节;

time为往返时间,即Rtt=收到应答报文的时间-发送请求的时间;

TTL为生存时间,位于IP首部,该字段设置了数据报可以经过的最多路由器数。它由发送主机设置(通常为32或),一旦经过处理它的路由器之后它的值就减1。TTL字段值可以帮助我们识别所PING主机的操作系统类型,默认情况下,Linux系统的TTL值为或255,Windows NT/2000/XP系统的TTL值为128,Windows 98系统的TTL值为32,UNIX主机的TTL值为255。可是我们PING www.sina.com得到以下结果,

C:\\Documents and Settings\\Administrator>ping www.sina.com

Pinging libra.sina.com.cn [202.108.33.91] with 32 bytes of data:

Reply from 202.108.33.91: bytes=32 time=22ms TTL=56

Reply from 202.108.33.91: bytes=32 time=24ms TTL=56

Reply from 202.108.33.91: bytes=32 time=23ms TTL=56

Reply from 202.108.33.91: bytes=32 time=38ms TTL=56

TTL=56该怎么理解呢?这里的TTL值可能是,经过了-56=8个路由器,所以新浪的主机可能是Linux系统。

PING程序还为我们提供了查看IP记录路由选项的机会,PING请求数据报每经过一个路由器,路由器都会把自己的IP放到该数据报中。而目的主机则会把这个IP列表复制到回应ICMP数据包中发回给主机。但是,无论如何,IP头所能纪录的路由列表是非常的有限,PING程序提供39字节的选项字段,最多可以记录9个IP地址。如果要观察路由, 我们还是需要使用更好的工具,就是下面要说的Traceroute(windows下面的名字叫做tracert)。

TCP/IP详解学习笔记——TRACEROUT OR TRACERT

为了介绍的方便,这里使用tracert。该程序可已让我们看到IP数据报从一台主机到另一台主机所经过的路由。该程序使用TTL字段,TTL字段的初始值由操作系统所指定,每经过一个路由都把TTL值减一,当TTL值减为0时,路由器应将“ICMP已超时”的消息发回给源系统。

Tracert工作原理:先发送TTL为1的UDP数据报给目的主机,并在随后的每次发送过程中将TTL值加一,直到目标响应或TTL达到最大值,从而确定路由。

那么我们如何判定UDP数据报是否已到达目的主机的呢?

Tracert发送UDP数据报给目的主机,它选择一个不可能的值作为UDP端口号(大于30 000)而普通的网络程序只监控少数几个号码较小的端口,它们肯定不可能使用该端口。所以UDP数据报到达目的主机的时候,目的主机只能发送一个端口不可达的ICMP数据报给主机。主机接到这个报告以后就知道,主机到了。

Tracert程序还可以让我们使用IP源路由选项。源站选路的思想是由发送端指定路由,源站选路在实际的应用中不多,在此不再赘述。

TCP/IP详解学习笔记——静态IP选路

选路是IP最重要的功能之一。IP搜索路由表有如下三步:

    搜索匹配的主机地址;

    搜索匹配的网络地址;

    搜索默认表项。

IP层的选路实际上是选路机制,它搜索路由表并决定向哪个网络接口发送分组;这与选路策略不同,它是一组决定把哪些路由放入路由表的规则。

由于在windows系统下使用netstat –rn命令不打印出路由标志信息,这里的讨论还是采用书上的内容。

对于一个给定的路由器,可以打印出五种不同的flag。

1、U表明该路由可用。 

2、G表明该路由是一个网关。如果没有这个标志,说明和目的主机是直连的,而相应的Gateway应该直接给出目的主机的地址。 

3、H表明该路由是一个主机,如果没有该标志,说明目的主机是一个网络,换句话说目的主机就应该写成一个网络号和子网号的组合,而不包括主机号(主机号码处为0),例如 192.168.11.0 

4、D表明该路由是为重定向报文创建的 

5、M该路由已经被重定向报文修改 

G说明这是一个网关,由它区分了间接路由和直接路由。如果你要发数据给目的主机,IP头应该写目的主机的IP地址,而数据链路层的MAC地址就应该是GateWay的MAC地址了;反之,如果没有G标志,那么数据链路层和IP层的地址应该是对应的。H说明了目的主机的性质,如果是H的,则说明该地址是一个完整的地址,既有网络号又有主机号,那么再匹配的时候就既要匹配网络号,又要匹配主机号;反之,目的主机就代表一个网络,在匹配的时候只要匹配一下网络号就可以了。

一般我们配置好一个网络接口时,就为接口自动创建一个直接路由,当然我们也可以使用route命令手动添加路由。

如果在一次IP选路过程中,没有找到匹配项且路由表中没有默认选项,那么就会给源主机发送“主机不可达”或者“网络不可达”的ICMP包来报错。

ICMP重定向报文:

当路由器的接口收到报文,查路由表后又要从该接口转发出去的时候,如果路由器该接口启用了ICMP重定向功能,则向给路由器发送报文的主机(或其他设备)发送一个ICMP重定向报文,通知该主机在主机路由表上加上一条主机路由。

ICMP重定向功能可以使一些没有运行动态路由协议的主机建立更完善的路由表。PC只能有一个默认网关(尽管windows可以配两个默认网关,路由表中也会出现两条默认路由,但只有一条起作用),当路由发生差错的时候,作为默认网关的路由器就会发送ICMP重定向报文通知PC进行重定向。

关于重定向报文有很多规则。重定向报文只能又路由器生成,重定向报文是为主机使用的。

ICMP重定向并不是一个很重要的功能,就算不能实现,也没有什么致命的缺陷,最多数据的流向不合理。

ICMP路由器发现报文:

在主机引导的时候,要广播或多播传送一份路由器请求报文,一台或更多台路由器响应一份通告报文。路由器一般会在450-600秒的时间间隔内发布一次通告,而一个给定的通告报文的寿命是30分钟。而主机在引导的时候会每三秒发送一次请求报文,一旦接受到一个有效的通告报文,就停止发送请求报文。

TCP/IP详解学习笔记——动态选路协议

前面介绍的选路方法叫做静态IP选路,简要地说就是在配置接口的时候,以默认的方式生成路由表项。并通过route命令来增加表项,或者通过ICMP重定向报文来更新表项(通常在默认方式出错的情况下)。 而如果上诉三种方法都不能满足,那么我们就使用动态选路。

路由器的守护程序运行选路协议,并与其相邻的一些路由器进行通信,守护程序根据它从相路由器收到的信息跟新路由表。与静态选路相比,选路机制并没有改变,仅仅是放置到路由表中的信息改变了,当路由随时间变化时,路由是由守护程序动态的增删,并不适用route命令。

RIP协议——最为广泛使用的选路协议。

RIP报文封装在UDP数据报中,具体报文格式如下所示:

命令(8位,1-6)|版本(8位,1)|必须为0(16位)

地址系列(16位,2)| 必须为0(16位)

32位IP地址

必须为0(32位)

必须为0(32位)

度量(1-16)(32位)

最多可以有24个另外的路由,与前20个字节具有相同的格式

RIP协议的routed程序的正常运行的情况:

1、启动路由守护程序,先判断启动哪些接口,并向每个接口发送请求报文,要求其他路由器发送完整的路由表;

2、接收到请求。如果接收到刚才的那个请求,就把自己的完整的路由表交给请求者。如果没有,就处理IP请求表项,把表项中自己有的部分添上跳数,没有的部分添上16。然后发给请求者。

3、接收到响应,更新路由表。

4、定期更新选路。每隔30秒,以广播形式将完整路由表发送给相邻路由器。

RIP报文中,度量是比较重要的参数,RIP的度量是基于跳数(hops count)的,每经过一台路由器,路径的跳数加一。如此一来,跳数越多,路径就越长,RIP算法会优先选择跳数少的路径。RIP支持的最大跳数是15,跳数为16的网络被认为不可达。

RIP协议看起来很简单,但它存在很多缺陷。RIP没有子网地址的概念,有环路危险,hop数的大小也了网络的大小。因此出现了许多其它协议来解决这些问题,后面章节的学习过程中还会有详细介绍。

TCP/IP详解学习笔记——UDP

UDP即用户数据报协议,进程的每个输出操作都正好产生一个UDP数据报,并且组装成一份待发的IP数据报。UDP是面向无连接的,它提供不可靠的传输层服务。

UDP的首部有8字节,如下所示:

16位源端口号|16位目的端口号|16位UDP长度|16位UDP检验和

端口号表示发送进程和接收进程,由于很多软件需要用到UDP协议,所以UDP协议必须通过某个标志用以区分不同的程序所需要的数据包。

UDP长度字段指的是UDP首部和UDP数据的字节长度,这与IP数据报的长度不同,IP数据报长度指的是IP数据报全长,因此UDP数据报长度是IP数据报长度减去IP首部的长度。

UDP检验和是可选的,它覆盖UDP首部和UDP数据,IP首部的检验和指包括IP首部。此外UDP数据报包含12字节长的伪首部,这是为计算检验和而设置的。UDP检验和是端到端,由发送端计算,接收端验证。目的是发现UDP首部和数据在发送端和接收端的任何改动。

IP分片的介绍。

IP层收到一份IP数据报时,它要判断从哪个接口发送数据,并查询该接口获得其MTU,IP把MTU与数据报长度进行比较,如果需要则进行分片。分片和重装由主机和目的端的IP层实现,这个过程对于TCP和UDP来说是透明的。

在IP头里面,标识字段唯一记录了一个IP包,具有同一个标识字段的IP片将会被重新组装;而片偏移字段记录该片偏移原始数据报开始处的位置;而这两个字段中间的3bit标志则指该分片后面是否还有新的分片。这三部分就组成了IP分片的所有信息,接受方就可以利用这些信息对IP数据进行重新组织(就算是后面的分片比前面的分片先到,这些信息也是足够了)。

UDP和ARP之间的接口,大多数ARP实现在等待ARP应答时只保留最近传送给目的端的数据报。

ICMP源站抑制差错,当一个系统接收数据报的速度比其处理的速度快时,可能产生这种差错。

UDP服务器的设计。

通常客户端的设计和实现比服务器端的要容易一些,服务器与操作系统进行交互作用,而且大多数需要处理多个客户。UDP协议的某些特性将会影响我们的服务器程序设计

1.客户IP地址及端口号。服务器要有能力根据IP地址和端口号告诉应用程序是谁发的数据报,即服务器可以对多个客户进行处理。

2.目的IP地址。服务器要有过滤广播地址的能力。

3.数据输入。UDP数据报是先进先出的,应用程序不知道输入队列何时溢出,服务器对超出数据报进行丢弃处理,并且未告诉用户其数据报被丢弃。

4.本地IP地址,服务器应该本地IP,它可以将自己绑定在某个接口的某个端口上。

5.远端IP地址,远端只能接收特定IP地址和端口的UDP数据报。

TCP/IP详解学习笔记——广播、组播和IGMP

广播和组播都采用UDP。广播即一个主机向网上的其它主机发送帧,但是广播增加了对广播数据不感兴趣的主机的处理负荷。这时就产生了组播,主机可以加入一个或多个组播组,这样,网卡获悉主机属于哪个组播组,然后仅接收主机所在主播组的主播帧。

下面介绍四种广播地址:

受限的广播地址:255.255.255.255。该地址用于主机配置过程中IP数据报的目的地址,路由器不转发目的地址位受限广播地址的数据报,这样的数据报只存在本地网络中;

指向网络的广播:主机号全为1的地址,一般来说,这样的地址路由都会进行转发;

指向子网的广播:主机号全1且有特定的子网号的地址;

指向所有子网的广播:子网号及主机号全1。

组播提供两种服务:(1)向多个目的地址传送数据;(2)客户对服务器的请求。D类IP地址只用作组播地址,即224.0.0.0——239.255.255.255。组播IP对应的以太网地址范围从01:00:5e:00:00:00到01:00:5e:7f:ff:ff。组播以太网地址的前24位已经规定成01:00:5e:00,第25位为0。剩余23位只需将组播地址的低23位复制过去即可。

当把组播扩展到单个物理网络以外需要路由器转发组播数据时,复杂性就增加了,需要一个协议让组播路由器确定网络中属于确定组播组的任何一个主机,这个协议即为IGMP。

IGMP——Internet组管理协议,它让一个物理网络上的所有系统知道主机当前所在的组播组。组播路由器根据这些信息确定组播数据报应该向哪些接口转发。组播的基础就是一个进程的概念,该进程在一个主机的给定接口上加入了一个组播组。

IGMP主要基于查询和响应机制来完成对组播成员的管理,具体过程如下。

1.主机会主动向其要加入的组播组发送IGMP成员关系报告报文以声明加入,而不等待组播路由器发来的查询报文;

2.组播路由器定时向本地网段内的所有主机和路由器发送IGMP查询报文,目的IP为224.0.0.1;

3.主机收到查询报文后,发送IGMP报告报文宣告自己属于该组播组;

4.进程离开一个组时,主机不发送IGMP报告,当网段中不再存在该组播组的成员后,组播路由器将收不到任何发往该组播组的报告报文,于是组播路由器在一段时间之后便删除该组播组所对应的组播转发项。

TCP/IP详解学习笔记——DNS

我们知道访问一台主机需要IP地址和MAC地址,MAC地址可以通过ARP协议获得,IP地址就没有这种机制,需要用户指定,于是就出现的DNS(域名系统)。

域名系统由域名服务器和解析器组成。域名服务器是指保存该网络所有主机的域名和对应IP地址;解析器是进行域名和IP地址之间的转换。地址解析器通过UDP与名字服务器进行通信。

DNS系统是一个分布式数据库当一个数据库发现自己并没有查询到所需要的数据,它将查询转发出去,转发的目的通常是根服务器,根服务器从上至下层层转发查询,直到查找到目标为止。

DNS服务器支持UDP和TCP的访问,大多数的查询都是UDP的,在下面两种情况下需要TCP查询:(1)响应的长度超过了512字节(UDP数据报的最大长度),此时需使用TCP的数据分段进行数据传输;(2)区域传送使用TCP,区域传送指域的主服务器和辅服务器之间进行查询和响应操作。

TCP/IP详解学习笔记——TFTP,BOOTP

TFTP即简单文件传送协议,为了保持简单和短小,它使用UDP。TFTP的报文有5种,它们都是封装在UDP数据报中,读/写请求报文、数据分组报文、ACK报文和差错报文,报文格式如下。

请求读/写报文 :

IP首部(20)|UDP首部(8)|1=RRQ/2=WRQ(2)| 文件名 | 0(1)|模式|0(1)

数据报文:

    IP首部(20)|UDP首部(8)|3=data(2)| 块编号(2)| 数据(0-512)

响应报文

IP首部(20)|UDP首部(8)|4=ACK(2)| 块编号(2)

差错报文

IP首部(20)|UDP首部(8)|5=error(2)| 差错码(2)| 差错信息| 0(1)

下面说说TFTP的客户端和服务器端是如何工作的(以写请求为例):

1.初始连接时客户向服务器发送写请求,指明文件名和模式,目的UDP端口号为TFTP熟知端口号(69),源端口号是随即生成的一个大于1024的数;

2.如果该文件能被该客户写,服务器就向客户发送确认包,它包括2字节的操作码和2字节的数据编号,此时的块编号为0;

3.此时第一个数据包以块编号1发出,服务器返回块编号为1的响应;

4.重复上面的过程,直到数据发送完成。

BOOTP即引导程序协议,BOOTP也使用UDP,通常与TFTP协同工作。BOOTP可以让一个无盘系统从服务器上获得IP地址,该协议主要用于有无盘工作站的局域网中。客户端获取IP地址的过程如下:首先,由BOOTP 启动代码启动客户端,这个时候客户端还没有IP 地址,使用广播形式以IP 地址0.0.0.0 向网络中发出IP 地址查询要求。接着,运行BOOTP 协议的服务器接收到这个请求,会根据请求中提供的MAC 地址找到客户端,并发送一个含有IP 地址、服务器IP 地址、网关等信息的FOUND 帧。最后,客户端会根据该FOUND 帧来通过专用TFTP 服务器下载启动镜像文件,模拟成磁盘启动。

BOOTP请求和应答均被封装在UDP数据报中,具体格式如下:

IP首部(20)| UDP(8)| BOOTP请求/应答(300)

300字节的BOOTP报文如何定义的,在这里不再详述,使用时再去查资料。

BOOTP的熟知UDP端口号有两个,BOOTP服务器为67,BOOTP客户为68。客户的端口号之所以没有用随机的,是因为服务器的应答可以进行广播,而随机端口对于广播来说不是一个很好的选择。

TCP/IP详解学习笔记——TCP概述

TCP向应用层提供面向连接的可靠的字节流服务。面向连接是指两个使用TCP的应用在彼此交换数据之前必须建立TCP连接,广播和组播不能用于TCP。保证TCP可靠传输的方式会在后面的章节中进行介绍。字节流服务是指TCP不在传输的字节流中加入标记信息,即一端将字节流放在TCP连接上,同样的字节流将会出现在TCP连接的另一端。

TCP数据报封装在一个IP数据报中,具体封装结构如下:

IP首部(20)| TCP首部(20)| TCP数据

下面详细介绍TCP首部的数据格式,它通常的长度为20个字节。

16位源端口号 |  16位目的端口号

32位序号

32位确认号

4位首度|URC|ACK|PSH|RST|SYN|FIN|16位窗口大小

16位检验和 | 16位紧急指针

TCP首部中每个字段含义我会在后面做详细介绍。

TCP/IP详解学习笔记——TCP连接的建立与关闭

(1)连接的建立

建立TCP连接时,我们需要首部中的序号、确认号和标志比特。序号用来标识发送的数据字节流,它是一个32bit的无符号数,每4ms加1,序号到达231-1后又从零开始,这样选择序号的目的在于防止网络中被延迟的分组在以后被重复传输,而导致某个连接的一端对它做出错误的判断;确认号包含发送确认一端期望收到的下一序号,因此,它是上次成功收到的数据字节号加1。

TCP通过三次握手来建立连接,在三次握手中,发送第一个SYN的一端执行的是主动打开。而接收这个SYN并发回下一个SYN的另一端执行的是被动打开。

这里以客户端向服务器发起连接来说明。

1.客户端发送一个SYN段(同步数据包)请求建立连接,初始序列号(ISN)是客户端随即产生的一个值,确认号为0;

2.服务器收到数据包后,会对客户端进行一个同步确认。确认号是客户端的初始序列号+1,序列号是服务器随即产生的一个值;

3.客户端收到数据包后,再对服务器进行一次确认。确认号为服务器的ISN+1,序列号为上一个数据包的确认号值。

下面通过抓包工具来看一个实际连接的建立情况。在过滤器中设置只捕获IP地址为211.68.69.254的数据,然后开始捕获,同时访问211.68.69.254,待页面下载完成后停止捕获。此次环境中,客户端为59..137.195,服务器为211.68.69.254。

第一步:

图1 建立连接第一步

客户端向服务器发送一个同步请求数据包,请求连接服务器的80端口,客户端的序列号为0。

第二步:

图2 建立连接第二步

图2中,服务器收到客户的同步请求数据后,向客户端发送确认数据包。这个数据包中,服务器的初始序列号为0,确认号为客户端的初始序列号加1(0+1=1)。

第三步:

图3 建立连接第三步

图3中,客户端收到数据包后,对服务器进行再一次确认。这个数据包中,序列号为上一数据包中的确认号1,确认号为服务器的初始序号0再加1等于1,这样TCP连接就建立了。

(2)关闭连接

建立连接需要3步,但关闭一个连接需要4步。因为TCP得连接是全双工的,需要做两个方向的关闭。在TCP关闭连接时,首先关闭的一方将执行主动关闭,另一方再执行被动关闭。

关闭连接的4步如下:

1.服务器完成数据发送后,会主动向客户端发送一个终止数据包,关闭这个方向上的TCP链接;

2.客户端收到服务器发送的终止数据包后,向服务器发送确认信息,以关闭该方向的TCP链接;

3.客户端发起的被动关闭与上面两步相似,就不再赘述。

实际的数据包分析:

第一步:

图4 关闭TCP连接第一步

图4中,服务器向客户端发送确认位(ACK)和终止位(FIN)同时置1的数据包,ACK=1表示对最后一次传输数据进行确认,FIN=1表示关闭该方向的TCP连接。这个数据包中,序号为客户端发送的上一数据包中所带的确认号值3497,确认号为上一数据包的序列号+该数据包所带数据的大小=4068。

第二步:

图5 关闭连接第二步

客户端收到该终止数据包,会对服务器发送确认,该数据包中,序列号为第一步的确认号4068.,确认号为第一步的序号3497加1等于3498。

随后就是来自客户端被动发起的关闭,它与服务器主动发起的关闭原理相同。

TCP/IP详解学习笔记——TCP的交互数据流、成块数据流

TCP报文包含成块数据和交互数据。成块数据的报文段基本上都是满长度(通常是512字节的),交互数据则要小很多(用户数据小于10字节)。显然TCP对这两种数据做不同的处理。

观察rlogin连接上键入一个交互命令产生的数据流,它产生4个报文段:(1)来自客户的交互按键;(2)来自服务器的确认;(3)来自服务器的回显;(4)来自客户的按键回显确认。

经受时延的确认:通常TCP在接收到数据后并不立即发送ACK,相反它推迟发送,以便将ACK和该方向的数据一同发送。

在局域网上发送上述的小分组数据,由于局域网一般不会出现拥塞,通常不会引起麻烦;但在广域网上,这种小分组的TCP流量可能造成很大的网络负担。

这种情况下,可以采用Nagle算法。

该算法要求一个TCP连接上最多只能有一个未被确认的未完成小分组,在该分组的确认到达前不能发送其他的小分组。相反,TCP为这个小分组不断收集后来的小分组,并在确认到来时将它们以一个分组的方式发送出去。

介绍成块数据流前,需要看看ACK的应答策略,一般来说,发送端发送一个TCP数据报,那么接收端就应该发送一个ACK数据报。但是事实上却不是这样,发送端将会连续发送数据尽量填满接受方的缓冲区,而接受方对这些数据只要发送一个ACK报文来回应就可以了,这就是ACK的累积特性,这个特性大大减少了发送端和接收端的负担。

TCP的成块数据流应用在FTP、电子邮件等服务中,它使用滑动窗口协议进行流量控制。该协议允许发送方在停止并等待确认之前可以连续发送多个分组。由于发送方不必每发一个分组就进行一次确认,因此该协议可以加速数据的传输。

滑动窗口即接收方的TCP数据报缓冲区的大小,发送方根据这个窗口大小计算自己最多发送多长的数据,通常可以游接收端应用程序控制。如果接收方发送ACK通告其窗口大小为0,发送方将停止发送数据,等待接收方发送窗口的更新。

使用三个术语描述窗口的左右移动:

窗口合拢:左边沿向右边沿靠近,发生在数据被发送和确认时;

窗口张开:右边沿向右移动,发生在接收端应用程序处理数据后;

窗口收缩:右边沿向左移动,这种现象不常发生。

慢启动算法:新分组进入网络的速率与另一端返回确认的速率相同。慢启动为发送方的TCP增加一个拥塞窗口,它是发送方使用的流量控制。发送方发送一个报文段,然后等待ACK。当收到该ACK时,拥塞窗口从1增加到2,即可以发送两个报文段。当收到两个报文的ACK时,拥塞窗口增加为4。发送更多的数据,直至出现超时错误,这时发送方和接收方之间的管道被填满。此时就到达双方线路的承载能力,即确定拥塞窗口的大小,发送方就用这个拥塞窗口的大小发送数据。

带宽时延乘积(线路通道的容量)=带宽*RTT

拥塞:当数据从快速局域网向较慢的广域网传输时便会发生拥塞;当路由器的输出流小于输入流也会发生拥塞。TCP发送方通过上面说的慢启动确定线路的最大吞吐量可以对拥塞进行控制。

TCP/IP详解学习笔记——TCP的超时与重传

TCP/IP提供可靠的运输层,它使用的方法之一就是确认从另一端收到的数据,但数据和确认都有可能丢失,此时TCP就在发送数据时设置一个定时器。如果定时器溢出,发送端还没收到确认,它就重传该数据。本章就是要讨论超时和重传的策略。

超时与重传策略中用到的基本概念

(1)拥塞窗口(cwnd ):拥塞控制的关键参数,控制源端在拥塞情况下一次最多能发送多少数据包。

(2)通告窗口(awnd):接收端对源端发送窗口大小所做的,在建立连接时山接收方通过ACK确认带给源端

(3)慢启动门限值(ssthresh ):拥塞控制中用来发送窗口大小的门限值,它是慢启动阶段与拥塞避免阶段的分界点,初始值设为65535 bytes或awnd的大小。

(4)往返时间(RTT):一个数据包从源端发送到接收端直至源端收到接收端对该数据包确认信息所经历的时间间隔。

(5)重传超时时间(RTO ):描述数据包从发送到失效的时间间隔,是源端用来判断数据报是否丢失和网络拥塞的重要参数。

RTT和RTO的计算:

将各个报文段的往返时延样本加权平均,就得出报文段的平均往返时延RTT。每测量到一个新的往返时延样本,就按下式重新计算一次RTT:

    RTT=a×(旧的RTT)+(1-a)×(新的往返时延样本) ,0<=a<1,典型的a值为0.9。

显然,计时器设置的超时重传时间RTO应略大于RTT,即:

RTO=b×RTT,这里b是一个大于1的值,但是它的值是很难确定的。存在这样一个问题:假设发送一个TCP报文1,设定的重传时间到了,还没有收到确认,于是重传此报文,即报文2,经过一段时间后,收到确认的报文ACK。这时就无法判断确认报文段是对报文1还是对报文2的确认,这就是重传多义性问题。Karn算法规定,当一个超时和重传发生时,在重传数据的确认最后到达之前就不采用其往返时延样本。此时采用这样一种机制,报文段每重传一次,就将重传时间增大一些:

新的RTO=A×(旧的RTO),系数的典型值为2。当不再发生报文段的重传时,才根据报文段的往返时延更新平均往返时延RTT和重传时间的数值。

TCP重传策略即如何进行拥塞控制,一般认为有以下四个过程。

(1)启动阶段。当连接刚刚建立时,进入慢启动阶段。此时初始化拥塞窗口(cwnd)为一个报文段,慢启动门限值ssthresh为65535个字节。实际发送窗口取拥塞窗口与接收方通告窗口的较小值,每收到一个ACK确认,就对拥塞窗口进行加倍处理,这样慢启动阶段cwnd随RTT呈指数级增长(1、2、4、8…)。慢启动采用逐渐增大cwnd 的方法,可以防止TCP 在启动一个连接时向网络发送过多的数据包而造成不必要的数据丢失和网络拥塞。为了防止cwnd 的无增长引起网络拥塞,我们引入慢启动门限值ssthresh。

当cwnd当cwnd>ssthresh时,使用将会在下面介绍的拥塞避免算法。

(2)拥塞避免阶段。当TCP 连接的发送端发现超时或收到3 个相同的ACK 确认帧时,即认为网络发生拥塞,此时进入拥塞避免阶段。在拥塞避免阶段,慢启动域值ssthresh 将被设置为当前cwnd 的一半(cwnd和接收方通告窗口大小的最小值,但最少为2个报文段)。当发生超时时,cwnd 被置为初始值1个报文段。此时,如果cwnd=ssthresh,则进行拥塞避免操作,即cwnd 每次收到一个ACK 确认时只增加1/cwnd 个数据包。拥塞避免阶段cwnd 随RTT 呈线性增长而非指数性增长。

在拥塞避免阶段,当数据包超时时,cwnd 被置为1个报文段,此时连接重新进入慢启动阶段,这会导致发送窗口尺寸过大的减小,降低TCP 连接的吞吐量。因而引入快速重传和快速恢复机制。 

(3)快速重传阶段。当源端收到3 个或3 个以上重复的ACK 时,就判定数据包丢失,同时ssthresh 设置为当前cwnd的一半,并重传丢失的包,设置cwnd为ssthresh加上3倍的报文段大小。

(4)快速恢复阶段。当快速重传了可能丢失的分组之后,如果TCP重新进入慢启动阶段,将会使拥塞窗口减为1,TCP重新探测网络带宽,从而严重影响网络吞吐量,因此快速恢复算法在快速重传之后转去执行拥塞避免算法,避免了过大地减小发送窗口而导致的网络性能下降。每收到重复的ACK,则cwnd 加1;收到非重复ACK 时,置cwnd=ssthresh,转入拥塞避免阶段。

 TCP对ICMP差错的处理

(1)TCP遇到的最常见的ICMP差错就是源站抑制、主机不可达和网络不可达。

遇到源站抑制将会导致cwnd置为1个报文段并发起慢启动,慢启动门限没有变,所有窗口将打开直至它开放所有的通路或者发生了拥塞;

(2)TCP会忽略主机不可达或者网络不可达并坚持重传。

TCP的重新分组

TCP超时并重传时,它允许重新分组从而发送一个较大的报文段,这将有助于提高性能。

TCP/IP详解学习笔记——TCP的坚持定时器和保活定时器

(1)坚持定时器。

专门为对付零窗口通知而设置的。当发送端收到零窗口的确认时,启动坚持定时器,当该坚持计时器时间到时客户还没有接收到一个窗口更新,发送端就发送探测报文段探查这个空的窗口以决定窗口更新是否丢失。

窗口探查只包含一个字节的数据,探测报文段有序号,但序号永远不需要确认,因此这个字节被持续重传,坚持定时器使用TCP指数退避算法,总是在5-60秒之间。探查每隔60秒发送一次,这个过程持续到窗口被打开或者应用程序使用的连接被终止。

(2)保活计时器。

当一个服务器希望知道客户主机是否崩溃并关机或者崩溃又重新启动,这时就要用到保活定时器。每当服务器收到客户的信息,就将保活计时器复位。如果一个给定的连接在2小时之内没有任何动作,服务器就向客户发送探查报文段,若发送了10个报文段,每个间隔75秒,如果服务器还没收到响应,就认为客户主机已经关闭并终止连接。

TCP/IP详解学习笔记——TCP的未来和性能

TCP中路径MTU的发现:代转发的IP数据包将不能分片DF字段置为1,并等待ICMP差错的产生,来估算MTU的大小。

如果收到ICMP差错,TCP就减小段大小并重传,有以下几个过程:

(1)如果路由器产生较新的该类ICMP差错,则报文段大小设置为下一跳的MTU减去IP和TCP的首度;

(2)如果是一个较旧的该类ICMP差错,必须尝试下一个可能的最小MTU(不同的网络设备有不同的MTU,65535,17941,44,4352,1500,1492,576,296);

(3)由于路由动态可变,在最后一次减小路径MTU一段时间后,可以尝试使用一个较大的值,这个时间间隔为10分钟。

带宽时延积=bandwidth(bps)×RTT(s),用这个量表示一个TCP连接两端的管道大小。具有大的带宽时延积得网络称作长肥网络(LFN),运行在LFN上的连接称作长肥管道。如果遇到长肥网络,那么网络的利用率就会大幅度的降低,这时就需引入窗口扩大选项和时间戳。

窗口扩大选项使TCP窗口的定义从16位增加到32位。时间戳选项使发送方在每个报文段中放置一个时间戳值,接收方在确认中返回这个数值从而允许发送方为每个收到的ACK计算RTT,从而使得RTT的计算变得更加准确。

文档

TCP_IP学习笔记

《TCP/IP详解》学习笔记1——链路层重点知识:链路层的作用、以太网的封装、SLIP和PPP协议以及链路的重要特性(MTU和串行线路吞吐量的计算)。1、链路层的作用为IP模块发送和接收IP数据报;为ARP模块发送ARP请求和接收ARP应答;为RARP模块发送RARP请求和接收RARP应答;2、以太网的封装SA(6)|DA(6)|TYPE(2)|DATA(46-1500)|CRC(4)两字节的TYPE字段定义了后续数据的类型,用来说明生成数据的网络层协议。0x0800表示数据类型为IP数据报,
推荐度:
  • 热门焦点

最新推荐

猜你喜欢

热门推荐

专题
Top