机制也通过“接收端请求发送端校验第一次发送的SYN”的方式确保了TCP双方的同步。另外,TCP协议通过设置MSL(Maximum Segment Lifetime)与2^32个循环序列号的方式(采样频率恒定)确保序列传输中的唯一性。例如在第一次传送数据后等待响应的阶段,下一次发送数据的序列号都是以增量的方式进行发送,直到收到响应。
TCP协议一般与IP协议捆绑使用,也是目前互联网中最为重要的协议族之一。TCP协议是OSI架构中传输层的协议,而IP协议是OSI架构中网络层的协议,相对于电信网络中控制与承载分离的协议设计架构(控制面,用户面),TCP/IP协议并不将控制面与数据业务面进行逻辑分离,相反通过一些包头(header)的方式封装控制字段。在移动互联网中(从网络架构角度可以认为就是电信基础网络承载互联网),TCP/IP被用作用户面的协议,电信AS/NAS协议栈打通了电信控制面的路由,而具体对于数据业务传输过程中的控制,则由TCP/IP,或者UDP,RTP等其他协议进行参与。TCP协议与IP协议像一对优势互补的“合作伙伴”,IP协议提供了点到点的服务(就如同投递员投递信件一样,投到准确的每家每户,因此门牌号也就是IP地址需要唯一的标识),但是IP协议也具有其局限性,即其不可靠性,不能确保IP数据报成功地到达目的地(这就好比投递员不负责用户是否能够成功接收到邮件,只负责投递)。同时,还具有无连接的缺点,即数据报的的接收不按照次序。这些局限性IP层不负责解决,而是由其上层TCP进行解决,因此可以说TCP提供了流程上的保障,提供了所谓端到端的服务,二者结合一起的协议簇,对于数据传递的准确性提供了保障,但是相应的开销就是时延。
TCP协议中通过一些基本特性对数据包传输的准确性以及及时性进行保证:
确认和超时:TCP使用确认(ACK)机制以及超时重传机制来确保每一个分片的成功传送。这里有点像LTE在做初始RRC连接时发送随机接入的msg1(Random access request),如果在一定时间间隔内(这里是由backoff指定的一个随机变量)没有收到msg2(random access response,RAR),那么会继续发送msg1,直到达到最大发送次数。而TCP协议这里却没有最大发送次数的限制,也就意味着一旦网络中出现问题,发端TCP会不断的进行重传。因此将超时重传间隔设置很小,可以导致对服务器的信令冲击。由于在数据传送过程中可能经历不同的网络,因此重传超时需要动态的设置。需要注意的是,RTO的设置
(retransmission timeout)至少应该大于RTT(Round Trip Time)。值得一提的是,在TCP与上层协议的控制信息交互中,对于不同的上层用户控制命令中带的timeout的参数的值,作用意义也都有不同,而且在TCP的不同状态中会随之相应更新。例如在OPEN指令中如果携带timeout,意味着如果在该timeout之内的发端没有将数据全部成功发送到收端,那么TCP就会终止该连接,该值默认为5分钟;在SEND指令中如果携带timeout,那么当前的timeout就被替换更新了。一般来说timeout有三种,用户超时(user timeout),重传超时(retransmission timeout)和时间等待超时(time-waittimeout,该值用于CLOSING流程,设置值为2MSL,MSL即最大片段生命周期,rfc793协议规定为经验值2分钟),除了重传超时的处理不同外,用户超时和时间等待超时后,上层对于TCP的处理是一样的,即删除已建立的TCP,进入CLOSED状态,并反馈上层。
窗口:这里的窗口有三种,发送窗(sendwindow),接收窗(receive window),片段窗(segment window)。
发送窗:表示着远端TCP能够接收的数据序列号的大小。一般通过数据接收过程从远端TCP
收到的指示。发送窗其实是本地和远端TCP相交互的信息,通过分片窗口大小进行本地更新。当发送窗设置为0时,本地发端TCP也应至少发送一个字节的新数据,并且发端TCP应该周期性的重发至收端TCP,一般周期间隔推荐为2分钟,这样的好处是无论任一端TCP窗口为0,当重新打开窗口(大于0)的时候,能够可靠的将该设置通知另一端。
接收窗:表示本地(收端)TCP可以接收的序列号。如果收到的分片序号等同于在窗内的序号,本地TCP认为收到正确数据或者控制消息,否则,则认为是重传序列予以丢弃。当接收窗口为0的时候,除了ACK分片外,其他的数据分片都不被接收。因此,对于TCP可以存在0接收窗口的情况,这样其可以发送数据的同时只接受ACK。另外,即使接收窗为0,收端TCP还是可以对任意的分片中所含RST和URG字段进行处理。
分片窗口:分片窗口是传送分片中的一个域,通过该域的值来传递远端TCP的接收窗口以供给本地发端TCP窗口进行相应更新。
面向连接(同步):TCP是一种面向连接的协议,这也同时确保通信双方的通信和数据传输是一种同步双工机制。连接由用户OPEN指令调用建立,同时TCP提供用户建立连接的名字以供用户后续引用。OPEN调用指出了该连接是主动建立的或者被动等待建立。主动建立是高层通过active OPEN指令触发,而被动连接则是通过收到分片中所携带SYN字段,并通过后续的握手机制来建立。被动OPEN(passive OPEN)要求意味着进程可以接受来访建立请求,一般passive OPEN意味着可以接受任意的远端连接建立请求。在这种情况下,全“0”配置的外部socket表征未明确的socket,这种未明确的socket设置只允许应用在passive OPEN。窗口的设计需要进行平衡,指示较大窗口鼓励更多的数据传输,一旦超过其接收能力,会导致重传从而网络以及TCP的负荷。指示较小的窗口则会对数据进行过多的分片,由于过多的握手机制导致传输时延的增加。
状态转换:TCP含有多种状态,例如
LISTEN,SYN-SENT,SYN-RECEIVED,ESTABLIASHED,FIN-WAIT-2,FIN-WAIT-2,CLOSE-WAIT,CLOSING,LAST-ACK,TIME-WAIT,CLOSED,这些状态之间的转换通过用户调用的事件
(OPEN,SEND,RECEIVE,CLOSE,ABORT,STATUS),接收到携带标志位(SYN,ACK,RST,FIN)的分片和超时进行相互转化,详见RFC 793。
与上层协议接口的异步机制:TCP与上层进程通信可以采用异步机制,当TCP通知上层用户时,确定的信息就传递到用户。这些信息主要是报错机制或者进程事件完成标志(例如SEND或者RECEIVE)。
PUSH Flag与Urgent Flag:PUSHFlag与Urgent Flag的作用相似,是分片携带中的一个标识字段,如果收端读取到该字段,则无需等待是否到达了buffer的边界,而将buffer里面存在的数据同时上传。如果发端触发了PUSH Function,则立即将发端buffer里面未发送的数据立即发出。Urgent Flag是通过分片中的Urgent Pointer来传递信息的,通知收端在Urgent Pointer之前的数据还没有完全接收,收端的Urgent Flag(on)通知收端上层进程进入紧急模式(Urgent Mode),意味着额外的紧急数据等待接收,如果Urgent Flag置为off,则向上层返回当前所有紧急数据,至于后续连续序号的非紧急数据则不会在同一个buffer中被传递给上层进程(除非buffer中明确划分了边界)。PUSH Flag与Urgent Flag是TCP中对于向上层推送数据的一种特殊处理方式,即确定了那些数据无需等待,可以优先
推送给用户,PUSH Flag对于分片中的数据进行了标识推送,而Urgent Flag则对可能跨分片的数据进行标识推送。
TCP的crash保护机制:对于TCP本地进程的崩溃(crash),一般TCP不提供记忆机制,即本地TCP并不记得之前发送过什么,以及发送序号是什么,而是通过一种“半开启连接发现”机制来进行本地crash之后的进程回复,其实与远端的信息交互触发本地的RESET机制,从而使得本地与远端进行重新同步,详见RFC 793。
梦绕神州路,怅秋风,连营画角,故宫离黍。
底事昆仑倾砥柱,九地黄流乱注?聚万落千村狐兔。
天意从来高难问,况人情易老悲难诉。
更南浦,送君去。
凉生柳岸催残暑,耿斜河,疏星淡月,断云微度。
万里江山知何处,回首对床夜语。雁不到,书成谁与?
目尽青天怀今古,肯儿曹恩怨相尔汝!
君且去,休回顾。
10 承载传输协议初体验(UDP篇)
机械师是笔者比较喜欢的一部影片,风格冷峻、镜头犀利,主要是主人公的演绎,艺高胆大,处理问题冷静,个性极其鲜明,好像“专业”内没有什么难事。这篇UDP协议解读就好像主人公所面对的一个简单的“任务”一样,相比其他协议流程,要简单的多。不过还是先让我们重温一下影片中经典的桥段吧。
相比TCP协议,UDP的协议要简单的多,UDP协议默认下层网络层协议为IP协议,因此一般UDP/IP是协议栈的形式出现的。相比TCP协议面向连接,UDP协议是面对交互流程的,由于没有类似TCP等ACK反馈机制,因此数据报传递的准确性难以得到保障。
用户数据报表头结构(UserDatagram Header Format)
源端口(Source Port)是一个可选配置,指明了发端端口,如果该域不使用,则置为0。
目标端口(Destination Port)指明了网络目标地址的端口。
长度(Length)指明了UDP报文封装中数据包+包头的最长度,单位为字节(octet),这意味着该值最小设置为8字节,包含源端口,目标端口,长度以及校验和。
UDP提供16bit校验和,校验机制的流程与TCP协议一致。
UDP协议与上层的用户接口设计需要能够创建接收端口,能够将收到的数据字节以及发端端口地址予以反馈并且能够允许数据报以正确的格式发送(如上图结构)发送。
与IP层协议的设计可以采取紧耦合的方式,及接口层将全部的数据报上传(不仅包含UDP的包头也包含IP的包头),有利于接收流程的响应。
UDP协议主要用于INS(Internet Name Server)以及TFTP(Trivial File Transfer Protocol),因此该传输层协议适合一些对时延较敏感的小文件传输协议,相比TCP协议传输的可靠性较差。
11 承载传输协议初体验(RTP&RTCP篇)
RTP协议作为一种实时传输协议,主要提供类似音频和视频这样的端到端的实时数据业务。