UNIX网络编程-第2章-2.1-2.10

来源:互联网 发布:windows仿mac dock栏 编辑:程序博客网 时间:2024/06/01 22:00

第二章 传输层:TCP、UDP、和SCTP

2.1 概述

本章的焦点是传输层,包括TCP,UDP和SCTP。本章阐述以下相关主题:TCP的三路握手、TCP的连接终止序列、TCP的TIME_WAIT状态;SCTP的四路握手、和SCTP的连接终止;套接字层提供的TCP,UDP,SCTP的缓冲机制。

2.2 总图

TCP/IP协议描述总图
BPF : 伯克利分组过滤器,该接口提供对于数据链路层的访问能力,通常可以在源自Berkerly的内核中找到。
DLPI : 数据链路提供者接口,该接口也提供对于数据链路层的访问能力,通常随SVR4内核提供。
IGMP : 用于多播,在IPv4中可选。
ICMPv6: ICMPv6综合了ICMPv4,IGMP,和ARP的功能。

2.3 用户数据报协议(UDP)

特点:UDP不保证UDP数据包会到达其最终目的地,不保证各个数据包按序达到,不保证不重复到达,所有可靠性交给应用层保证。UDP数据包拥有记录边界,如果一个数据包正确的到达其目的地,那么该数据报的长度将随数据一起传递给接收短应用进程。而TCP是一个字节流协议,没有任何记录边界。

2.4 传输控制协议(TCP)

特点:面向链接,排序,支持重传,全双工
面向连接:TCP提供客户与服务器之间的连接,TCP客户首先与某个给定服务器建立一个连接,然后跨该连接与那个服务器交换数据,然后终止该链接。
TCP含有动态估算客户和服务器之间的往返时间RTT的算法。
提供流量控制:TCP总是告知对方在任何时刻他一次可以从对方接收多少字节的数据,这称为通告窗口。在任何时刻,该窗口指出接收缓冲区中当前可用空间的量,从而确保发送端发送的数据不会使得接收缓冲区溢出。该窗口时刻动态变化,当接收到TCP报文的时候,窗口减小,当TCP客户端读取报文的时候,该窗口增大。当TCP对应某个套接字的接收缓冲区已满,它必须等待应用从该缓冲区中读取数据,方能从对方接收数据。
因此,操作系统为每一个套接字保留一个窗口。

2.5 流量控制传输协议(SCTP)

特点:面向消息,可靠,排序,流量控制,全双工,多宿
面向消息:提供对各个记录的按序递送服务,与UDP一样,由发送端写入的每条记录的长度随数据一道传递给接收端应用。
多宿:SCTP能够在所链接的端点之间提供多个流,每个流各自可靠的按序递送消息。一个流上某个消息的丢失不会阻塞同一关联其他流上消息的递送。这种做法正好与TCP相反,TCP连接中若发生错误将会阻塞随后的数据传送直至错误被修复。

2.6 TCP连接的建立和终止

2.6.1 三路握手,TCP连接的建立过程:

(1)服务器必须做好准备,接受外来的连接。者通常通过调用socket,bind,和listen这三个函数来完成,我们称之为被动打开。
(2)客户通过connect发起主动连接,客户发送SYN分节通知服务器。该分节包括:发送数据的初始序列号。该分节不包含数据。该分节所在的IP数据包只包含一个IP首部,一个TCP首部,以及可能的TCP选项。
(3)服务器必须确认客户的SYN分节(发送ACK分节,响应客户端期望的发送数据的初始序列号的下一个序列号)。同时自己自己也发送一个SYN分节,它含有服务器在同一连接中发送的数据的初始序列。服务器在单个分节中完成对客户SYN的ACK以及发送自己的SYN。
(4)客户段发送对服务器的SYN的确认ACK分节,至此,客户端connect返回,服务器接受到来自对自己SYN分节的客户确认之后accept返回,三次握手完成,客户服务器TCP连接建立。
三路握手连接建立的图解:
TCP连接三次握手建立过程

2.6.2 TCP选项

TCP选项,每一个SYN分节可以有多个TCP选项:
MSS选项:该选项通告对方它的最大分节大小,即MSS,也就是它在本连接的每个TCP分节中愿意接受的最大数量。发送端使用接受端的MSS作为发送数据的最大分节大小。
窗口规模选项:TCP连接任何一端能够通告对端的最大窗口大小是65535,为了突破这个限制,可以使用TCP窗口规模选项。
时间戳选项:该选项可以防止失而复现的分组可能造成的数据损坏。

