UNP——Chapter 2:传输层:TCP、UDP和SCTP

来源:互联网 发布:寒武纪年手机版软件 编辑:程序博客网 时间:2024/06/07 20:03

本章阐述相关主题:

  1. TCP的三路握手
  2. TCP的连接终止序列
  3. TCP的TIME_WAIT状态
  4. SCTP的四路握手
  5. SCTP的连接终止
  6. 由套接字层提供的TCP、UDP和SCTP缓冲机制

2.1 概述

TCP : 传输控制协议(Transmission Control Protocol)。

  • 面向连接、可靠、全双工、字节流。关心确认、超时和重传。
  • TCP没有任何记录边界。
  • TCP含有用于动态估算客户和服务器之间的往返时间(round-trip time,RTT)的算法。
  • TCP提供流量控制(flow Control)。通告窗口(advertised window):总是告知对端在任何时刻它一次能够从对端接收多少字节的数据。
  • 全双工(full-duplex):意味着在一个给定的连接上,应用可以在任何时刻在进出两个方向上既发送数据又接收数据。(可转单工连接)

UDP: 用户数据报协议(User Datagram Protocol)。

  • 无连接、数据报。不能保证数据最终到达目的地。
  • 每个UDP数据报都有一个长度。
  • UDP可以是全双工的。

SCTP: 流控制传输协议(Stream Control Transmission Protocol)。

  • 可靠、全双工
  • 面向消息(message-oriented):它提供各个记录的按序递送服务。与UDP一样,由发送端写入的每条记录的长度随数据一道传递给接收端应用。提供消息边界(维护来自应用层的记录边界)
  • 关联(SCTP是多宿(multihoming)的,从而每个关联的两端均涉及一组IP地址和一个端口号)。多宿特性,使得单个SCTP端点能够支持多个IP地址。
  • SCTP能够在所连接的端点之间提供多个流,每个流各自可靠地按序递送消息。一个流上某个消息的丢失不会阻塞同一关联其他流上消息的投递。
  • 提供将头端阻塞(head-of-line blocking)减少到最小的一种方法。

ICMP: 网际控制消息协议(Internet Control Message Protocol)。

  • 处理在路由器和主机之间流通的错误和控制消息。
  • ping和traceroute程序使用ICMP。

IGMP: 网际组管理协议(Internet Group Management Protocol)。用于多播。
ARP: 地址解析协议(Address Resolution Protocol)。

  • ARP把一个IPv4地址映射成一个硬件地址。

RARP: 反向地址解析协议(Reverse Address Resolution Protocol)。

  • RARP把一个硬件地址映射成一个IPv4地址。
  • 有时用于无盘节点的引导。

BPF: BSD分组过滤器(BSD packet filter)。

  • 该接口提供对数据链路层的访问能力。

DLPI: 数据链路提供者接口(datalink provider interface)。

  • 该接口也提供对数据链路层的访问能力。

2.2 TCP连接的建立和终止

三路握手

三路握手

每一个SYN可以含有多个TCP选项。

  • MSS选项:发送SYN的TCP一端使用本选项通告对端它的最大分节大小(Maximum Segment Size)。TCP_MAXSEG套接字选项。
  • 窗口规模选项。通告窗口。SO_RCVBUF套接字选项。
  • 时间戳选项。

TCP连接终止

TCP连接终止

TCP状态转换图

TCP状态转换图

TCP连接的分组交换

TCP连接的分组交换

服务器对客户请求的确认是伴随其应答发送的。这种做法称为捎带(piggybacking)。通常在服务器处理请求并产生应答的时间少于200ms时发生,否则先是确认后是应答。

2.3 TIME_WAIT状态

执行主动关闭的那端,停留在这个状态的持续时间是最长分节生命期(maximum segment lifetime, MSL)的两倍,即2MSL。MSL是任何IP数据报能够在因特网中存活的最长时间。

TIME_WAIT状态有两个存在的理由:
(1)可靠地实现TCP全双工连接的终止;
(2)允许老的重复分节在网络中消逝。

第一个理由:图2-5中,假设最终的ACK丢失了。服务器将重新发送它的最终那个FIN,因此客户必须维护状态消息,以允许它重新发送最终那个ACK。要是客户不维护状态消息,它将响应以一个RST,该分节将被服务器解释成一个错误。如果TCP打算执行所有必要的工作以彻底终止某个连接上两个方向的数据流(即全双工关闭),那么它必须正确处理连接终止序列4个分节中任何一个丢失的情况。

为什么执行主动关闭的那一端是处于TIME_WAIT状态的那一端:-->因为可能不得不重传最终那个ACK的就是那一端。

第二个理由:假设我们关闭这个连接,过一段时间后在相同的IP地址和端口号之间建立另一个连接。后一个连接称为前一个连接的化身(incarnation),因为他们IP地址和端口号都相同。TCP必须防止某个连接的老的重复分组在该连接已终止后再现,从而被误解成属于同一个连接的某个新的化身。为做到这一点,TCP将不给处于TIME_WAIT状态的连接发起新的化身。这样我们就能保证每成功建立一个TCP连接时,来自该连接先前化身的老的重复分组都已经在网络中消逝了。

2.4 SCTP关联的建立和终止

SCTP四路握手:

