传输层Transport layer TCP, since 2020-08-05

TCP, Transmission Control Protocol

(2020.08.07)
TCP被称为面向连接的(connection-oriented),这是因为一个进程可以向另一个进程发送数据之前,两个进程需要先握手,即他们开始互相发送预备报文段,以确保建立数据连接的参数。

TCP是逻辑连接,其共同状态仅保存在两个通信端系统的TCP程序中。而端系统之间的网络元素不会维持TCP的连接状态。中间路由器对TCP完全视而不见,他们只看到数据报,而非连接。

通信特点
全双工(full-duplex service),处在不同主机的进程A和进程B之间存在一条连接,数据可以同时从A流向B和从B流向A。
点对点(point-to-point),在单个发送方和单个接收方之间的连接。

服务器进程和客户进程
发起连接的进程称为客户进程,另一个称为服务器进程。
(2020.08.08)
数据一旦被送进socket,就由客户TCP控制了,TCP将数据放在一个数据缓存(send buffer)里(C/S两端都有),该缓存也是三次握手时数据存放处。TCP会从缓存中取出一块数据,传递给网络层。

TCP首部+客户数据=TCP报文段(TCP segment)

TCP从send buffer中取出并放入报文段中数据的数据量受限于最大报文段长度(maximum segment size, MSS),其根据最初确定的由本地主机发送的最大链路层帧长度(即最大传输单元Maximum transmission unit, MTU)来设置。以太网和PPP链路都有1500字节的MTU,考虑到TCP/IP首部一般是40字节(TCP首部20字节),TCP报文段中数据长度典型值是1460字节。注意到这里的MSS指的是TCP报文段中来自应用层的数据的最大长度。

TCP连接的组成
一台主机上的缓存、变量和连接进程的socket,以及另一台主机上的缓存、变量、socket。

TCP报文段的结构

首部+数据字段。当TCP发送一个大文件,比如图片,TCP通常将该文件划分成长度为MSS的若干,除最后一块,其他的都是MSS长度。而Telnet这样的应用,数据字段只有一个字节长,也就是其TCP一般只有21个字节的长度。

TCP首部的构成

典型长度:20字节/160bits(选项字段为空时)
源端口号:16bits
目的端口号:16bits
序号(seq num):32bits
确认号(acknowledgment num):32bits
接收窗口(receive window field):16bits,用于流量控制,指示接收方愿意接收的字节数量
首部长度(header length field):4bits,以32bits的字为长度的TCP首部长度
选项字段(options):可选和变长
标志字段(flag field):6bits,ACK/RST/SYN/FIN/PSH/URG

序号和确认号

序号建立在传送的字节流之上而非报文段的序列值上,the sequence number for a segment是报文段首字节的字节流编号。比如一个待发送的文件共10,000个字节,每个TCP的报文段发送1,000个,则第一个报文段的序号是0,第二个序号是1,000,以此类推。该序号是字节的编号,并用于给报文段编号。
上面的例子中假设初始序号是0,在实际应用中收发两方随机选择初始序号。
确认号略复杂。主机A和B之间建立TCP通信,主机A填充进报文段的确认号是A期望从B收到的下一个字节的序号

往返时间的估计和超时

报文段的样本RTT(SampleRTT)是报文段被发出(交给IP)到对该报文段的确认被收到之间的时间量。仅为一个已经发送的但目前尚未被确认的报文段估计SRTT,从而产生一个接近每个RTT的新SRTT值;不为已经被重传的报文段计算SRTT;仅为传输一次的报文段测量SRTT。

由于网络环境变化,比如路由器的拥塞和端负载的变化,SRTT并不都是典型的。TCP会维持一个SRTT的均值(EstimatedRTT),并根据下面公式计算ERTT
EstimatedRTT = (1-\alpha) \cdot EstimatedRTT + \alpha \cdot SampleRTT
其中的推荐值\alpha=0.125。该指数加权移动平均值(Exponential Weighted Moving Average, EWMA)赋予最近样本的权值要高于旧样本的权值,因越近的样本能更好的反应网络的拥塞状态。

