TCP IP网络层谜云

Posted on

TCP IP网络层谜云 - - ITeye技术网站

首页 新闻 论坛 问答 博客 招聘 更多 ▼

专栏 群组 搜索

您还未登录 ! 我的应用 登录 注册

java-mzd

永久域名 http://java-mzd.iteye.com

4顶 3踩

TCP/IP网络层谜云之ICMP | TCP/IP传输层,你懂多少?

2011-04-27

TCP/IP网络层谜云

文章分类:Java编程

PS.又调了好几遍,还是无法将整篇文章作为一个博客发表。所以,还是将文件分成两部分吧。

第一部分主要介绍网络层的基本知识

第二部分介绍ICMP有关知识。 你所不知道的网络层


**上文《TCP/IP传输层,你懂多少》 http://java-mzd.iteye.com/blog/1007577中,我们介绍了“传输层是如何为数据提供端对端的服务的”.

可是,数据包又是怎样从你的电脑出发,历经网络世界的艰辛,到达对方电脑的呢?在网络的世界当中,你的数据包又会遇到些什么问题?它们又是怎么解决的你?要回答这个问题,我们就必须研究TCP/IP协议栈中的Internet层(和数据链路层了)。**

同以往一样,给出我自己认为会遇到的15个问题,并且列出来,如果大家能熟练的回答,请您绕道。

  1. 网络层的作用?
  2. 网络层有哪些协议?
  3. IP数据包的格式?
  4. IP数据包传输的过程?
  5. 为什么需要ARP协议?
  6. ARP协议通信过程是怎么样的?(ARP协议如何控制网络?)
  7. 数据包的最大值?(分片的地方?分片重组的地方?分片的原则?)
  8. 数据包在局域网内怎么从一台主机传送到另外一台主机?
  9. 数据怎么实现跨网段传输?(路由如何实现跨网段传输?)
  10. 什么是默认网关?
  11. 代理ARP的作用?
  12. 数据跨网段传输时在路由器中的具体情形?(所谓的穿过路由是指什么?)
  13. 数据包路由的过程?
  14. 为什么需要ICMP协议?(ICMP协议差错控制与TCP差错控制对比)
  15. 什么是ICMP协议?
  16. ICMP协议有哪些数据包?(Ping程序的实现?trancerouter程序的实现?)

一。网络层的作用:

TCP/IP协议栈的Internet层主要负责处理主机到主机的通信**,决定数据包如何交付**:是交给网关(路由器)还是交给本地端口。

二。网络层的协议及作用:

网际协议IP:用来路由

网际控制报文协议 ICMP:给IP层提供一定的可靠性

地址解析协议ARP:

反向地址解析协议RARP

三。IP数据包格式:

版本(4)

头长度(4)

服务类型(8)

总长度(16) 标识(16)

标志(3)

段位移(13) 生存期(8)

协议(8)

头校验和(16) 源IP地址(32) 目的IP地址(32) IP选项(0或者32) 数据

四。数据包传输的过程

首先,传输层将封装好的数据交给Internet层,Internet层收到数据后,将数据封装成一个**IP**数据包。

注意协议之间的底层无关性:Internet层封装上层数据包时,不关心不管上层传给他的是UDP数据包还是TCP数据包,都将上层传来的数据封装为IP数据包。同样,传输层在封装用户信息流时也是同样的不关心上层数据的内容。


五。为什么需要ARP协议?

IP数据包要想继续向下发送,就必须转化为在物理设备上传输的数据帧。

在物理设备上传输数据时,数据包首先是被网卡接收,如果网卡接收到的数据包的硬件地址与本机不符,则直接丢弃,如果相符,再交由上层协议处理的。而在我们的网络通信中,源主机的应用程序知道目的程序的IP地址和端口号,却不知道目的主机的硬件地址,因此在通讯前必须获得目的主机的硬件地址。ARP**协议就起到这个作用。**


六。ARP**协议通信过程?**

每台机器上都维护着一个ARP缓存表,保存着IP地址到MAC**地址的映射**

注意:缓存表中的记录有过期时间T,如果T时间内没有再次使用某条记录,则该记录失效,下次使用时,还要再次发ARP请求来获得目的主机的硬件地址。

作用:因为我们的机器需要和大量机器通信,如果没有过期机制的话,显然将会产生巨大的记录量,降低效率。

主机A要和主机B(192.168.0.1)通信,则先查询主机A中的ARP缓存表,看是否有该记录,如果有,则取出对应MAC地址。

如果缓存中没有该记录,主机A发出ARP请求,询问“IP地址是192.168.0.1的主机的硬件地址是多少”,并将这个ARP请求广播到本地网段(本地网段的任何一个主机都可能是接受者,所以用广播, 广播的目的MAC地址为:FF:FF:FF:FF:FF:FF)主机B收到广播的ARP请求,发现其中的IP地址(192.168.0.1)与本机相符,发送一个ARP应答数据包给源主机,将自己的硬件地址填写在应答包中,主机A接收ARP应答,提取MAC地址,并且将IP和MAC映射存入ARP缓存。

对于其他主机,虽然这个ARP请求可能与它无关,但ARP协议软件也会把其中的源MAC地址与源IP地址的映射记录下来,这样做能够有效的减少ARP请求在局域网的发送次数。

ARP欺骗的原理:

通过以上的知识,我们可以知道,主机A要和主机B通信,必须请求得到主机B的MAC地址,而MAC地址,又是通过ARP请求来得到的。又,根据ARP请求的广播机制,与非接收主机也会讲收到的ARP请求存入自己的ARP缓存。那么,我们可以自己发送一个ARP请求,将默认网关的IP作为发送IP,自己的MAC地址作为发送的MAC地址,随便请求一个IP地址的MAC地址。这样,网络中的所有计算机都会更新到默认网关的ARP缓存,而将默认网关IP对于的MAC地址改为我们网卡的MAC地址。从而,发送给默认网关的IP数据帧都会发送给我们自己的主机,我们监视完IP数据包后,再将IP数据包转发出去,即可通过ARP欺骗来完成对网络的监控。同样。当我们只进行ARP欺骗,而不进行转发的时候,则整个网络(内网)都将瘫痪。

当然,这些都只是雕虫小计,装了ARP防火墙的机器,你就不能监控了,要实现监控,最好的方式,还是把你的机器,作为内网的默认网关,所有通往外网的机器都通过你的主机。这样比较合适。

七。数据包的最大值:

就像前面我们说的,IP数据包要想继续向下发送,就必须转化为在物理设备上传输的数据帧。对于网络硬件来说,能传输的物理帧的大小是有物理上限的。这个上限值就是最大传输单元MTU。{令牌环网4500字节,以太网1500字节}。当数据包的比MTU大的时候,数据包是无法封装成帧在网络上传输的,当数据包比MTU小的时候,显然又会浪费网络带宽。

