一 TCP概述:
(一)TCP特点:
1*TCP提供面向连接的服务。在传输数据之前必须先建立连接,数据传输结束要释放连接。
2*TCP不支持广播和多播。每一条TCP连接只能有两个端点,即每一条TCP连接只能是点对点的。
TCP连接的端点叫做套接字(socket)。根据RFC 793定义,端口号拼接(contatenated with)到IP地址即构成了套接字。
套接字 socket=(IP地址:端口号)
每一条TCP连接唯一的被通信两端的两个端点(即两个套接字)所确定:
TCP连接::={socket1,socket2}={(IP1,port1),(IP2,port2)}
3*TCP提供可靠的、面向连接的运输层服务,即通过TCP传输的数据,无差错、不丢失、不重复,并且按序到达。
因此不可避免的增加了许多开销,如确认、流量控制、连接管理等,这不仅使协议数据单元的首部增大很多(UDP首部只有8个字节,TCP首部固定20字节,后面根据需要增加),而且还占有很多处理机资源。
4*TCP提供全双工通信。TCP允许通信双方的应用进程在任何时候都能发生数据。TCP连接的两端都设有发送缓存和接受缓存,用来临时存放双向通信的数据。
5*面向字节流。TCP中的“流”指的是流入到进程或从进程流出的字节序列。
面向字节流:虽然应用程序和TCP的交互是一次一个数据块,但TCP把应用程序交下来的数据看成仅仅是一连串的无结构的字节流,TCP不知道所传送的字节流的含义。TCP并不保证接收方应用程序收到的数据块和发送方应用程序所发出的数据块具有对于大小关系,但接收方应用程序接受到的字节流必须和发送方应用程序发出的字节流完全一样。接收方应用程序要有能力识别收到的字节流,并把它还原成有意义的应用层数据。
如下图:
(二)定时器
对于每个连接,TCP管理4个不同的定时器。
(1)重传计时器:用于当希望收到另一端的确认。
发送方超过了一段时间仍然没有收到确认,就认为刚才发送的分组丢失了,因而重传前面发送过的分组,即超时重传。要实现超时重传,就要在每发送完一个分组设置一个超时计时器即重传定时器。
注意超时重传时间的选择。
(2)持续计时器(persistence timer):使窗口大小信息保持不断流动,即使另一方关闭了其接受窗口。
例如:B向A发送了零窗口报文不久后,B的接受缓存又有了一些存储空间。于是B向A发送其B的接受窗口为400的报文段,然而这个报文段丢失了。A一直等待收到B发送的非零窗口的通知,而B也一直等待A发送的数据。如果没有其他措施,这种互相等待的死锁局面将一直延续下去。
为了解决这个问题,TCP为每一个连接设有一个持续计时器。只要TCP的一方受到对方的零窗口通知,就启动持续计时器。若持续计时器设置的时间到期,就发送一个零窗口探测报文段(仅携带1个字节数据),而对方就在确认这个探测报文段时给出现在的窗口值。如果窗口值任然为零,那么受到这个报文段的一方就重新设置持续计时器。如果窗口不是零,那么僵局就打破了。
TCP从不放弃发送窗口探测,这些探测经过每隔60秒发送一次,这个过程持续到窗口被打开或应用进程使用的连接被终止。
(3)保活(keepalive)计时器:可检测一个空闲连接的另一端何时崩溃或重启。
例如:客户已主动与服务器建立了TCP连接,但后来客户主机突然出故障。显然,服务器以后就再收不到客户发来的数据。因此,需要措施使服务器不要再白白等下去。这时就需要保活计时器。通常服务器设置这个功能。
服务器每收到一次客户的数据,就重新设置保活计时器,时间的设置通常是两个小时。若两个小时内没有收到客户的数据,服务器就发送一个探测报文段,以后则每隔75分钟发送一次。若一连发送10个探测报文段后仍无客户的相应,服务器就认为客户端出现了故障,接着就关闭这个连接。
注意:如果一个给定的连接在两个小时内没有任何动作,则服务器就向客户发送一个探查报文段,客户必须处于以下4个状态之一:
1 客户主机依然正常运行,并从服务器可达。客户的TCP相应正常,则重新设置保活计时器。
2 客户主机已经崩溃、并且关闭或者正在重新启动。在任何情况下,客户的TCP都没有响应。服务器不能收到对探查报文的响应,并在75秒后超时。服务器总共发送10个这样的探查,每个间隔75秒,如果服务器没有收到一个响应,它就认为客户主机已经关闭并终止这个连接。
3 客户主机崩溃并已经重新启动:这时服务器将收到一个对其保活探查的响应,但这个响应是一个复位(RST)。
收到RST的几种情况:
*目的端口上没有正在监听的服务器进程。
*TCP想取消一个已有的连接。
*接收到一个根本不存在的连接上的分节。
4 客户主机正常运行,但是从服务器不可达。与状态2相同,服务器都没有收到对探查的响应。
补充:客户主机被关闭和重新启动的情况(指操作员的关闭,而不是主机崩溃)。当系统操作员关闭时,所有的应用进程也被终止,这会使客户的TCP在连接上发出一个FIN。接收到FIN将使服务器的TCP向服务器进程报告文件结束,使服务器可以检测到这个情况。
总结:服务器的应用进程没有感觉到保活探测的发生,TCP负责一切。这个过程对应用程序透明,直到2,3,4情况发生。在这种情况中,服务器应用程序将收到来自它的TCP的差错报告(通常服务器已经向网络发出了读操作请求,然后等待来自客户的数据,如果保活功能返回一个差错,则该差错作为读操作的返回值返回给服务器)。2:差错是“连接超时之类”;3:“连接被复位”RST;4:看起来是连接超时,可根据是否收到与连接有关的ICMP插错来返回其他的差错。
(4)2MSL定时器:测量一个连接处于TIME_WAIT状态的时间。
在TCP连接释放时,主动关闭的一端进入TIME-WAIT状态后连接才会释放掉。2MSL定时器设置TIME_WAIT状态的时间为2MSL。详细见TCP连接的管理。
(三)TCP报文格式:
虽然TCP是面向数据流的,但TCP传送的数据单元却是报文段。一个TCP报文分为首部和数据两部分。首部固定长度为20字节,后面4N自己是根据需要而增加的选项,因此TCP首部的最小长度为20字节,最大长度不超过60字节。
格式如下图:
(1)TCP报文段首部各字段意义: