你的位置:首页 > 信息动态 > 新闻中心
信息动态
联系我们

传输层协议TCP简介

2021/12/19 2:49:08

引言

UDP是一种简单的协议,但是也有着重要的应用,像Client-Server交互等,以及多媒体传输。但是对于大部分的互联网应用,可靠以及有序的传输是必要的。UDP不能提供这种可靠的传输模式,所以另一种协议需要来不足这个空缺,即:TCP。TCP是互联网一种主要的协议。

1. Introduction to TCP

TCP(Transmission Control Protocol) 是一种可以在不可靠网络上提供可靠的端对端字节流传输的协议。单个网络与互联网是不一样的,因为不同互联的网络可能有不同的拓扑,带宽,延迟,包的大小以及其他参数。TCP主要用来动态地适应互联网的一些特性,让传输在多种失败的可能性中变得可靠(robust)。

TCP协议的具体内容可以在RFC_793中查看。每个支持TCP协议的设备都有一个 TCP transport entity(a library procedure, a user process, part of the kernel)。它管理TCP数据流以及与IP层的接口。TCP entity接受来自本地进程的用户数据流,将它们切片(不超过64KB, 通常为1460B,受限于Ethernet 帧的大小以及Ethernet头和IP头占用的大小),并将每个片段作为分离的IP数据报进行传输。当包含TCP数据的数据报到达对端设备后,这些数据将会转发给一个TCP entity进行处理。这个TCP entity将会按照顺序重构数据。

IP层并不会对数据报的传输给予一定的保障,也不会指明数据报的传输速度。这些都是由TCP足够快的发送数据来尽可能占用传输资源,但同时确保不会造成拥塞。TCP entity也会进行超时重传一些没有被正确传输到对端的数据。数据报到达目的地后可能是乱序的,TCP会将这些数据进行按序拼接,确保这些数据顺序与原始数据顺序一致。简而言之,TCP是一种为应用层程序提供可靠传输特性的协议,当然这些特性在IP层是不会被提供的。

2. TCP服务模型

TCP服务由发送者与接受者创建的end points(sockets,套接字)获得。每个套接字有一个套接字地址包含主机的IP地址以及一个16-bit的端口(Port,TSAP)。获取TCP服务,连接必须要在发送端设备socket以及接收端设备socket之间建立。一个套接字可能同时用于多个连接。连接由两端的socket识别码区分,即:(socket1,socket2)。没有使用其他的虚拟电路码或者其他识别码。

2.1 端口划分及定义:

端口号小于1024的端口是well-known端口,这些都被保留用于标准的一些服务,并只能由最高权限的用户(在Unix中的root)开启。例如:所有想要获取远端主机上的邮件的进程需要连接到这个主机的143端口,与IMAP守护进程进行沟通。

以下为 部分well-known端口

PortProtocolUse
20,21FTPFile transfer
22SSHRemote login, replacement for Telnet
25SMTPEmail
80HTTPWorld Wide Web
110POP-3Remote email access
143IMAPRemote email access
443HTTPSSecure Web(HTTP over SSL/TLS)
543RTSPMedia player control
631IPPPrinter sharing

从1024到49151这些端口可以与IANA注册给一些普通权限的用户使用,但是应用一般会选择它们自己的端口。例如: BitTorrent peer-to-peer 文件共享应用使用6881-6887端口,也可能运行在其他端口上。

21端口可能在设备启动时就绑定到了FTP守护进程上,22端口同样绑定到SSH守护进程。但是这样做会使内容变得混乱,并且大部分时候这些守护进程处于空闲状态。相反,可以通过单个守护进行 inetd(Unix 中的 Internet Daemon)绑定多个端口,等待请求的用户连接。当有请求时,inetd会fork一个新的进程并在里边运行适当的守护进行,让这个进程处理用户的请求。这样,除了inetd以外的守护进程只有在工作的时候处于激活状态。Inetd通过配置文件学习某个请求到达后该使用那个端口。系统管理员可以设定始终开启某个频繁使用的daemon,其他的daemons则由inetd负责。

所有的TCP连接都是全双工的点对点连接。全双工意味着双向的数据传输可以同时进行。点对点意味着每个连接都仅对应两个节点。TCP不支持多播以及广播

2.2 传输模式:

一个TCP连接是一个字节流(byte stream),不是消息流(message stream)。例如: 发送进程处理4个512-byte写片段给TCP流,这些数据将可能以四个512-byte chunks发送到接收端,也可能是两个1024-byte chunks,也可能是一个2048-byte chunk。接收端则不可能检测到这个消息被分为多大的字节块进行传输的。