因此,IP数据包最理想的大小应该是相连网络的MTU相符。又因为 ,不同的网络MTU可能不同,当数据包需要经过较小MTU的网络时,我们需要将大数据包划分成更小的数据包(分片),以确保他们能通过无力处理大IP数据包的网络。

分片发生的位置:相连MTU网络间的路由

分片重组的位置:目标主机

分片发生在IP层,通过IP数据报报头中的“标志”和“段位移”来标识

(标识由)

分片后,形成的还是IP数据包,在路由中的处理方式与其他IP数据包一样

分片示意图:

    原始数据包:

IP报头

数据1480字节

分片以后数据包

IP报头

数据600字节

段位移0

IP报头

数据600字节

段位移600

IP报头

数据280字节 段位移1200

分片的优点:可以让数据包穿过MTU多变的网络。

缺点:分片后形成的多个IP数据包,每个都单独路由,又因为重组发送在目标主机,且又一个分片丢失,则整个原始IP数据包丢失,增大丢包风险。

说了这么多,我们还是只是不知道,数据怎么从一台主机到另外一台主机,接下来,我们一一分解,先从局域网开始。

八。数据在局域网中是如何传播的?

我们知道,在局域网中,无论是按何种拓扑结构组网,还是按何种方式来处理介质访问权限,任何两个节点之间都存在实际的线路链接

因此,我们通过ARP协议,得到目标主机的MAC地址后,在数据链路层将IP数据包封装为数据帧,将数据帧发送到本地网段上,即可将数据帧成功的交给目标主机(目标主机网卡收到数据帧后,判断MAC地址是否为本网卡MAC地址)。 当你要和很多很多主机通信时,你不可能保证他们都和你在同一网段内

那么不在一个局域网的数据之间,又是如何通信的呢?

九。数据是怎么样实现跨网段传输的?

这就需要路由器通过IP协议来完成此工作了。

下面我们通过一个实际的例子来看:主机A:192.168.1.1 需要和主机B:172.16.1.1通信。

      ![]()

两个主机并不在同一个局域网,并没有实际的物理线路将他们链接起来。

这个时候,我们在两个网段之间增加一个中转点(路由器),路由器上插有多个网卡,可以同时通过网卡E0接入局域网1 (192.168.1.0/24),同时通过网卡E2接入局域网2(172.168.1.0/24)。这样,局域网1中的机器A(192.168.1.1)要和局域网2中的机器B(172.16.1.1)通信。A将数据将数据包发送到本网段,路由器的E1口接收数据包,再将其通过E2口发送到网段B,主机B即可成功接收来自主机A的信息了。即可实现数据的跨网段传输。

大家发现问题了嘛?

没错,我们前面说了“网卡接收数据包后,首先判断MAC地址是不是本机地址,如果不是,则丢弃。”

而且我们说了“ARP请求是发送广播”,而大家都知道,为了防止广播风暴,路由器是不转发广播的。

那么,这个时候,即使A能有办法获得B的MAC地址,路由器的E1口上的网卡,MAC地址也不是B的MAC地址,这个时候,我们该怎么办呢?

十。什么是默认网关?

默认网关是TCP/IP中的一个配置参数,它是处于本地网络上的某个路由器的接口的IP地址。

在有默认网关的情况下,目的地为非本网段的数据包,源主机都发送给默认网关,由默认网关将数据包正确的发送给目标主机。

在上图中,网络192.168.1.0/24的默认网关为192.168.1.254,目的地为非本地网段的数据包,都发送给这个IP对应的Router,再由该Router转发给目的主机。

十一:什么是代理ARP?

在没有默认网关的情况下,我们也可以使用代理ARP技术来实现让路由器完成数据的跨网段传输功能。