此外,RTT的标准差DevRTT用于估算SRTT偏离ERTT的程度:
DevRTT= (1-\beta)\cdot DevRTT +\beta\cdot|SampleRTT-EstimatedRTT|
推荐值\beta = 0.25

设置和管理重传超时间隔

超时间隔应该大于等于ERTT,否则造成不必要的重传。但也不该比ERTT大很多,导致数据传输时延大。当SRTT波动大时,间隔大些,波动小时,间隔小些。
TimeoutInterval = EstimatedRTT + 4 \cdot DevRTT
初始推荐值TimeoutInterval = 1s,当出现超时候翻倍。只要收到报文就更新ERTT,并根据公式重算TimeoutInterval。
(2020.08.09 Sat)
定时器
定时器的管理需要相当大的开销,因此[RFC 6298]推荐仅使用单一的重传定时器,即便有多个已发送但未被确认的报文段。

(2020.08.09 Sat)
TCP中发送方相关的三个主要动作

  1. 从上层接收待发送的数据
  2. 定时器超时
  3. 收到ACK

发送方对这些主要动作的反馈参考可靠数据传输的部分。

超时间隔的选取
每当超时事件发生,TCP重传具有最小序号的未被确认的报文段。只是每次TCP重传是都会将下一次的超时间隔设为先前值的两倍,而不是用从EstimatedRTT和DevRTT推算的值。然而每当定时器遇到另外两个事件,即ACK和上层数据,定时器的启动TimeoutInterval由最近的ERTT和DRTT推算得到。

流量控制(flow-control service)

TCP两侧的主机都有接收缓存。流量控制服务用于消除sndr使rcvr缓存溢出的可能性。fcs因此是一个速度匹配服务,即sndr的发送速率和rcvr应用程序的读取速率相匹配。
TCP让sndr维护一个接收窗口(receive window)的变量来提供流量控制,即rw用于给sndr一个指示-该sndr还有多少可用的缓存空间。TCP是全双工通信,两端的发送方都维护一个rw。分析一种情况,主机A通过TCP向B发送一个大文件,B为该连接分配一个接收缓存,用RcvBuffer来表示。B的应用进程从该缓存中读取数据。有如下变量

  • LastByteRead:B上的应用程序从缓存中读出的最后一个字节的编号
  • LastByteRcvd:从网络中到达且已经进入B的rw的最后一个字节的编号

缓存不许溢出,故有LastByteRcvd-LastByteRead\le RcvBuffer接收窗口用rwnd表示,缓存可用空间数量(即空闲的空间数量)表示为rwnd = RcvBuffer-[LastByteRcvd-LastByteRead]
主机A需要跟踪另外两个变量,LastByteSent和LastByteAcked,对A来说有LastByteSnent-LastByteAcked\leq rwnd
一个特例,当B的接收缓存满,rwnd=0,假设此时B没有任何数据要发送给A。考虑到TCP并不向A发送带有rwnd的新报文段, 而事实上TCP仅当有数据或去人要发时才会发送报文段给A。导致A不知道B的接收缓存有新空间,A被阻塞不能在发送数据。解决方案,TCP规范要求,B的接收窗口为0时,A继续发送只有一个字节数据的报文段,这些报文段将会被接收方确认,最终缓存开始清空,且确认报文段将包含一个非0的rwnd值。

TCP连接管理

(2020.08.05)
TCP建立过程中三个握手(three-way handshake)的作用

  • 第一次发送by sndr,不含应用层数据
  • 第二次发送by rcvr,rcvr确认了s ndr的发送能力和rcvr的接收能力
  • 第三次发送by sndr,sndr确认了sndr的发送能力和接收能力,确认rcvr的接收能力和发送能力。rcvr接收到第三次发送则确认了rcvr的发送能力和sndr的接收能力。

三次发送,sndr/rcvr双方各自确认了自身和对方的接收能力和发送能力。握手完成便可建立连接。
(2020.08.07)
前两次握手的报文段不承载"有效载荷",也就是不包含应用层数据,第三个握手可以承载应用层数据。

(2020.08.09 Sat)

  • 第一步发送的报文段中,SYN比特被设置为1,因此该报文段被称为SYN报文段。客户会随机的选择一个初始序号(client_isn),放在该报文段的序号字段中。即SYN=1
  • 第二步,SYN报文段到达服务器,服务器为该TCP分配缓存和变量,向客户发送允许连接的报文段。该报文段中SYN=1,确认号字段被设置为client_isn+1,ACK=client_isn+1,(初始)序号为server_isn,seq=server_isn。该报文段称为SYNACK报文段(segment)。即SYN=1, ACK=client\_isn+1, seq = server\_isn
  • 第三步,客户收到SYNACK后为该TCP分配缓存和变量。可以包含应用层数据。ACK=server\_isn+1, SYN=0

完成这三步,C-S可通信,以后每一个报文段的SYN都设置为0。
结束连接
客户打算结束连接,发出一个特殊的报文段,设置其中的FIN=1。服务器接收到回复一个确认报文段,其中的FIN=1。服务器再次发送一个结束连接报文段,FIN=1。客户收到后发送ACK并释放占用的资源。

拥塞控制原理

IP层不会向两个端系统提供有关网络拥塞的反馈信息。略。

TCP拥塞控制

发送方sndr设定一个变量,拥塞窗口congestion windown,cwnd,它对TCP发送方能向网络中发送流量的速率进行了限制,并且和前面提到的接收窗口rwnd联合决定了发送速率,即LastByteSent-LastByteAcked\le min(cwnd,rwnd)
TCP如何感知它和目的地之间的拥塞
定义丢包事件:出现超时,或者受到来自接收方的3个冗余ACK。
一个丢失的报文段意味着拥塞,当报文丢失应该降低TCP sndr的发送速率。即减小cwnd。
一个确认报文段指示该网络正在向rcvr交付sndr的报文段,因此,当对先前未确认报文段的确认到达时,能够增加发送方的速率。
贷款检测。

拥塞控制算法

该算法分为三部分,1)慢启动,2)拥塞避免,3)快速恢复。其中的1和2是TCP强制部分。在收到ACK时,慢启动比拥塞避免更快的增加cwnd的长度。

慢启动

当一个TCP连接开始时,cwnd的值通常设为一个MSS的较小值。这使得发送速率大约为MSS/RTT。如MSS=500Bytes,RTT=200ms,则初始发送速率是20kbps。注意到此时带宽可能比初始速率快的多。慢启动(slow-start)状态,cwnd的值以一个MSS开始并且每当传输的报文段首次被确认就增加一个MSS。这一过程使得每过一个RTT,发送速率就翻番。初始速度慢,但ss阶段以指数增长。

结束ss的情况

  • 存在一个由超时指示的丢包时间,即拥塞,sndr将cwnd设为1并重新开始ss。还将第二个状态变量的值ssthresh设置为cwnd/2,即当检测到拥塞是将ssthresh设置为cwnd的一半。
  • 直接与ssthresh相关联。第一种情况设置ssthresh为cwnd的一半,当cwnd达到ssthresh,结束慢启动并且TCP转移到拥塞避免模式。
  • 检测到3个冗余ACK,TCP执行一种快速重传。
    拥塞避免模式
    cwnd的值大约是上次遇到拥塞时的值的一半。每个RTT只将cwnd的值增加一个MSS。一种通用的方法是sndr无论何时收到一个新的ACK,就将cwnd增加一个MSS字节。

Reference

  1. 计算机网络(自顶向下方法)原书第7版,James F. Kruose and etc., 陈鸣 译, 机械工业出版社,2019年
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,128评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,316评论 3 388
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,737评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,283评论 1 287
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,384评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,458评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,467评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,251评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,688评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,980评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,155评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,818评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,492评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,142评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,382评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,020评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,044评论 2 352