2.6.3 TCP连接终止

  TCP建立一个连接需要3个分节,终止一个连接需要4个分节。  (1)某个应用程序首先调用close,我们称该端执行主动关闭,该段的TCP于是发送一个FIN分节,表示数据发送完毕。  (2)接受这个FIN的对端执行被动关闭。这个FIN由TCP确认。他的接收也作为一个文件结束符传递给接收端应用进程(放在已排队等候该应用进程接收的任何其他数据之后),因为FIN的接受意味着接收端进程在相应连接上再无额外数据可接收。  (3)一段时间后,接收到这个文件结束符的应用进程调用close关闭它的套接字。这将导致它的TCP也发送一个FIN分节。  (4)接受这个最终FIN的原发送端TCP(即执行主动关闭的那一端确认这个FIN。

TCP连接终止的过程如下:
TCP连接的终止过程

2.6.4 TCP状态转换图

  在TCP整个生命周期中,客户端和服务器端一直处于不同的状态当中。  其状态转换图如下:

TCP连接客户端和服务器的状态转换图

2.6.5 观察分组

  观察分组的状态图如下:

TCP分组交换过程

2.7 TIME_WAIT状态

在TCP连接的状态转换图中,我们看到,执行主动关闭的客户端最后处于TIME_WAIT状态,并在该状态等待2MSL(最长分节生命期)。TIME_WATI状态有两个存在的理由:(1)可靠的实现TCP全双工连接的终止。(2)允许老的重复分节在网络中消逝。

TCP必须防止来自某个连接的老的重复的分组在该连接已经终止后再现,从而被误解成属于同一连接的某个新的化身。为做到这一点,TCP将不给处于TIME_WAIT状态的连接发起新的化身。既然TIME_WAIT状态的持续时间是MSL的两倍,这足以让某个方向上的分组最多存活MSL秒即被丢弃,另一个方向上的应答最多存活MSL秒也被丢弃。通过实施这个规则,我们就能够保证每成功建立一个TCP连接,接收到的数据报一定不是之前某个化身的老的分组。

2.8 SCTP关联的建立和终止

与TCP一样,SCTP也是面向连接的,因而也有关联建立与终止的过程,不过SCTP的握手过程不同与TCP的握手过程。

2.8.1 四路握手,SCTP关联的建立

  SCTP关联建立的过程如下:(1)服务器必须准备好接受外来的关联。这通常调用socket,bind和listen这3个函数来完成,称为被动打开。(2)客户通过connect调用或者发送一个隐式打开该关联的消息进行主动打开。在该过程中,客户SCTP发送一个INIT消息。该消息的作用是:    告知服务器客户的IP地址清单,初始序列号,用于标志本关联中所有分组的起始标记,客户请求的外出流的数目,以及客户能够支持的外来流的数目。(3)服务器发送INIT ACK分节确认客户INIT分节。INIT ACK分节中包含以下信息:    服务器的IP地址清单,初始序列号,用于标志本关联所有分组的起始标记,服务器请求的外出流数目,服务器能够支持的外来流的数目,以及一个状态cookie。该状态cookie的作用是:包含服务器用于确信本关联有效所需的所有状态,它是数字化签名过的,以确保其有效性。(4)客户以一个COOKIE ECHO分节,回射服务器的状态cookie。除COOKIE ECHO外,该消息可能在同一个分组中还捆绑了用户数据。(5)服务器以一个COOKIE ACK消息确认客户回射的cookie是正确的,本关联于是建立。该消息可能在同一个分组中还捆绑了用户数据。该四路握手建立的过程如下:

SCTP关联建立四路握手过程
SCTP的四路握手在很多方面类似与TCP的三路握手,差别主要在于作为SCTP整体一部分的cookie生产。INIT(随众多参数一起)承载一个验证标记Ta,和一个初始序列号J。在关联的有效期内,验证标记Ta必须在对端发送的每个分组中出现。初始序列号J用作承载用户数据DATA块的起始序列号。对端也在INIT ACK中承载一个验证标记Tz,在关联的有效期内,验证标记Tz也必须在其发送的每一个分组中出现。除了验证标记Tz和初始序号K外,INIT的接收端还在作为响应的INIT ACK中提供一个cookie C。该cookie包含设置本SCTP关联所需的所有状态,这样服务器的SCTP栈就不必保存所关联的有关信息。
在SCTP中使用四路握手是为了避免拒绝服务攻击。

2.8.2 关联终止

  当一端关闭某个关联的时候,另一端必须停止发送新的数据。关闭关联请求的接收端发送完已经排队的数据后,完成关联的关闭。  终止关联的过程如图示:

SCTP关联终止过程
SCTP没有类似与TIME_WAIT的状态,因为SCTP使用了标记验证,旧的分组的验证标记必然和某一连接的化身的标记不同,从而避免了TCP在TIME_WAIT状态保持整个连接的做法。

2.8.3 SCTP的状态转换过程如下:

SCTP状态转换转换过程

2.8.4 观察分组

  观察分组的分组交换过程如下:

SCTP分组交换过程

2.9 端口号

端口号分类如下:(1)众所周知的端口,由IANA管理,0-1023;(2)已登记端口,1024-49151;(3)临时端口,49152-65535;

注意,一个套接字对是一个四元组,唯一标志网络中的一台主机。

2.10 TCP端口号与并发服务器

0 0
原创粉丝点击