如果我们将网络中所有主机的目的地都设为本地网络,那么当有要发送给外网IP的数据包时,源主机依然会认为目的地为本网段,而使用目的IP发出ARP请求。这个时候,对于目的IP不是本网段的ARP请求,连接在本网段的路由器使用自己的MAC地址回复这个ARP请求。于是主机A将数据发到本地网段,连在本地网络的路由器接收数据,路由器再将数据转发到正确的目的地。(其实运行代理ARP的路由器就相当于默认网关

代理ARP的优点:简化了主机的管理(不用再每个主机都单独配置默认网关了)

缺点:因为针对每个局域网,外网IP都是很多的,所以:

 1.在路由器上需要保存一个很大的ARP缓存。

     2.每个外网IP都需要发送ARP请求,增大了内网的通信。

在上图中,当没有设置默认网关的时候,主机A发送给主机B的数据包,主机A发送ARP请求后,由连接E1口的Router 用自己E1口的MAC地址回复该ARP请求 。

路由器在E1口接到数据包后,怎么样通过E2口发到主机B所在的网段上去?

十二.路由器中数据跨网段传输的具体情形?

每个路由器中都存有一张路由表,记录着目标网段和对应的网卡出口的映射。

在上面的例子中,路由器的E1口收到数据包,根据数据包取出对应的目的网段的地址172.16.1.1,然后路由器查找路由表,根据IP地址,找到通过E2口可以达到目标网络。于是,路由将数据包从E1口读入,穿过路由器,从E2口写出。

所谓的穿过路由器,应该是指:两个网卡上都分别运行着TCP/IP协议,穿过路由,即从路由的内存中,将数据从网卡1的IP程序拷贝到网卡2的IP程序。

至此,关于路由中的部分,我们就几乎讲完了,我们再来总结下:

【路由器都有哪些功能?】

1.交换和转发功能:将数据从路由器的进入接口,穿过路由器,送到输出接口。

(将一个数据包从一个网段,发送到另外一个网段。)

2.路由功能:即寻址,通过IP数据包决定正确的下一跳路径

(通过哪个网卡写出。)

【路由器实现跨网段传输的基础?】

1.硬件基础:有多个网卡,同时在多个网段上,同时属于多个局域网。

2.软件基础:代理ARP(主机将目的地址都配置为本网段,路由器代理回应ARP请求)

在实际中的很多情况下,两个局域网之间可能不仅仅隔了一个网段,同理,我们可以在多个网段之间,通过多个路由器而使彼此连接起来。其实路由器就是将世界各地的各个局域网都连接起来,得到了我们现在的互联网。

十三:路由过程:

1.主机A的传输层将数据交给网络层,网络层加上双方IP地址,TTL等IP报头信息,成为IP数据包,网络层将IP数据报交给数据链路层。

2.数据链路层根据IP地址,通过ARP得到MAC,封装为物理帧,通过网卡发出。

3.主机B接收物理帧,根据MAC地址判断:如果目的MAC地址不是本网卡MAC地址,则丢弃;如果是发给自己的,则交给网络层处理。

4.网络层通过IP地址判断:如果是发给自己的,则交给上层协议处理;如果不是发给自己的,则在路由表中查找此IP合理的下一跳地址(即通过哪个网卡发送到下一个网段),并将数据通过内存,从接收数据网卡的IP程序拷贝到需要发送数据网卡的IP程序。在发送网卡中,IP程序将数据包交给链路层,链路层发送ARP请求,得到下一跳的目的MAC地址,封装为帧,发送。

如此反复,直到IP数据包到达最终正确的接收主机。

好了,关于ARP和IP都讲了挺多了,可是,为什么有ICMP协议呢?这个协议是干嘛的呢?

预知详情,请看下篇《TCP/IP网络层谜云之ICMP》 http://java-mzd.iteye.com/blog/1019089

43 TCP/IP网络层谜云之ICMP | TCP/IP传输层,你懂多少?

发表评论

表情图标

字体颜色: 标准深红红色橙色棕色黄色绿色橄榄青色蓝色深蓝靛蓝紫色灰色白色黑色 字体大小: 标准1 (xx-small)2 (x-small)3 (small)4 (medium)5 (large)6 (x-large)7 (xx-large) 对齐: 标准居左居中居右

提示:选择您需要装饰的文字, 按上列按钮即可添加上相应的标签

您还没有登录,请登录后发表评论(快捷键 Alt+S / Ctrl+Enter)

java_mzd的博客

java_mzd

搜索本博客

最近访客 >>更多访客

aria的博客

aria

zhxing的博客

zhxing java_suddy的博客

java_suddy

liuxinglanyue的博客

liuxinglanyue

博客分类

其他分类

存档

TCP IP网络层谜云之ICMP

Posted on

TCP IP网络层谜云之ICMP - - ITeye技术网站

首页 新闻 论坛 问答 博客 招聘 更多 ▼

专栏 群组 搜索

您还未登录 ! 我的应用 登录 注册

java-mzd

永久域名 http://java-mzd.iteye.com

2顶 4踩

腾讯、淘宝、金山网络,实习生我该何去何从 | TCP/IP网络层谜云

2011-04-27

TCP/IP网络层谜云之ICMP

文章分类:Java编程 本文上接《TCP/IP网络层谜云http://java-mzd.iteye.com/blog/1019088

十四。为什么需要ICMP?

因为IP协议不提供可靠性且不能保证信息传递,因此发生问题时,通知发送人是很重要的。(IP协议是一种不可靠的协议,无法进行差错控制。但IP协议可以借助其他协议来实现这一功能,如ICMP)

十五。什么是ICMP?

ICMP: Internet Control Message Protocol 即Internet消息控制协议。

ICMP定义了一套差错报文控制报文,用于用户主机与路由之间交换不可到达地址、网络拥塞、重定向到更好的路径、报文生命周期超时等信息。

ICMP协议是一种提供(有关阻止数据包传递的)网络故障问题反馈信息的机制。(针对阻止数据包传递或者网络故障。)它让TCP等上层协议能够意识到数据包没有送达目的地。 关于ICMP与TCP的差错控制对比?

比如主机A到主机B的通信,中间Router r1 到Router r2 的网络连接断了。

通过ICMP,则可以快速诊断出出错原因,并且报告主机。(差错诊断)

TCP的差错控制,主要是体现在,网络断了,收不到确认回复,TCP会一直再次发送数据包,直到收到确认回复。(差错处理)

ICMP提供一组易懂的出错报告信息。发送的出错报文返回到发送原数据的设备,因为只有发送设备才是出错报文的逻辑接受者发送设备随后可根据ICMP报文确定发生错误的类型,确定如何才能更好地重发失败的数据报。但是ICMP唯一的功能是报告问题而不是纠正错误,纠正错误的任务由发送方完成。

十六。ICMP协议有哪些数据包?

**一个ICMP数据包实际上就是一个(数据部分为ICMP协议数据的)**IP数据包。

IP头

ICMP头 Type

Code

Checksum ICMP数据

如前所述,ICMP主要分为差错报文控制报文

差错报文包括:目标不可到达(网络、协议、主机、端口不可到达;禁止分割、目标网络不认识、目标主机不认识等等)、超时、参数问题、重定向(网络重定向、主机重定向等)等等

控制报文包括:请求回显(ping请求)、回显应答(ping应答)、地址掩码请求、地址掩码应答等等

如上,我们可以发现,同一类型的错误(不可到达)可能有不同种类(网络不可到达、主机不可到达),因此,我们使用type来code两个标志来确定一个具体的错误。

因为需要指出具体是哪个主机上的哪个程序发出的信息没有到达。

因此,每一个ICMP的错误消息,应该包含:

1.具体的错误类型(Type/code 决定)

2.引发ICMP错误消息的数据包的完全IP包头(哪个主机的数据)

3.数据报的前8个字节----UDP报头或者TCP中的port部分(主机上的哪个程序)

因此,ICMP错误消息的格式应该为如下: Type(8)

Code(8)

Checksum(16) Unused(32) Internet Header +64 Bits of Original Data Datagram

控制报文因为控制的消息各不相同,所以有所差异。下面分析下请求回显(ping)和回显应答,其他的消息,大家可以触类旁通。


Type

Code

Checksum Identifier

Sequence Number Data

当主机**A需要知道和主机B通信的状况(信息传递延时、丢包率)时,我们该怎么办呢?** 我们可以参考声纳和雷达的原理:主机A发送一个ICMP回显请求(type=8,code=0)报文,数据域中存放当前时间T1,目的IP为主机B。主机B收到该ICMP回显请求报文后,将目的IP和源IP调换位置,其他信息都不变(Indentifier,Sequence Number),回复一个ICMP回显应答(type=0,code=0)。主机A收到改ICMP回显应答的时间为T2。则,到主机B的通信时间为:T2-T1。

又因为,要考虑丢包,所以我们向主机B发送多个回显请求,用Sequence Number来区分各个请求,根据Sequence Number,即可知道应答对应的请求数据包。

Ping命令就是这样的一个实现,其实我们在命令行下输入ping ip命令时,就是调用Ping程序。Ping程序根据输入的IP(域名)封装ICMP请求应答,发送出去,并且接受ICMP回显应答,进行解析,输出。

关于超时:IP报头中的生存期(TTL)属性,用来控制报文段在网络中的生存期。

试想一下,当网络中的某些路由出现问题,Router A将IP a 的下一跳路由为Router B。同时在Router B中,又将IP a 的下一跳路由为 Router A。那么显然,两个路由器之将会间形成回路,通往网段a的数据包,将会一直在两个路由之间发送,导致网络流量爆炸,同时,数据包也无法正确的到达网络a。

因此,当IP数据包每经过一个路由器时,路由器将IP数据包中的TTL值减一。当TTL值为0时,路由器判断数据包超时,发送ICMP超时信息给源主机。

当我们想知道:从主机**A发送到主机B的数据包在网络中都经过了哪些路由器的时候,我们有什么办法呢?** 我们知道,当IP数据包在路由中出错时,路由器会向发送源发送一个ICMP错误报文,发送端从该ICMP错误报文中,可以得到该路由的IP。

我们可以利用此原理。要得到从主机A到目标主机B之间的所有路由的IP,那么我们必须让IP数据包在每个路由器中都出错一次。

又因此,TTL值在经过的每个路由器中都会减1。因此,我们可以利用TTL的超时信息,在每个路由中都发生一次。即可得到从从主机A到主机B之间的所有路由的IP。

PS.怎么判断数据包正确到达了目标主机B?

当IP数据包到达了目标主机,将不会再发送TTL超时错误。而且在目标主机B中,没有运行相对应的应用层程序,因此,将没有程序会回应我们发送的IP数据包。那么,我们将如何知道IP数据包已经到达了目标主机呢?

我们可以为数据包分配一个目标主机几乎不可能监听的端口,从而,当IP数据包到达目标主机后,目标主机会回复相应的”不可到达、端口不可到达”的ICMP错误信息,从而,我们可以确认IP数据包已经到达了目标主机。

综上,我们可以:源主机A发送IP数据包,IP为目标主机B,port几乎不可能监听的port,TTL从一开始一直往上增加,直道收到来自主机B的ICMP 不可到达(端口不可到达)信息。

Tracerouter 命令就是实现这样功能的一个程序。我们可以通过tracerouter ip来调用此功能。

PS.因为每次路由时的路由路径可能不一样,那么在tracerouter过程中,我们又如何解决这个问题?

而且,如果目标主机正好监听了这一我们认为不可能监听的端口呢?

针对这些问题,欢迎各位读者回答。

PS。这是第四次更改了。。希望JE别抽风了。。让他们正常显示吧。。

这年头,每个用心写总结的人。。你们都伤不起啊。。。

好不容易写了一周啊。。

从2000写到8000啊。。又从8000改到4000啊。。又从4000改到6600啊

写了改

改了啊。。

伤不起啊。。

好不容易写好了。。

JE还不给力。。显示不正常啊。。

又重新写了后面两个大问题好几遍啊。。好几遍啊

伤不起啊。。。

24 腾讯、淘宝、金山网络,实习生我该何去何从 | TCP/IP网络层谜云

2 楼 leelege 2011-05-04 引用

感谢楼主分享 期待更多内容~~ 1 楼 cosina 2011-04-28 引用

学倒不少! 继续写哈哈

发表评论

表情图标

字体颜色: 标准深红红色橙色棕色黄色绿色橄榄青色蓝色深蓝靛蓝紫色灰色白色黑色 字体大小: 标准1 (xx-small)2 (x-small)3 (small)4 (medium)5 (large)6 (x-large)7 (xx-large) 对齐: 标准居左居中居右

提示:选择您需要装饰的文字, 按上列按钮即可添加上相应的标签

您还没有登录,请登录后发表评论(快捷键 Alt+S / Ctrl+Enter)

java_mzd的博客

java_mzd

搜索本博客

最近访客 >>更多访客

aria的博客

aria

zhxing的博客

zhxing java_suddy的博客

java_suddy

liuxinglanyue的博客

liuxinglanyue

博客分类

其他分类

存档

TCP状态转换图

Posted on

TCP状态转换图

TCP状态转换图

TCP状态转换图

注:主动、被动 与 服务器、客户端没有明确的对应关系。 这个图N多人都知道,它排除和定位网络或系统故障时大有帮助,但是怎样牢牢地将这张图刻在脑中呢?那么你就一定要对这张图的每一个状态,及转换的过程有深刻 的认识,不能只停留在一知半解之中。下面对这张图的11种状态详细解析一下,以便加强记忆!不过在这之前,先回顾一下TCP建立连接的三次握手过程,以及 关闭连接的四次握手过程。

1、建立连接协议(三次握手) (1)客户端发送一个带SYN标志的TCP报文到服务器。这是三次握手过程中的报文1。 (2) 服务器端回应客户端的,这是三次握手中的第2个报文,这个报文同时带ACK标志和SYN标志。因此它表示对刚才客户端SYN报文的回应;同时又标志SYN给客户端,询问客户端是否准备好进行数据通讯。 (3) 客户必须再次回应服务段一个ACK报文,这是报文段3。 2、连接终止协议(四次握手) 由于TCP连接是全双工的,因此每个方向都必须单独进行关闭。这原则是当一方完成它的数据发送任务后就能发送一个FIN来终止这个方向的连接。收到一个 FIN只意味着这一方向上没有数据流动,一个TCP连接在收到一个FIN后仍能发送数据。首先进行关闭的一方将执行主动关闭,而另一方执行被动关闭。 (1) TCP客户端发送一个FIN,用来关闭客户到服务器的数据传送(报文段4)。 (2) 服务器收到这个FIN,它发回一个ACK,确认序号为收到的序号加1(报文段5)。和SYN一样,一个FIN将占用一个序号。 (3) 服务器关闭客户端的连接,发送一个FIN给客户端(报文段6)。 (4) 客户段发回ACK报文确认,并将确认序号设置为收到序号加1(报文段7)。 CLOSED: 这个没什么好说的了,表示初始状态。 LISTEN: 这个也是非常容易理解的一个状态,表示服务器端的某个SOCKET处于监听状态,可以接受连接了。 SYN_RCVD: 这个状态表示接受到了SYN报文,在正常情况下,这个状态是服务器端的SOCKET在建立TCP连接时的三次握手会话过程中的一个中间状态,很短暂,基本 上用netstat你是很难看到这种状态的,除非你特意写了一个客户端测试程序,故意将三次TCP握手过程中最后一个ACK报文不予发送。因此这种状态 时,当收到客户端的ACK报文后,它会进入到ESTABLISHED状态。 SYN_SENT: 这个状态与SYN_RCVD遥想呼应,当客户端SOCKET执行CONNECT连接时,它首先发送SYN报文,因此也随即它会进入到了SYN_SENT状 态,并等待服务端的发送三次握手中的第2个报文。SYN_SENT状态表示客户端已发送SYN报文。 ESTABLISHED:这个容易理解了,表示连接已经建立了。 FIN_WAIT_1: 这个状态要好好解释一下,其实FIN_WAIT_1和FIN_WAIT_2状态的真正含义都是表示等待对方的FIN报文。而这两种状态的区别 是:FIN_WAIT_1状态实际上是当SOCKET在ESTABLISHED状态时,它想主动关闭连接,向对方发送了FIN报文,此时该SOCKET即 进入到FIN_WAIT_1状态。而当对方回应ACK报文后,则进入到FIN_WAIT_2状态,当然在实际的正常情况下,无论对方何种情况下,都应该马 上回应ACK报文,所以FIN_WAIT_1状态一般是比较难见到的,而FIN_WAIT_2状态还有时常常可以用netstat看到。 FIN_WAIT_2:上面已经详细解释了这种状态,实际上FIN_WAIT_2状态下的SOCKET,表示半连接,也即有一方要求close连接,但另外还告诉对方,我暂时还有点数据需要传送给你,稍后再关闭连接。 TIME_WAIT: 表示收到了对方的FIN报文,并发送出了ACK报文,就等2MSL后即可回到CLOSED可用状态了。如果FIN_WAIT_1状态下,收到了对方同时带FIN标志和ACK标志的报文时,可以直接进入到TIME_WAIT状态,而无须经过FIN_WAIT_2状态。 CLOSING: 这种状态比较特殊,实际情况中应该是很少见,属于一种比较罕见的例外状态。正常情况下,当你发送FIN报文后,按理来说是应该先收到(或同时收到)对方的ACK报文,再收到对方的FIN报文。但是CLOSING状态表示你发送FIN报文后,并没有收到对方的ACK报文,反而却也收到了对方的FIN报文。什 么情况下会出现此种情况呢?其实细想一下,也不难得出结论:那就是如果双方几乎在同时close一个SOCKET的话,那么就出现了双方同时发送FIN报 文的情况,也即会出现CLOSING状态,表示双方都正在关闭SOCKET连接。 CLOSE_WAIT: 这种状态的含义其实是表示在等待关闭。怎么理解呢?当对方close一个SOCKET后发送FIN报文给自己,你系统毫无疑问地会回应一个ACK报文给对 方,此时则进入到CLOSE_WAIT状态。接下来呢,实际上你真正需要考虑的事情是察看你是否还有数据发送给对方,如果没有的话,那么你也就可以close这个SOCKET,发送FIN报文给对方,也即关闭连接。所以你在CLOSE_WAIT状态下,需要完成的事情是等待你去关闭连接。 LAST_ACK: 这个状态还是比较容易好理解的,它是被动关闭一方在发送FIN报文后,最后等待对方的ACK报文。当收到ACK报文后,也即可以进入到CLOSED可用状态了。 最后有2个问题的回答,我自己分析后的结论(不一定保证100%正确) 1、 为什么建立连接协议是三次握手,而关闭连接却是四次握手呢? 这 是因为服务端的LISTEN状态下的SOCKET当收到SYN报文的建连请求后,它可以把ACK和SYN(ACK起应答作用,而SYN起同步作用)放在一 个报文里来发送。但关闭连接时,当收到对方的FIN报文通知时,它仅仅表示对方没有数据发送给你了;但未必你所有的数据都全部发送给对方了,所以你可以未 必会马上会关闭SOCKET,也即你可能还需要发送一些数据给对方之后,再发送FIN报文给对方来表示你同意现在可以关闭连接了,所以它这里的ACK报文 和FIN报文多数情况下都是分开发送的。 2、 为什么TIME_WAIT状态还需要等2MSL后才能返回到CLOSED状态? 这是因为: 虽然双方都同意关闭连接了,而且握手的4个报文也都协调和发送完毕,按理可以直接回到CLOSED状态(就好比从SYN_SEND状态到ESTABLISH状态那样);但是因为我们必须要假想网络是不可靠的,你无法保证你最后发送的ACK报文会一定被对方收到,因此对方处于LAST_ACK状态下的SOCKET可能会因为超时未收到ACK报文,而重发FIN报文,所以这个TIME_WAIT状态的作用就是用来重发可能丢失的ACK报文。

同时打开

两个应用程序同时执行主动打开的情况是可能的,虽然发生的可能性较低。每一端都发送一个SYN,并传递给对方,且每一端都使用对端所知的端口作为本地端口。例如:

主机a中一应用程序使用7777作为本地端口,并连接到主机b 8888端口做主动打开。

主机b中一应用程序使用8888作为本地端口,并连接到主机a 7777端口做主动打开。

tcp协议在遇到这种情况时,只会打开一条连接。

这个连接的建立过程需要4次数据交换,而一个典型的连接建立只需要3次交换(即3次握手)

但多数伯克利版的tcp/ip实现并不支持同时打开。

SYN_RCVD与SYN_SEND都是转换为ESTABLISHED的中间状态,目标是两端均转换到ESTABLISHED状态。

同时关闭

如果应用程序同时发送FIN,则在发送后会首先进入FIN_WAIT_1状态。在收到对端的FIN后,回复一个ACK,会进入CLOSING状态。在收到对端的ACK后,进入TIME_WAIT状态。这种情况称为同时关闭。

同时关闭也需要有4次报文交换,与典型的关闭相同。

来源: <TCP状态转换图 - 李大嘴 - 博客园>

LinearSearch

Posted on

LinearSearch

Algorithm Gossip: 循序搜寻法(使用卫兵)

说明

搜寻的目的,是在“已排序的资料”中寻找指定的资料,而当中循序搜寻是最基本的搜寻法,只要从资料开头寻找到最后,看看是否找到资料即可。

解法

初学者看到循序搜寻,多数都会使用以下的方式来进行搜寻: while(i < MAX) { if(number[i] == k) { printf("找到指定值"); break; } i++; }

这个方法基本上没有错,但是可以加以改善,可以利用设定卫兵的方式,省去if判断式,卫兵通常设定在数列最后或是最前方,假设设定在列前方好了(索引0的 位置),我们从数列后方向前找,如果找到指定的资料时,其索引值不是0,表示在数列走访完之前就找到了,在程式的撰写上,只要使用一个while回圈就可 以了。 下面的程式为了配合卫兵的设置,自行使用快速排序法先将产生的数列排序,然后才进行搜寻,若只是数字的话,通常您可以使用程式语言函式库所提供的搜寻函式。

实作

  • C /#include /#include /#include /#define MAX 10 /#define SWAP(x,y) {int t; t = x; x = y; y = t;} int search(int[]); int partition(int[], int, int); void quicksort(int[], int, int); int main(void) { int number[MAX+1] = {0}; int i, find; srand(time(NULL)); for(i = 1; i <= MAX; i++) number[i] = rand() % 100; quicksort(number, 1, MAX); printf("数列:"); for(i = 1; i <= MAX; i++) printf("%d ", number[i]); printf("\n输入搜寻值:"); scanf("%d", &number[0]); if(find = search(number)) printf("\n找到数值于索引 %d ", find); else printf("\n找不到数值"); printf("\n"); return 0; } int search(int number[]) { int i, k; k = number[0]; i = MAX; while(number[i] != k) i--; return i; } int partition(int number[], int left, int right) { int i, j, s; s = number[right]; i = left - 1; for(j = left; j < right; j++) { if(number[j] <= s) { i++; SWAP(number[i], number[j]); } } SWAP(number[i+1], number[right]); return i+1; } void quicksort(int number[], int left, int right) { int q; if(left < right) { q = partition(number, left, right); quicksort(number, left, q-1); quicksort(number, q+1, right); } }

  • Java public class LinearSearch { public static int search(int[] number, int des) { int[] tmp = new int[number.length + 1]; for(int i = 1; i < tmp.length; i++) { tmp[i] = number[i-1]; } tmp[0] = des; int k = tmp[0]; int i = number.length; while(tmp[i] != k) i--; return i - 1; } public static void main(String[] args) { int[] number = {1, 4, 2, 6, 7, 3, 9, 8}; QuickSort.sort(number); int find = LinearSearch.search(number, 3); if(find != 0) System.out.println("找到数值于索引" + find); else System.out.println("找不到数值"); } }

浅析——SCTP协议

Posted on

浅析——SCTP协议

浅析——SCTP协议

Posted on 2011-07-13 21:26 李大嘴 阅读(2621) 评论(0) 编辑 收藏

SCTP处于SCTP用户应用层与IP网络层之间,它运用“关联”(association)这个术语定义交换信息的两个对等SCTP用户间的协议状态 。SCTP也是面向连接的,但在概念上,SCTP“关联”比TCP连接更为广泛:TCP的连接只有一个源地址和一个目的地址,SCTP提供一种方式使得每 个SCTP端点能为另一个对等端点提供一组传输地址,即传输地址= 一组IP地址+端口号。 在继承TCP特点的基础上,SCTP提供了一些额外的功能:

  1. 在多个“流”(stream)中实现用户数据的有序发送 “流” 在TCP中指一系列的字节,而在SCTP中是指发送到上层协议的一定系列的用户消息,这些消息的顺序与流内其他消息相关。SCTP用户在建立关联时,可以 规定关联支持的流的数目。这个数目是与源端商定的,用户消息与流数目关联。在链路中,SCTP为每个送到对等端的消息分配一个流序号。在接收端,SCTP 确保在给定流中消息按顺序发送。同时,当一个流正在等待下一个非顺序的用户消息时,其他流的发送会继续。
  2. 根据已发现的路径MTU(最大传输单元)大小进行用户数据分片 为了确保发送到下层的SCTP数据包与路径MTU一致,SCTP对用户消息分片。在接收端,分片被重组后传给上层SCTP用户。
  3. 选择性确认(SACK)和拥塞控制 选择性确认用于数据包丢失发现,TCP中确认序号返回的是发送方已成功收到数据字节序号(不包含确认序号所指的字节),而SCTP反馈给发送端的是丢失的并且要求重传的消息序号。 SCTP运用了TCP中的拥塞控制技术,包括慢启动,拥塞避免和快速重传。因此,当和TCP应用共存时,SCTP应用可接收属于SCTP的网络资源部分。
  4. 块(chunk)绑定 即多个用户消息可选择地绑定到一个SCTP包上,通过将消息放到一个或多个SCTP数据结构——“块”中,SCTP保留了应用程序的消息框架边界。不同类型的块可绑定到一个SCTP包中,但是控制块必须放在任何一个数据块之前。
  5. 路径管理 SCTP 路径管理功能主要负责从远端提供的一组传输地址中选择目的传输地址,它根据两个方面来选择目的地址:SCTP用户指示和当前可达的合格目的地。当其他流控 制不能提供可达性信息时,路径管理功能定时地扫描链路的可达性,并向SCTP报告远端传输地址所发生的变化。SCTP 路径管理功能模块同时还负责在建立链路时,向远端报告可用的本地地址,并把远端返回的传输地址告诉SCTP用户。
  6. 支持多宿 当SCTP传送数据包给目的IP地址时,如果此IP地址是不可达的,SCTP可以将消息重路由给一个交替的IP地址。这样,在关联的一端甚至两端,可容忍网络级错误。
  7. 防范拒绝服务(DoS)攻击 DoS 的攻击方式有很多种,最基本的DoS攻击就是利用合理的服务请求来占用过多的服务资源,从而使合法用户无法得到服务的响应。SYN Flooding攻击是DoS攻击的一种实例,是目前效果最好的一种黑客攻击方式。为了抵抗SYN Flooding对目标主机攻击,SCTP在关联初始化阶段实施了一种安全的“Cookie”机制。
  8. 支持多种传输模式 严格有序传输(像TCP),部分有序传输(像per-stream)和无序传输(像UDP)。 2 SCTP包结构 SCTP 包的结构,一个数据包首部可跟一个或多个可变长的块。块采用“类型—长度—值”(TLV)的格式。源端口、目的端口、校验码的意义同TCP中的意义相似。 确认标签保存着在SCTP握手中第一次交换的初始标签的值。在关联中,任何SCTP数据包若不包含这样一个标签,当到达时会被接收端丢弃。 在每个块中,TLV包括块类型、传输处理标记、块长度。不同的块类型可用来传输控制信息或数据。 传输序列号(TSN)和流序列号(SSN)是两种不同的序列号,TSN保证整个关联的可靠性,而SSN保证整个流的有序性,这样,在传输中,将数据的可靠性与有序性独立分开。 3 SCTP数据传输 4.1 SCTP四路握手及抵抗SYN Flooding攻击的原理 一个SCTP关联定义为:[主机A的一组IP地址]+[主机A的端口]+ [主机B的一组IP地址]+[主机B的端口]。 因此,每一端对应组中的任何一个IP地址都可作为相应的源/目的地址来标示本次关联,通过四路握手,两端SCTP主机交换通信状态。 SYN Flooding利用了TCP/IP的固有漏洞,面向连接的TCP三次握手是SYN Flooding存在的基础。SYN Flooding攻击的原理是:恶意的攻击者大量向服务器发送SYN报文,服务器在发出SYN+ACK应答报文后无法收到客户端的ACK报文(第三次握手 无法完成),服务器端将为维护一个非常大的半连接列表而消耗非常多的CPU时间和内存资源,还要不断对这个列表中的IP进行SYN+ACK的重试。服务器 端将忙于处理攻击者伪造的TCP连接请求而无暇理睬客户的正常请求,此时从正常客户的角度看来,服务器失去响应。 而在一次SCTP四路 握手中,INIT消息的接收端不必保存任何状态信息或者分配任何资源,这样就可防范SYN Flooding等DoS攻击。它在发送INIT-ACK消息时,采用了一种机制——“状态Cookie”,该Cookie具有发送端要建立自己状态所需 的全部信息。 SCTP产生一个状态Cookie的过程如下:
  9. 使用收到的INIT和发出的INIT- ACK块中的信息创建一个关联的TCB(传输控制块)。
  10. 在TCB中,将当前日期设为创建日期,将协议参数“有效Cookie时间”设为生存期间。
  11. 根据TCB,收集重建TCB所需的最小信息子集,将该子集和密钥产生一个MAC(信息认证编码)。
  12. 结合上述最小信息子集和MAC产生状态Cookie。
  13. 在发送完INIT ACK(包含状态Cookie参数)后,发送方必须删除TCB以及任何与新关联有关的本地资源。 INIT 和INIT-ACK都必须包含建立初始状态所需的参数:一组IP地址,保证可靠传输的初始TSN,每个被接收的SCTP包中必须含有的初始标签,每一端请 求发出的流数目和每一端能支持接收的流数目。交换完这些消息之后,INIT的发送端以COOKIE-ECHO消息的方式发送回状态Cookie。接收端根 据所接收到的COOKIE-ECHO中的状态Cookie,完整地重建自己的状态,并回送COOKIE- ACK来确认关联已建立。COOKIE-ECHO和COOKIE-ACK都可将用户数据消息绑定到各自的包中。 由此可见,采用以上这种 方式,即使接收再多的INIT消息, 接收端也没有任何资源的消耗:它既不分配任何系统资源,也不保存此次新关联的状态,它只是把相应重建状态所用的状态Cookie作为参数,包含在每一个回 送的INIT-ACK消息中,最后该状态Cookie会被COOKIE-ECHO消息发送回来。 2.2 SCTP数据交换 在两个SCTP主机间的正常数据交换。SCTP主机发送SACK块,用来确认每一个收到的SCTP包。因为SACK能完整地描述接收端的状态,因此,依据SACK,发送端能做出重传判决。SCTP支持类似于TCP中的快速重传和time-out重传算法。 对于数据包丢失发现,SCTP和TCP采用截然不同的机制:当TCP发现接收序号有缺口时,会等到该缺口被填上后,才发送序列号高于丢失数据包的数据。然而,SCTP即使发现接收序号有缺口或顺序错乱,仍会发送后面的数据。 3.3 SCTP关闭关联 作 为面向连接的传输协议,SCTP也运用三路握手来关闭一个关联,但与TCP有一点不同:一个TCP终端在“关联关闭”的过程中能够保持连接开启,并从对端 接收新的数据,而SCTP不支持TCP的这种“半关闭”状态。 1. 主机A发出“关闭”(SHUTDOWN)块来终止与主机B的关联,主机A进入“SHUTDOWN- PENDING”状态,对应的动作是:不再接受上层应用的数据,只发送队列中剩余的数据,进入“SHUTDOWN-SENT”状态。
  14. 主机B一旦接收到“关闭”块,就进入“SHUTDOWN-RECEIVED”状态,同主机A一样,不再接受上层应用的数据,只发送队列中剩余的数据。
  15. 主机A再次发送“关闭”块,通知主机 B所发送的剩余数据已到达,并且重申了关联正在关闭。
  16. 当第二次收到“关闭”块时,主机B发送“确认关闭”块。
  17. 主机A随后发送“关闭结束”块,完成本次关联的关闭。 4 结束语 SCTP 是为传输信令业务流而开发的,但它所具有的一些优于TCP的先进协议机制,如选择性确认、快速重传、无序递交等,使它又满足高性能传输的需求,这会给它带 来更为宽广的应用需求。目前,已有各种操作系统支持SCTP, 如Linux、AIX、Solaris、Windows、FressBSD。在不同协议实现间的互操作性测试的成功,揭示着SCTP正走向商业产品之路。 IEFT正在致力于SCTP进一步的修改,使其更能满足下一代应用的需求,例如支持IPv6地址,解决对端对于IPv6的site-local、link-local地址无连通性的问题,以及在已存在的关联中动态地增加或删除IP地址而无需重启该关联。 此外,在第三代移动通信中,SCTP可作为信令承载层的备选方案之一,它的应用及其性能评估也有待研究。

分类: Network Programming

绿色通道: 好文要顶 关注我 收藏该文与我联系

李大嘴 关注 - 7 粉丝 - 27

+加关注

0

0 (请您对文章做出评价)

« 上一篇:TCP状态转换图 » 下一篇:MTU & MSS 详解记录

SCTP处于SCTP用户应用层与IP网络层之间,它运用“关联”(association)这个术语定义交换信息的两个对等SCTP用户间的协议状态 。SCTP也是面向连接的,但在概念上,SCTP“关联”比TCP连接更为广泛:TCP的连接只有一个源地址和一个目的地址,SCTP提供一种方式使得每 个SCTP端点能为另一个对等端点提供一组传输地址,即传输地址= 一组IP地址+端口号。 在继承TCP特点的基础上,SCTP提供了一些额外的功能:

  1. 在多个“流”(stream)中实现用户数据的有序发送 “流” 在TCP中指一系列的字节,而在SCTP中是指发送到上层协议的一定系列的用户消息,这些消息的顺序与流内其他消息相关。SCTP用户在建立关联时,可以 规定关联支持的流的数目。这个数目是与源端商定的,用户消息与流数目关联。在链路中,SCTP为每个送到对等端的消息分配一个流序号。在接收端,SCTP 确保在给定流中消息按顺序发送。同时,当一个流正在等待下一个非顺序的用户消息时,其他流的发送会继续。
  2. 根据已发现的路径MTU(最大传输单元)大小进行用户数据分片 为了确保发送到下层的SCTP数据包与路径MTU一致,SCTP对用户消息分片。在接收端,分片被重组后传给上层SCTP用户。
  3. 选择性确认(SACK)和拥塞控制 选择性确认用于数据包丢失发现,TCP中确认序号返回的是发送方已成功收到数据字节序号(不包含确认序号所指的字节),而SCTP反馈给发送端的是丢失的并且要求重传的消息序号。 SCTP运用了TCP中的拥塞控制技术,包括慢启动,拥塞避免和快速重传。因此,当和TCP应用共存时,SCTP应用可接收属于SCTP的网络资源部分。
  4. 块(chunk)绑定 即多个用户消息可选择地绑定到一个SCTP包上,通过将消息放到一个或多个SCTP数据结构——“块”中,SCTP保留了应用程序的消息框架边界。不同类型的块可绑定到一个SCTP包中,但是控制块必须放在任何一个数据块之前。
  5. 路径管理 SCTP 路径管理功能主要负责从远端提供的一组传输地址中选择目的传输地址,它根据两个方面来选择目的地址:SCTP用户指示和当前可达的合格目的地。当其他流控 制不能提供可达性信息时,路径管理功能定时地扫描链路的可达性,并向SCTP报告远端传输地址所发生的变化。SCTP 路径管理功能模块同时还负责在建立链路时,向远端报告可用的本地地址,并把远端返回的传输地址告诉SCTP用户。
  6. 支持多宿 当SCTP传送数据包给目的IP地址时,如果此IP地址是不可达的,SCTP可以将消息重路由给一个交替的IP地址。这样,在关联的一端甚至两端,可容忍网络级错误。
  7. 防范拒绝服务(DoS)攻击 DoS 的攻击方式有很多种,最基本的DoS攻击就是利用合理的服务请求来占用过多的服务资源,从而使合法用户无法得到服务的响应。SYN Flooding攻击是DoS攻击的一种实例,是目前效果最好的一种黑客攻击方式。为了抵抗SYN Flooding对目标主机攻击,SCTP在关联初始化阶段实施了一种安全的“Cookie”机制。
  8. 支持多种传输模式 严格有序传输(像TCP),部分有序传输(像per-stream)和无序传输(像UDP)。 2 SCTP包结构 SCTP 包的结构,一个数据包首部可跟一个或多个可变长的块。块采用“类型—长度—值”(TLV)的格式。源端口、目的端口、校验码的意义同TCP中的意义相似。 确认标签保存着在SCTP握手中第一次交换的初始标签的值。在关联中,任何SCTP数据包若不包含这样一个标签,当到达时会被接收端丢弃。 在每个块中,TLV包括块类型、传输处理标记、块长度。不同的块类型可用来传输控制信息或数据。 传输序列号(TSN)和流序列号(SSN)是两种不同的序列号,TSN保证整个关联的可靠性,而SSN保证整个流的有序性,这样,在传输中,将数据的可靠性与有序性独立分开。 3 SCTP数据传输 4.1 SCTP四路握手及抵抗SYN Flooding攻击的原理 一个SCTP关联定义为:[主机A的一组IP地址]+[主机A的端口]+ [主机B的一组IP地址]+[主机B的端口]。 因此,每一端对应组中的任何一个IP地址都可作为相应的源/目的地址来标示本次关联,通过四路握手,两端SCTP主机交换通信状态。 SYN Flooding利用了TCP/IP的固有漏洞,面向连接的TCP三次握手是SYN Flooding存在的基础。SYN Flooding攻击的原理是:恶意的攻击者大量向服务器发送SYN报文,服务器在发出SYN+ACK应答报文后无法收到客户端的ACK报文(第三次握手 无法完成),服务器端将为维护一个非常大的半连接列表而消耗非常多的CPU时间和内存资源,还要不断对这个列表中的IP进行SYN+ACK的重试。服务器 端将忙于处理攻击者伪造的TCP连接请求而无暇理睬客户的正常请求,此时从正常客户的角度看来,服务器失去响应。 而在一次SCTP四路 握手中,INIT消息的接收端不必保存任何状态信息或者分配任何资源,这样就可防范SYN Flooding等DoS攻击。它在发送INIT-ACK消息时,采用了一种机制——“状态Cookie”,该Cookie具有发送端要建立自己状态所需 的全部信息。 SCTP产生一个状态Cookie的过程如下:
  9. 使用收到的INIT和发出的INIT- ACK块中的信息创建一个关联的TCB(传输控制块)。
  10. 在TCB中,将当前日期设为创建日期,将协议参数“有效Cookie时间”设为生存期间。
  11. 根据TCB,收集重建TCB所需的最小信息子集,将该子集和密钥产生一个MAC(信息认证编码)。
  12. 结合上述最小信息子集和MAC产生状态Cookie。
  13. 在发送完INIT ACK(包含状态Cookie参数)后,发送方必须删除TCB以及任何与新关联有关的本地资源。 INIT 和INIT-ACK都必须包含建立初始状态所需的参数:一组IP地址,保证可靠传输的初始TSN,每个被接收的SCTP包中必须含有的初始标签,每一端请 求发出的流数目和每一端能支持接收的流数目。交换完这些消息之后,INIT的发送端以COOKIE-ECHO消息的方式发送回状态Cookie。接收端根 据所接收到的COOKIE-ECHO中的状态Cookie,完整地重建自己的状态,并回送COOKIE- ACK来确认关联已建立。COOKIE-ECHO和COOKIE-ACK都可将用户数据消息绑定到各自的包中。 由此可见,采用以上这种 方式,即使接收再多的INIT消息, 接收端也没有任何资源的消耗:它既不分配任何系统资源,也不保存此次新关联的状态,它只是把相应重建状态所用的状态Cookie作为参数,包含在每一个回 送的INIT-ACK消息中,最后该状态Cookie会被COOKIE-ECHO消息发送回来。 2.2 SCTP数据交换 在两个SCTP主机间的正常数据交换。SCTP主机发送SACK块,用来确认每一个收到的SCTP包。因为SACK能完整地描述接收端的状态,因此,依据SACK,发送端能做出重传判决。SCTP支持类似于TCP中的快速重传和time-out重传算法。 对于数据包丢失发现,SCTP和TCP采用截然不同的机制:当TCP发现接收序号有缺口时,会等到该缺口被填上后,才发送序列号高于丢失数据包的数据。然而,SCTP即使发现接收序号有缺口或顺序错乱,仍会发送后面的数据。 3.3 SCTP关闭关联 作 为面向连接的传输协议,SCTP也运用三路握手来关闭一个关联,但与TCP有一点不同:一个TCP终端在“关联关闭”的过程中能够保持连接开启,并从对端 接收新的数据,而SCTP不支持TCP的这种“半关闭”状态。 1. 主机A发出“关闭”(SHUTDOWN)块来终止与主机B的关联,主机A进入“SHUTDOWN- PENDING”状态,对应的动作是:不再接受上层应用的数据,只发送队列中剩余的数据,进入“SHUTDOWN-SENT”状态。
  14. 主机B一旦接收到“关闭”块,就进入“SHUTDOWN-RECEIVED”状态,同主机A一样,不再接受上层应用的数据,只发送队列中剩余的数据。
  15. 主机A再次发送“关闭”块,通知主机 B所发送的剩余数据已到达,并且重申了关联正在关闭。
  16. 当第二次收到“关闭”块时,主机B发送“确认关闭”块。
  17. 主机A随后发送“关闭结束”块,完成本次关联的关闭。 4 结束语 SCTP 是为传输信令业务流而开发的,但它所具有的一些优于TCP的先进协议机制,如选择性确认、快速重传、无序递交等,使它又满足高性能传输的需求,这会给它带 来更为宽广的应用需求。目前,已有各种操作系统支持SCTP, 如Linux、AIX、Solaris、Windows、FressBSD。在不同协议实现间的互操作性测试的成功,揭示着SCTP正走向商业产品之路。 IEFT正在致力于SCTP进一步的修改,使其更能满足下一代应用的需求,例如支持IPv6地址,解决对端对于IPv6的site-local、link-local地址无连通性的问题,以及在已存在的关联中动态地增加或删除IP地址而无需重启该关联。 此外,在第三代移动通信中,SCTP可作为信令承载层的备选方案之一,它的应用及其性能评估也有待研究。

分类: Network Programming

绿色通道: 好文要顶 关注我 收藏该文与我联系

李大嘴 关注 - 7 粉丝 - 27

+加关注

0

0 (请您对文章做出评价)

« 上一篇:TCP状态转换图 » 下一篇:MTU & MSS 详解记录