1、TCP重传机制
TCP协议是传输层可靠的传输协议,TCP可以保证数据包能完整准确地、按照正确的序列在网络上传送到目的地址,TCP通信前两端首先要建立连接,然后才能传输数据,TCP协议使用肯定回答和重传(PAR:Poisitive Acknowledgment with Re-transmission)机制来提供可靠数据传送功能。重传两个方面,一方面使用TCP协议传送数据后要等待接受方的回答信息,如果没收到远端的回答,TCP会自动重传数据并等待更长的时间,如果几次重传不成功,TCP协议放弃重传,TCP重传的时间通常是4-10分钟。TCP协议还有一个算法来估算数据在客户端和服务器之间动态传送的时间RTT(RTT:round-trip time),以确定多长时间能收到回答信息。另一方面TCP收到数据包后要对数据端做校校验和检查,如果校验和检查失败就扔掉数据包,不会向发送方发送确认信息,发送方等了一段时间没有收到确认信息就会重传。
2、TCP数据段格式
TCP协议数据段格式如下图:
(1)Source Port :16位源端口号,指明系统发送端的一个进程。
(2)Destination Port :16位目的端口号,指明数据接受端的一个进程。
(3)Sequence Number:32位序列号,指明数段端中第一个数据字节的序列号。
(4)Ackownledgment Number:32位回答序列号,如果设置了回答控制位,该值指明了发送方的下一个序列号。
(5)Offset:协议头长度,该域站4位,指明协议头占用多少个32位字节单元,协议头最大长度是15*4 = 60字节。
(6)Reserved:预留位了将来使用,必须设置位NULL。
(7)Flags:标志,TCP只要有六中标志
(7.1)URG:指明紧接着传送的是重要数据,设置次标志位后,协议头中的Urgent Pointer指针有效。
(7.2)SYN:指明传送的数据段是用于建立连接的同步数据段,如果SYN=1则要求建立连接。
(7.3)ACK:指明传送的数据段是回答数据段。
(7.4)RST:复位连接标志。
(7.5)PSH:设置了此标志,TCP协议立即将接受的数据传送给上传应用。
(7.6)FIN:连接断开标志。
(8)Window:指明接受方还有多少缓冲区空间来接受数据。
(9)Checksum:TCP协议头和数据的校验和。
(10)Urgent Pointer:指明重要数据的最后一个字节地址。
(11)Options:TCP协议选项,该字段可以变。
3、TCP连接和断开
3.1、TCP连接建立
TCP协议在两个通信主机之间建立点到点的逻辑连接,TCP连接主要是三次握手,首先A主机向B主机发送一个数据段,该数据段设置了同步序列号SYN,告诉B主机要和它建立连接,然后B主机回复ACK和SYN标志位,表示统一建立A主机建立连接并也发送连接请求,这是因为TCP连接是双向的所以B主机也要发送SYN建立和A主机的连接,最后A主机回复ACK,三次握手完毕双向连接建立成功。
3.2、TCP连接终止
因为TCP连接是双向的所以只有两个放行的连接都关闭了这个连接才算终止,首先A主机发送控制信息FIN包给B主机关闭A主机到B主机放行的连接,然后B主机回复ACK包这时A主机到B主机放行的连接关闭,A主机不能向B主机发送数据,但B主机可以向A发送数据,因为B主机到A主机方向的连接没有关闭。接下来B主机向A主机发送FIN包请求关闭B主机到A主机方向的连接,当A主机回复ACK后完成TCP四次挥手,这时还有一个time wait时间,因为TCP是可靠的协议,要保证B主机能收到ACK包则A主机有一个time wait等待,时间是2分钟,可能因为线路或者阻塞的原因B主机没有收到A主机的ACK包,这时B主机还要发送FIN包给A主机,time wait就是为了防止B主机没有收到A主机的ACK包而设计,一般是首先发起方tiem wait,也就是time wait时间内套接字不会被释放会占用端口,这也是我们关闭一个套接字又马上去绑定而报端口被占用的原因。
4、TCP选项
TCP选项常用的主要有以下三中。
4.1、MSS选项
MSS选项表明TCP的最大数据段,既在该连接上每个接受的TCP数据段中的最大字节数,TCP的发送方从数据段发送方那里接受的MSS值作为它发送数据段的最大值。
4.2、Window尺寸选项
TCP协议头描述窗口尺寸的数据域占16位,则TCP两端能向对方发布的最大窗口尺寸是65535,为了获取更大的窗口尺寸,提高数据段额吞吐量,新的选项中规范指出TCP协议头中窗口尺寸该数据域0-14表示,最大窗口尺寸可以达到1GB(65535*2^14),连接的两端必须都支持该窗口尺寸。
4.3、时间戳选项
该选项用于高带宽网络连接中,避免新发送数据段与旧数据段、延迟数据段或复制数据段发生冲突。
5、TCP是按字节流交换的协议
TCP是以连接字节流的格式交换数据的,而不是独立的数据包,所以TCP要维护自己传送的顺序。TCP协议头中的序列号和回答序列号就是用于跟踪字节传送顺序的。
TCP协议标准并没有规定系统必须以某个特定的字节序作为起始序列号,各系统自行选择一个起始序列号作为数据传送的开始,为了保证正确的跟踪字节流,连接的两端必须知道对方的起始序列号。连接的两端在握手期间,通过交换同步数据段来同步字节数。在握手同步数据段的序列号数据域中包含了起始序列号(ISN),ISN是传送字节数的起始点,处于安全考虑,ISN是一个随机数。
传送的每个字节都从ISN开始顺序计数,发送的第一个数据字节序列号是ISN+1,数据头中的序列号指明了数据段中的第一个字节在数据流中的顺序位置。如果数据流中第一个字节的序列号是1(ISN = 0),有4000字节的数据已经传送了,这时当前数据的第一个字节是4001,序列号应该是4001。
协议头中有个一个窗口,表名远端系统可以接受的字节大小,如果接受端可以接受6000个字节,那么窗口就设置为6000,接受方通过改变窗口的大小来控制发送方的字节流,如果串口值为0就告诉发送方停止发送数据,知道窗口不为0为止。
如上图所示TCP字节流控制图,TCP起始字节序列号为0,(ISN=0),接受系统已经接受了2000字节,并给了确认回复,此时确认回复是2001,这时接受方的窗口是6000表示接受方还能接受6000字节的数据,发送方在发送2000字节数据,此时的起始起始序列号是40001,假如从2001开始发送方没有收到回答信息,在窗口范围内发送方会继续发送数据,如果把接受方窗口填满了还没有收到序列号确认信息,发送方会等待一定时间,如果还没有收到序列号确认信息,发送方就会重新从2001开始重传数据。
6、TCP协议功能描述
TCP协议在协议栈中主要实现以下三个任务。
6.1、数据收发:
包括TCP从应用层接受数据、通过网络层接受方数据,将数据正确的传送个应用层
6.2、管理连接
在发送数据前两端要通过三次握手建立连接,数据传输完后要四次挥手关闭连接。
6.3、流量控制
通过窗口和序列号保证数据按照正确的顺序发送接受。
6.4、超时管理
如果发送方在一定时间内没有收到接受方的确认信息,则要在一定时间后重传数据。