UNP第二章 TCP、UDP和SCTP

概述

本章的焦点是传输层,包括TCP、UDP和SCTP。TCP是一个复杂、可靠的字节流协议;UDP是一个简单的、不可靠的数据报协议。

用户数据报协议(UDP)–数据包

UDP是一个简单的传输层协议,应用进程往UDP套接字写入一个消息,该消息随后被封装到一个UDP数据报,该UDP数据报进而又被封装到一个IP数据报,然后发送到目的地。

传输控制协议(TCP)–流

TCP提供客户与服务器之间的连接。TCP客户先与某个给定服务器建立一个连接,再跨该连接与那个服务器交换数据,然后终止该连接。连接期间提供可靠性,例如,TCP向一段发送数据时,它要求对端返回一个确认。

动态估算往返时间RTT算法

字节关联序列号排序

假设一个应用写2048字节到一个TCP套接字,导致TCP发送2个分解:第一个分节所含数据的序列号为1~1024,第二个分节所含数据的序列号为1025-2048。分节必须按顺序达到接收方,若不然,则接收端TCP根据序列号重新排序,再把结果数据传递给应用。

流量控制

TCP总是告知对端在任何时刻它一次能够从对端接受多少字节的数据,这称为通告窗口。

全双工通信

建立在TCP连接上的应用可以在任何时刻既发送数据又接受数据。

流控制传输协议SCTP–消息

SCTP在客户和服务器之间提供关联,并像TCP那样给应用提供可靠性、排序、流量控制以及全双工的数据传送。关联:两个系统之间的一次通信,它可能因为SCTP支持多宿而涉及不止两个地址。与TCP不同,SCTP是面向消息的。

SCTP在所连接的端点之间提供多个流

一个流上某个消息的丢失不会阻塞同一关联上其他消息的投递。
对比TCP,TCP在单一字节流中任何位置的字节丢失都将阻塞该连接上其后所有数据的递送,直到该丢失被修复为止。

多宿特性

单个SCTP端点能够支持多个IP地址。一个端点可能有多个冗余的网络连接,从而增强应对网络故障的健壮性。

TCP连接的建立和终止

三次握手机制

  1. 服务器调用socket、bind和listen这三个函数准备好接受外来的连接,称之为被动打开passive open。
  2. 客户通过connect发起主动打开active open。服务器通过accept向客户机发挥确认。
  3. 客户机收到确认后,向服务器给出确认。

TCP选项

MSS选项:发送SYN的TCP一端使用本选项通告对端它的最大分节大小,即每个TCP分节中愿意接受的最大数据量(分节是TCP传送给IP的数据单元)。
窗口规模选项:一次能够从对端接收对少字节的数据。
时间戳选项:防止数据损坏。

TCP连接终止

  1. 某个应用首先调用close,我们称该端执行主动关闭。该端此时的状态为TIME_WAIT。该端的TCP发送一个FIN分节,表示数据传送完毕。
  2. 接收到这个FIN的对端执行被动关闭,并发送一个文件结束符(end-of-file)传递给接收端应用。
  3. 一段时间后,接收到这个EOF的对端调用close关闭它的套接字,并导致它的TCP也发送一个FIN。

一段时间:这段时间内,执行主动关闭和被动关闭双方之间进行数据流动是可能的,这称为半关闭(half-close)。
- 接收到最终FIN的原发送端TCP确认这个FIN。

TIME_WAIT状态

最长分节生命期MSL:任何IP数据报能够在因特网中存活的最长时间。
执行主动关闭的应用进程端经历TIME_WAIT状态,并在这个状态停留两倍的MSL。
迷途的重复分组(漫游的重复分组):路由器崩溃造成数据报不能达到目的地,等到路由器回复正常时又能到达目的地。

SCTP关联的建立和终止

SCTP的建立

  • 服务器通过调用socket、bind和listen来做好接受外来关联的准备。
  • 客户通过调用connect或者发送一个隐式打开该关联的消息进行主动打开。这使得客户SCTP发送一个INIT消息,该消息告诉服务器客户的IP地址清单、初始序列号、用于标识本关联中所有分组的起始标记、客户请求的外出流的数目以及客户能够支持的外来流的数目。(因为SCTP在建立连接的端点之间提供多个流)
  • 服务器回送一个INIT ACK消息确认客户的INIT消息,其中含有服务器的IP地址清单、初始序列号、起始标记、服务器请求的外出流数目、服务器能够支持的外来流的数目以及一个状态cookie

    cookie:包含服务器用于确信本关联有效所需的所有状态。

  • 客户以一个COOKIE ECHO消息回射服务器的状态cookie。

  • 服务器以一个COOKIE ACK消息确认客户回射的服务器状态cookie是正确的。

