TCP深入解析(一)

前段时间通过学习计算机网络自己也算是有了一些心得,特意参照SMTP协议以及POP3协议自己写了一个类似于接收邮件的应用层协议,以后再详细简介,也是基于SOCKET TCP通信实现。

那么我们先来段关于TCP协议的简介:

首先,还是老样子,来自百度百科的定义:

TCP(Transmission Control Protocol 传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议,由IETF的RFC 793定义。在简化的计算机网络OSI模型中,它完成第四层传输层所指定的功能,用户数据报协议(UDP)是同一层内另一个重要的传输协议。在因特网协议族(Internet protocol suite)中,TCP层是位于IP层之上,应用层之下的中间层。不同主机的应用层之间经常需要可靠的、像管道一样的连接,但是IP层不提供这样的流机制,而是提供不可靠的包交换。

相信这个简介已经是足够详细,我在此就不在进行更多的复述,那么通过上面,我们可以很明显的注意到,TCP协议与它的兄弟协议-UDP最明显的区别就是,TCP协议是一个面向连接的、可靠的传输协议,也就是说在任何的网络情况下,使用TCP协议传输数据是一定可以保证报文段的按序到达。

那么相对应而言,可靠数据传输的原理是什么呢?

首先我们知道底层一般使用的都是不可靠传输协议,如IP协议,提供的就是尽力而为服务。再参考一下我们日常对话的时候,每当有一方说一大段话时,另一方总会回复“我知道了”或者“我没听清,再说一遍”之类的。那么我们也可以考虑在对应的传输层协议中加上肯定确认(OK)和否定确认(请重复),更详细的来说就是,当我们检测到收到的报文段没有错误时,接收方就向发送方反馈一条肯定确认,否则,接收方就向发送方反馈一条重复确认,这时,发送方就会执行重传操作。虽然看起来这样子已经实现了一个可靠传输协议,不过还是有一个小问题,即如果当返回的确认字段出错了。我们现在通常采用的方法是(包括TCP)当发送方收到错误的肯定确认或者重复确认,只需重传当前分组即可,但是现在却存在一个新的问题,即可能出现冗余分组。那么解决这个问题的一个简单方法是为报文段加一个新的字段,让发送发对数据分组编号,即将发送数据分组的序号放在该字段,这样,发送方只需要检查序号即可确定到达的分组是否一次重传。那么现在在数据传输途中数据可能会出错的问题就已经被解决掉啦~可是,我们都知道在网络情况不好的情况下,底层信道很有可能出现丢包的情况。那么在这种情况下,我们就需要引进一个倒计数计时器,发送就可以做到,每次发送一个分组(包括重传),便启动一个定时器,在收到响应的ACK(肯定确认)时,可中断定时器,但在定时器结束之前尚未收到ACK时,就重传该分组。这样子,一个基本的可靠传输协议就实现了,但是它的性能却非常糟糕,因为每当传输一个分组时,整个发送方需要停止下来等待ACK回复,如果当网络出现时延时,这种情况无疑会变得更加糟糕,因此,我们可以为该协议添加一个流水线技术:

1.增加发送方一次发送的序号范围;

2.发送发和接收方可以缓存多个分组;

3.当出现差错时,如分组丢失,损坏或者延时过大,可以解决流水线的差错恢复问题,目前解决该问题主要有两种方法:回退N步和选择重传。

TCP报文结构



 

各个字段说明:

1.源端口和目的端口:各占 2 字节.端口是传输层与应用层的服务接口.传输层的复用和分用功能都要通过端口才能实现

2.序号:占 4 字节.TCP 连接中传送的数据流中的每一个字节都编上一个序号.序号字段的值则指的是本报文段所发送的数据的第一个字节的序号

3.确认号:占 4 字节,是期望收到对方的下一个报文段的数据的第一个字节的序号

4.数据偏移/首部长度:占 4 位,它指出 TCP 报文段的数据起始处距离 TCP 报文段的起始处有多远.“数据偏移”的单位是 32 位字(以 4 字节为计算单位)

5.保留:占 6 位,保留为今后使用,但目前应置为0

6.紧急URG:当 URG=1 时,表明紧急指针字段有效.它告诉系统此报文段中有紧急数据,应尽快传送(相当于高优先级的数据)

7.确认ACK:只有当 ACK=1 时确认号字段才有效.当 ACK=0 时,确认号无效

PSH(PuSH):接收 TCP 收到 PSH = 1 的报文段,就尽快地交付接收应用进程,而不再等到整个缓存都填满了后再向上交付

8.RST (ReSeT):当 RST=1 时,表明 TCP 连接中出现严重差错(如由于主机崩溃或其他原因),必须释放连接,然后再重新建立运输连接

9.同步 SYN:同步 SYN = 1 表示这是一个连接请求或连接接受报文

10.终止 FIN:用来释放一个连接.FIN=1 表明此报文段的发送端的数据已发送完毕,并要求释放运输连接

11.检验和:占 2 字节.检验和字段检验的范围包括首部和数据这两部分.在计算检验和时,要在 TCP 报文段的前面加上 12 字节的伪首部

12.紧急指针:占 16 位,指出在本报文段中紧急数据共有多少个字节(紧急数据放在本报文段数据的最前面)

13.选项:长度可变.TCP 最初只规定了一种选项,即最大报文段长度 MSS.MSS 告诉对方 TCP:“我的缓存所能接收的报文段的数据字段的最大长度是 MSS 个字节.” [MSS(Maximum Segment Size)是 TCP 报文段中的数据字段的最大长度.数据字段加上 TCP 首部才等于整个的 TCP 报文段]

填充:这是为了使整个首部长度是 4 字节的整数倍

其他选项:

窗口扩大:占 3 字节,其中有一个字节表示移位值 S.新的窗口值等于TCP 首部中的窗口位数增大到(16 + S),相当于把窗口值向左移动 S 位后获得实际的窗口大小

时间戳:占10 字节,其中最主要的字段时间戳值字段(4字节)和时间戳回送回答字段(4字节)

选择确认:接收方收到了和前面的字节流不连续的两2字节.如果这些字节的序号都在接收窗口之内,那么接收方就先收下这些数据,但要把这些信息准确地告诉发送方,使发送方不要再重复发送这些已收到的数据

现在就先说这么多吧,下次我再总结一下当前的两种主要重传策略(回退N步和选择重传)的实现方式。

 

猜你喜欢

转载自839299993.iteye.com/blog/2219079
今日推荐