计算机网络协议第八章,TCP协议基础

来源:互联网 发布:淘宝网春秋女装 编辑:程序博客网 时间:2024/06/05 10:19

      TCP协议同IP协议一样,作为网络协议的核心,本章将对TCP协议进行介绍,第一部分主要是阐述TCP协议设计的考虑,能够掌握TCP设计的目的和模型,第二部分通过分析TCP首部,通过阐述进一步分析TCP协议具体手段。

TCP协议背景

引言

      上一章对TCP/IP协议的背景和诞生做了介绍,这里强调几点。TCP/IP常被同时提及,因为它们的前身就是NCP,这两个协议同时诞生,是要早于UDP协议。目前传输层协议中TCP有举足轻重的地位,大量的应用层协议基于TCP。而UDP是在IP层上封装端口号,实质上没有过的的设计,而后来出现的SCTP协议作为传输层协议,有显著的特点。


TCP的顶层设计

     作为应用层软件工程师,TCP协议比IP协议多了端口号是最直观的印象,TCP的端口号确实是用来区分物理机器上的不同进程。这可能是我最早对TCP协议的印象了吧。这部分我们抛开对TCP首部的定义,专门谈TCP的设计的原因。

     谈TCP协议不得不谈到IP协议,它们是密不可分的,可以说是紧耦合。之所以要设计TCP协议,我认为其主要的原因是要解决IP协议对应用层使用的麻烦。IP协议作为低层次的协议,主要服务的对象是物理机器,而应用层直接使用IP协议又会带来很多麻烦。比如IP协议的包乱序问题,丢包问题等等。因此TCP协议的设计初衷就是解决这些问题,它提供了可靠的传输服务。它作为网络层和应用层直接的桥梁,使得应用层不在需要担心网络丢包、乱序等等问题,更加专注于业务的开发。

     TCP协议不仅是一个可靠的传输服务,而且是一个字节流传输服务,之所以要设计为字节流服务的原因在于TCP要高效的利用网络带宽,TCP协议的字节流和UDP的数据报服务是相对应的,数据报协议是以消息为单位的,应用层调用sendto函数发送多少字节的数据,这些数据最终都作为一个IP数据报发送,可能带来网络带宽的浪费,还记得以太网的最小帧为60字节把,如果UDP只传输1个字节的应用层数据,那么还不到以太网最小帧数据大小,因此会padding,再举个例子如果数据大于MTU,那么IP层会分片,最后一片如果用不满MTU也是一种浪费。

     TCP协议还是一个有状态的服务,试想下UDP协议是无状态,这两者有很大的差别,之所以TCP协议要设计为有状态的服务也是为了提高可靠传输服务,试想下如果TCP设计为无状态的服务,那么应用程序无需进行连接就可以直接进行通信,那么如果两个应用层程序使用同一源地址向同一个目的地址发送报文,那么目的地址收到报文后应该如何处理呢。

     通过上一节讲解,我们可以归纳为以下几点。

TCP设计的目的

1)作为网络层和应用层桥梁,为应用层解决直接使用网络层的麻烦
2)充分利用网络的带宽,提高吞吐量

TCP设计的模型

1)提供可靠的传输服务
2)提供字节流传输服务
3)有状态的服务

TCP协议详解

     通过上面的描述,对TCP协议做了最精要的分析,了解TCP设计目的和模型,本节主要通过阐述介绍TCP协议的主要功能,当然这些功能都是围绕着TCP协议目的而来的。

TCP首部字段讲解


16位源端口、目的端口:用于区分进程的标识。
32位序号:用来标识TCP发送端发送的字节流。

32位确认序号:是接受端对收到的字节流确认的标识。

4位首部长度:单位是DWORD(4字节),最大长度60字节。类似IP协议的首部长度。
6个Bit标识:
URG: 标记是否是一个紧急指针。
ACK: 标识是否是TCP的确认报文。
PSH: 标识否立即推给应用层,目前SOCKET接口不支持设置该标记,完全由内核协议栈控制。
RST: TCP连接重置标记,连接被异常终止。
SYN: TCP发起建立连接的标记。
FIN:TCP发起终止连接的标记。
16位窗口大小:TCP滑动窗口的大小,单位字节。
16位校验和:校验TCP整个报文,类似UDP的校验和。
16为紧急指针:只有URG标识为1时有效,值是一个正的偏移量,和序号相加为字节流最后一个字节的标识。
选项:可选,包括MSS、Window Scale、SACK、时间戳等等。

TCP主要功能

    TCP的功能和细节之多,从定义它的RFC793以及系列的RFC可以看出,几乎难以都罗列出来,因此我一分类的方式进行列举,后续系列问题会对其中的分类进行更加详细的分析。

1)TCP的状态机

    TCP是一个有状态的服务,它内部需要维护其状态机,并且设计一个保活定时器。

2)滑动窗口

    TCP是一个全双工的通讯管道,发送数据时需要考虑接受方的滑动窗口大小,避免对方无法接受数据,并且设计了一个坚持定时器。

3)重传机制

    TCP依靠Ack分节响应对方发送的数据,如果没有收到Ack响应可能意味着报文丢包,需要出发重传机制,而且TCP的重传机制不断在进化和改变。并且设计了一个重传定时器。

4)拥塞控制

    为了最大化利用网络的带宽,又避免拥塞,TCP设计了一套拥塞控制机制。滑动窗口可以认为是接受方控制的收到,而拥塞控制是发送方主动控制的手段。这里讲下我理解的历史背景,早期在内存,CPU比较昂贵的条件下,滑动窗口表示接受方可接受数据的大小,还是一个比较小的数值,而今这个滑动窗口被定义为较大值,因为内存提升了很多倍,因此拥塞控制可能是更有效的控制手段,当然滑动窗口依然有效。


小结    

    TCP状态机实现了一个有状态的服务;利用Sequence Number和接受缓存区解决了包乱序问题;利用Ack Number和超时重传机制解决丢包重传问题;通过滑动窗口避免发送方无效发送数据;利用MTU发现机制更好的利用网络带宽,避免IP分片;利用拥塞控制最大化利用带宽和避免拥塞导致更多的丢包;利用慢启动和线性增加的方式初步试探网络带宽的峰值;利用线性增加/指数避让的方式使丢包后立刻降低发送频率,避免拥塞。

    而本章想以一个小篇幅来介绍TCP,希望读者能够了解TCP设计的主要问题,而避免过多的信息干扰对TCP协议的理解。而后续几章会对TCP某一个功能进行详细讲解,希望能够将TCP这个协议阐述清楚。
     

参考

《TCP/IP详解-协议》卷一     W.Richard Stevens

修订

初稿                                       2015-2-7               Simon




1 0
原创粉丝点击