SCTP四路握手

(1)客户SCTP发送一个INIT消息(初始化),该消息告诉服务器客户的IP地址清单、初始化序列号、用于标识本关联中所有分组的起始标记、客户请求的外出流的数目以及客户能够支持的外来流的数目。
(2)服务器以一个INIT ACK消息确认客户的INIT消息,其中含有服务器的IP地址清单、初始化序列号、起始标记、服务器请求的外出流的数目、服务器能够支持的外来流的数目以及一个状态cookie。状态cookie包含服务器用于确信本关联有效所需的所有状态,它是数字化签名过的,以确保其有效性。
(3)客户以一个COOKIE ECHO消息回射服务器的状态cookie。该消息可能在同一分组中还捆绑了用户数据。
(4)服务器以一个COOKIE ACK消息确认客户回射的cookie是正确的,于是本关联建立。该消息可能在同一分组中还捆绑了用户数据。

SCTP与TCP差别:差别主要在于作为SCTP整体一部分的cookie的生成。

INIT承载一个验证标记Ta和一个初始化序列号J。在关联的有效期内,验证标记Ta必须在对端发送的每个分组中出现。初始序列号J用作承载用户数据的DATA块的起始序列号。对端也在INIT ACK中承载一个验证标记Tz,在关联有效期内,验证标记Tz也必须在其发送的每个分组中出现。除了验证标记Tz和初始序列号K外,INIT的接收端还在作为响应的INIT ACK中提供一个cookie C。该cookie包含设置SCTP关联所需的所有状态,这样服务器的SCTP栈就不必保存所关联客户的有关信息。

四路握手过程结束时,两端各自选择一个主目的地址(primary destination address)。

关联终止:

关联终止

(1)不允许“半关闭”的关联。当一端关闭某个关联,另一端必须停止发送新的数据。
(2)没有TIME_WAIT状态,因为SCTP使用了验证标记。由来自旧连接的块携带的验证标记对于新连接来说是不正确的。

SCTP状态转换图:

SCTP状态转换图

分组交换:

分组交换

SCTP分组中信息的单位称为(chunk)。块是自描述的,包含一个块类型、若干个块标记和一个块长度。

2.5 缓冲区大小及限制

限制:

  • IPv4数据报的最大大小是65535字节,包括IPv4首部。总长度字段占16位。
  • IPv6数据报的最大大小是65575字节,包括IPv6首部(40字节)和净荷长字段(16位)。
  • MTU(maximum transmission unit,最大传输单元)。
  • IPv4要求的最小链路MTU是68字节。这允许最大的IPv4首部(包括20字节的固定长度部分和最多40字节的选项部分)拼接最小的片段(IPv4首部中片段偏移字段以8个字节为单位)。
  • IPv6要求的最小链路MTU是1280字节。
  • 在两个主机之间的路径中最小的MTU称为路径MTU(path MTU)。
  • 当送出的IP数据报的大小超过相应链路的MTU,IPv4和IPv6都将执行分片(fragmentation)。
  • IPv4主机对其产生的数据报执行分片,IPv4路由器则对转发的数据报执行分片
  • IPv6只有主机对其产生的数据报执行分片,IPv6路由器不对其转发的数据报执行分片
  • IPv4首部有“不分片”(don’t fragment)位,即DF位。
  • IPv6数据报隐含一个DF位。

缓冲区:

TCP输出

  • 每一个TCP套接字有一个发送缓冲区,可以使用SO_SNDBUF套接字选项来更改该缓冲区的大小。
  • 当某个应用进程调用write时,内核从该应用进程的缓冲区中复制所有数据到所写套接字的发送缓冲区。若套接字的发送缓冲区容不下,该应用进程将被投入睡眠。假设该套接字是阻塞的,内核将不从write系统调用返回,直到应用进程缓冲区中的所有数据都复制到套接字发送缓冲区。因此,write系统调用成功返回仅仅表示:我们可以使用原来的应用进程缓冲区,并不表明对端已接收到数据。

write系统调用

  • 收到对端的ACK,本端TCP才能从套接字发送缓冲区中丢弃已确认的数据。TCP必须为已发送的数据保留一个副本,直到它被对端确认为止。
  • 每个数据链路都有一个输出队列。如果该队列已满,那么新到的分组将被丢弃,并沿协议栈线上返回错误。并以后重传相应分节。

UDP输出:

  • UDP没有真正的套接字发送缓冲区,通常被复制到某种格式的一个内核缓冲区中,该数据被发送之后,这个副本就被数据链路层丢弃了。
  • UDP套接字的write调用成功返回表示:所写的数据报或其所有分片已被加入数据链路层的输出队列。若没有足够空间,内核通常返回一个ENOBUFS错误。

SCTP输出:

  • 与TCP类似。
  • 需要注意的是只有收到失序的分组时才会可能会发送SACK(选择性确认)。本端SCTP必须等待SACK,在累积确认点超过已发送的数据后,才可以从套接字缓冲区中删除数据。
  • 选择性确认只是表明由选择性确认消息反映的序列号所涵盖的数据已被接收。
  • 累积确认表明由累积确认消息中的序列号指示的所有以前的数据都已被接收。

2.6 常见协议使用

常见协议使用

1 0
原创粉丝点击