传输控制协议(TCP)基础知识概述
TCP报文段由首部字段和数据字段组成,数据字段包含一块应用数据。最大报文段长MSS(maximum segment size)限制了数据段的最大长度。当TCP发送一个大文件时(如WEB页面的图片),TCP通常把文件分割成长度为MSS的若干块。TCP报文段的结构如图:
源端口地址:主机中发送这个报文段的应用程序端口号。
目的端口地址:主机中接收这个报文段的应用程序端口号。
序号(sequence number for a segment):TCP把数据看成是一个无结构的但是有序的字节流。序号是建立在传送的字节流之上而不是建立在传送的报文段的序列之上。假定数据流由一个500 000字节的文件组成,MSS为1000个字节,数据流的首字节编号是0。TCP为该数据流建500个报文段。第一个报文段序号为0,第二个为1000,第三个为2000,以此类推。
确认号:假定接收端成功接收到了对方发来的序号X,它就把确认号定义为X+1。
首部长度:该字段指示了以32位比特的字为单位的TCP首部长度。
保留:保留以后使用。
URG:紧急指针字段
ACK:确认字段值
PSH:请求推送
RST:连接复位
SYN:同步序号
FIN:终止连接
窗口值:这个字段定义了对方必须维持的窗口值,字段是16位长,因此窗口值的最大长度为65 535字节,通常做为接收窗口的,并由接收端来确定。
紧急指针:只有当紧急标志位置位时,才有效。紧急指针定义了一个数,把这个数字加到序号上就得到报文段中数据部分中最后一个紧急字节。
1、 连接建立
如图三次握手:
1) 客户端发送第一个报文段把SYN设置为1,SYN报文段是个控制报文段,不携带任何数据,但它消耗一个序号(客户机随机选择一个数字,做为初始序号)。
2) 服务器发送第二个报文段,SYN+ACK,把SYN标志位置为1。服务器使用SYN同步初始序号,以便从服务器向客户端发送字节。ACK标志确认已经从客户端收到了SYN报文段,服务器还定义了客户端要使用的接收窗口(rwnd)。
3) 客户端发送第三个报文段。使用ACK确认收到第二个报文段。这个报文序号和第一个报文段一样,这个ACK不消耗序号。客户端还必须定义服务器窗口值。在某些实现中,在连接阶段的第三个报文段可以携带客户端的第一个数据块。在这种情况下,第三个报文段的序号必须是数据中第一个字节的编号。
2、 数据传送
在连接建立后,假定客户端用两个报文段发送2000字节的数据,服务器用一个报文段发送2000字节的数据。前三个报文既有数据又有确认,最后一个只有确认没有数据了,数据发送完毕了。客户发送数据把PSH置1,因此服务器TCP知道在收到这些数据后尽可能快的把他们交给服务器进程。如图:
3、 连接终止
1) 客户TCP在收到客户进程发来的关闭命令后,就发送第一个报文段把FIN置为1。FIN报文段可以包含客户发送的最后一块数据,但也可以仅仅是一个控制报文段。
2) 服务器TCP在收到这个FIN报文后,通知服务端进程,并发送ACK+FIN报文段。这个报文段可以包含从服务器发送的最后一块数据,如果不携带数据,只消耗一个序号。
3) 客户TCP发送最后一个报文段(ACK确认)。
经过三次握手后,连接结束。
TCP状态转换图
CLOSED:没有连接
LISTEN:被动打开,等待SYN
SYN-SENT:已发送SYN,等待ACK
SYN-RCVD:已发送SYN+ACK,等待ACK
ESTABLISHED:连接已建立,正在传送数据
FIN-WAIT-1:第一个FIN已发送,等待ACK
FIN-WAIT-2:第一个FIN的ACK已收到,等待服务器端的FIN
CLOSE-WAIT:收到第一个FIN,已发送ACK,等待应用程序关闭
TIME-WAIT:收到第二个FIN,已发送ACK,等待2MSL超时
LAST-ACK:已发送第二个FIN,等待客户端的ACK