2.3 优先传输:

当一个应用将数据传给TCP entity后,TCP可能立即传输,也可能缓存这些数据并等收集到一定大小后一次性传输。当然有些数据可能需要立即发送,这时TCP有一个 PUSH flag将会出现在包内,PUSH flag本用于告诉TCP entity不要延迟传输这个数据包。但是应用不能在发送数据时逐个数据包设定PUSH flag。相反,不同的操作系统有不同的选择去加速传输(TCP_NODELAY in Windows and Linux)。

2.4 紧急传输:

还有一个TCP服务几乎很少用到,urgent data。当一个应用有较高权限时,数据需要及时传输,例如:CTRL-C 中断一个已经开始的远程计算任务,发送应用可以添加一些控制信息在数据流中,伴随着URGENT flag转给TCP entity。这个event将会导致TCP停止积累数据并立即传输该连接的所有数据。

3. TCP协议

TCP的一个特征为,每个传输的字节都有与其对应的序列号(sequence number,32-bit)。这个长度的序列号确保了在足够长一段时间内不会复用之前使用过的序列号。单独的32-bit sequence number在用于数据包中指示单向滑动窗口的位置(siding windows)。

3.1 Segment size

发送端与接收端的TCP entity以segment为单位交换数据。一个TCP segment包含20-byte的头部(加可选的部分),payload部分可以为0或者要传输的数据。TCP software决定了segments应该是多大。同时也可以积累一定量的数据后合并传输,或者将一个较长的数据片段分离后传输。有两个限制segments大小的条件:① 每个segment,包含TCP头部,必须小于65515-byte的IP payload。② 每个链路都有一个MTU(Maximum Transfer Unit)。每个segment构成的IP数据报必须小于MTU来确保数据在数据链路层不会被分割。实际中,MTU一般在1500 bytes(Ethernet payload)。

3.2 重传机制

TCP entities使用的基本协议是滑动窗口协议(dynamic window size)。当发送者发送一个segment时,也会启动计时。当segment到达接收端,接收端TCP entity发送ACK(acknowlegement)。当接收端也有数据传输给发送端时,会将ACK捎带在数据segment中传输,否则单独传输ACK。如果发送者的计时器结束后没有收到ACK,则会重传该segment。

3.3 数据顺序

尽管该协议看上去简单,但是有时也会有一些微妙的segments。部分segments可能以乱序到达接收端,例如3072-4095可能到达了接收端但是没有被确认,因为2048-3071还没有收到。Segments也可能延迟到达导致发送端计时器超时进行重传,重传的部分与原始传输的segments比可能包含不同的字节范围,需要认真确认追踪哪些字节已经被正确地接收。每个字节在数据流中有它自己独一无二的offset(偏移值),所以顺序问题可以得到解决。

TCP segment Header(TCP头部)

每个TCP segment都有固定的前20bytes作为头部。Header之后可能是一些可选项功能,或者payload。若有options字段,则payload部分可以最高填充65535-20-20=65495 bytes。没有payload的segment也是可以被传输的,通常为ACK和控制消息。

TCP Header Format


    0                   1                   2                   3
    0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |          Source Port          |       Destination Port        |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                        Sequence Number                        |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                    Acknowledgment Number                      |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |  Data |           |U|A|P|R|S|F|                               |
   | Offset| Reserved  |R|C|S|S|Y|I|            Window             |
   |       |           |G|K|H|T|N|N|                               |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |           Checksum            |         Urgent Pointer        |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                    Options                    |    Padding    |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                             data                              |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

                            TCP Header Format

          Note that one tick mark represents one bit position.

Source portDestination port确认在本地的唯一连接接口。TCP port加主机IP地址构成一个48-bit的唯一end point。源端与目的端end points合起来识别一条唯一的连接。连接识别者为一个五元组,因为包含五条关键信息:the protocol(TCP), Source IP and source port, Destination IP and destination port。
Sequence NumberAcknowledgement number有其自己的作用。ACK number是下一个要接收字节的序号,不是接收到的最后一个字节的序号。ACK是一个累积确认的字段,当收到较多的segments后,若每个segment都正确接收,则只回复下一个想要接收字节的序号。
URG=1,该segment为urgent data。
SYN用于建立连接。
SYN=1,ACK=0,请求建立连接。
SYN=1,ACK=1,同意建立连接。
FIN用于释放连接。释放连接过程同时使用SYN和FIN字段确保释放过程以正确顺序处理。
Window size为0也是可以的,当接收端没有能力处理当前收到的数据时,Window size被置0,等处理完之前的数据后再次发送ACK,此时包含一个非零的window size。