关联终止

SCTP不像TCP那样允许“半关闭”的关联。

端口号

多个进程可能同时使用TCP、UDP和SCTP这三种传输层协议中的任何一种,这三种协议都使用16位整数的端口号来区分这些进程。端口号被划分成以下3段:
众所周知的端口为0~1023:这些端口由IANA分配和控制,例如端口号80被赋予Web服务器。
已登记的端口为1024~49151:不受IANA控制,
动态或私用端口为49152~65535:临时端口

套接字对

一个TCP连接的套接字对是一个定义该连接的两个端点的四元组:本地IP地址、本地TCP端口号、外地IP地址、外地TCP端口号。
套接字对唯一标识一个网络上的某个TCP连接;套接字标识特定TCP连接中的某个端点。bind()函数要求应用程序给TCP、UDP或SCTP套接字指定本地IP地址和本地端口号。

TCP端口号与并发服务器

并发服务器中的主服务器通过循环派生一个子进程来处理每个新的连接。
套接字对用{本地IP:本地端口,外地IP:外地端口}来描述。
典型示例:服务器主机IP地址为12.106.32.254和192.168.42.1。现在服务器有一个套接字对{#:21,#:#},服务器在任意本地IP(第一个#)的端口21上等待连接请求,外地IP地址和外地端口号都未指定,我们用#:#来表示。我们称这个套接字对为监听套接字
这里指定本地IP地址的星号称为通配符。如果运行服务器的主机是多宿的(如本例),服务器可以指定它只接受到达某个特定本地接口的外来连接,即在这里将#替换为指定的IP地址。通配地址通过在调用bind之前把套接字地址结构中的IP地址字段设置成INADDR_ANY来指定。
假设客户主机上有一个客户请求206.168.112.219连接到服务器,它对服务器的IP地址之一12.106.32.254执行主动打开。我们假设本例中客户主机的TCP为此选择的临时端口为1500,则服务器接受这个客户的连接时,它通过fork调用创建一个自身的副本,并将套接字对改为{12.106.32.254:21, 206.112.219:1500},此时套接字对不再是监听套接字,而成为了已连接套接字。
注意:TCP必须查看套接字对的4个元素才能确定由哪个端点接受某个到达的分节。

缓冲区大小及限制

  • IPv4数据报的最大长度为65535B,包括IPv4首部
  • IPv6数据报的最大长度为65575B,包括40字节的IPv6首部
  • 许多网络有一个可由硬件规定的MTU(最大传输单元)。以太网的MTU是1500字节。IPv4要求的最小链路MTU是68字节,IPv6要求的最小链路MTU为1280字节
  • 在两个主机之间的最小的MTU成为路径MTU,1500字节的以太网MTU是当今常见的路径MTU。
  • IPv4和IPv6都定义了最小重组缓冲区大小:IPv4或IPv6的任何实现都必须保证支持的最小数据报大小。
  • TCP有一个MSS(最大分节大小),用于向对端TCP通告对端在每个分节中能发送的最大TCP数据量。

TCP输出

  • 当某个应用进程调用write时,内核将数据从该应用进程的缓冲区写到套接字的发送缓冲区。
  • 如果该套接字的发送缓冲区容不下该应用进程的所有数据,内核不会从write调用返回,而是一直等到所有应用进程数据写入套接字发送缓冲区。因此,这里write调用成功并不意味着对端TCP或进程已经接收到数据,而只是数据写入套接字发送缓冲区成功。
  • 这一段的TCP提取套接字发送缓冲区的数据并把它发送给对端TCP。对端TCP必须确认收到的数据,发送端TCP必须为发送的套接字保存一个副本,直到它被对端确认为止。

这点与UDP不同,UDP无需返回确认ACK,而且UDP不保存已发送数据的副本,因此UDP是不可靠的,但这也造成了TCP数据的过大。

  • 接收端TCP以MSS大小或更小的块把数据传送给数据链路层的IP协议,并为每个数据块封装一个TCP首部以构成TCP分节。IP为每个TCP分节封装一个IP首部以构成IP数据报,并按照其目的IP地址查找路由表相关以确定外出接口,然后把数据报传递给相应的数据链路。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值