TCP
(1)RFC793定义TCP是一种面向连接、端到端的可靠传输协议。TCP的主要特点:
《1》三次握手建立连接:确保连接建立的可靠性。
《2》端口号:通过端口号标识上层协议和服务,实现了网络通道的多路复用。
《3》完整性校验:通过对协议和负荷数据计算校验和(Checksum),保证了接收方能检测出传输过程中可能出现的差错。
《4》确认机制:对于正确接收到的数据,接收方可通过显式应答通告发送方,超出一定时间之后,发送方将重传没有被确认的段,确保传输的可靠性。
《5》序列号:发送的所有数据都拥有唯一的序列号,这样不但唯一标识了每一个段,而且明确了每个段在整个数据流中的位置,接收方可以利用这些信息实现确认、丢失检测、乱序重排等功能。
《6》窗口机制:通过可调节的窗口,TCP接收方可以通告期望的发送速度,从而控制数据的流量。
(2)TCP/UDP端口号:
为了区别TCP和UDP协议,IP使用协议号6标识TCP,用协议号17标识UDP;
TCP/UDP端口号是一个16位二进制数,即端口号范围为0-到2的16次方等于65535,其中0-1023由IANA统一管理,分配给众所周知的服务使用;大于1023端口号没有统一的管理,可以由应用程序任意使用。
(3)TCP封装:
TCP收到应用层提交的数据后,将其分段,并在每个分段前封装一个TCP头。最终的IP包是在TCP头之前再添加IP头形成的。
TCP头部是由一个20字节(120位)的固定长度部分加上变长的选项(Option)字段组成。
《1、2》源、目端口:16位定义了源目主机的应用程序接口;
《3》序列号seq:32位,该字段用来标识TCP源端设备向目的端设备发送的字节流,它表示在这个报文段中的第一个数据字节如果将字节流看作在两个应用程序间的单向流动,则TCP用序列号对每个字节进行计算。
《4》确认号ACK:TCP使用32位的确认号字段表示期待收到的下一段的第一个字节,并声明此前的所有数据都已经正确无误地收到。因此,确认序号应嘎是上次已成功收到的数据字节序号加1.收到确认号的源主机会知道特定的段已经被收到。确认号的字段只在ACK表示被设置时才有效。
《5》数据偏移Date Offset:这个4位字段包括TCP头大小,以32位数据结构为单位。
《6》保留:6位置的0字段。为将来定义新的用途保留。
《7》控制位:共6位,每1位标示可以打开一个控制功能。分别是:URG(紧急指针字段标识)、ACK(确认字段标志)、PSH(推功能)、RST(重置连接)、SYN(同步序列号)、FIN(数据传送完毕)
《8》窗口Window:目的主机使用16bit的窗口字段告诉源主机它期望每次收到的数据的字节数。
《9》校验和(Checksum):TCP头包括16位的校验和字段用于错误检查。源主机基于部分IP头信息、TCP头部和数据内容计算一个校验和,目的主机也要进行相同的计算,如果收到的内容没有错误过,两个计算结果应该完全一样,从而证明数据的有效性。
《10》紧急指针Urgent Pointer:紧急指针字段是一个可选的16位指针,指向段内的最后一个字节(6位)位置,这个字段只在URG标志被设置时才有效。
《11》选项Option:至少1字节的可变长字段,表示哪个选项有效。如果没有,这个字节等于0,说明选项字段的结束。字节等于1表示无需再有操作;字节等于2表示下4字节包括原机器的最大长度(Maximum Segment Size,MSS)MSS是数据字段中可包含的最大数据量,源和目的机器要对此达成一致。当一个TCP连接建立时,连接的双方都要通告各自的MSS,协商可以传输额最大段长度。常见的MSS有1024字节,以太网可达1460字节
《12》填充Padding:这个字段加入额外的零,以保证TCP头是32的整倍数
《13》数据Date:从技术上说,它并不是TCP头的一部分,但应该了解到,字段的大小是最大的MSS,MSS可以在源和目的机器之间协商。数据段可能比MSS小,但却不能比MSS大。
(4)TCP可靠传输机制
三次握手:
《1》HostA发送SYN置位(seq=a);
《2》HostB收到并读取seq为a后,发送seq=b,ACK=a+1的SYN包;
《3》HostA收到并读取seq为b后,发送seq=a+1,ACK=b+1的SYN包;
建立好TCP连接后,接下来可以传输数据;
四次握手:
《1》HostA发送FIN置位(seq=p);
《2》HostB回ACK(ack=p+1),同时关闭连接;
《3》HostB置位FIN(seq=q),通知连接关闭;
《3》HostA回ACK(ack=q+1),同时关闭连接;
传输确认:
当传输数据4096个字节时,接收端并不是1个个数据包回复ACK确认,而是等所有分包收到后,回1个ACK=4096+1的包来表示确认;
超时重传:
假设HostA发送给HostB的第二段丢失,那么HostB只对全部按序无错接收的序列号最高的段给以确认。
重传的触发并不是接收方HostB发送seq为非完成的ACK,而是在HostA发往的每个连续包中RTT值(Round Trip Time,往返时间)超时,HostA才认为这个段已经丢失,并触发重传;
由此可见,RTT值成为一个重要参数,过大导致TCP重传迟延,降低传输速度;过小则导致TCP频繁重传。在实际实现中,TCP通过实时跟踪发送的段与其相应确认之间的时间间隔来动态调整RTT的数值。
滑动窗口:
比如HostA传输4096个字节数据,分成4个包。当HostB由于缓存不足或处理能力有限有限,认为这个发送速度过快,期待将窗口降低一半为2048字节。当HostA收到后,改成每次发送2个连续的共2048字节数据包。
若接收方设备要求窗口大小为0,表明接收方已经接收了全部数据,或接收方应用程序没有时间读取数据,要求暂停发送。
可变滑动窗口解决了端到端流量控制问题,但是无法干预网络。如果中间节点,例如路由器被阻塞,则没有任何机制可以通知TCP。如果特定的TCP实现对超时设定和再传输具有抵抗性,则会极度增加网络的拥挤程度。