TCP协议的特点:
A)是面向连接的。应用程序在使用TCP协议时,必须进行连接;当然,数据传输结束后,要断开TCP连接。
B)TCP连接是点对点的。
C)TCP连接时可靠的。也就是说传输的数据时无差错的、不丢失、不重复、有序到达的。
D)是全双工的。即TCP连接的两端都设有发送缓存和接收缓存,用来存放双向通信的数据。
E)是面向字节流的。也就是说TCP将应用程序交下来的数据看成仅仅是一连串的无结构的字节流,其不知道这些字节流的具体含义。TCP协议无法保证发送的数据块的具体大小,因为TCP协议的发送的数据大小收到对方给出的窗口值和当前的网络拥塞度的影响。
TCP的连接端点是套接字。套接字是IP地址拼接上端口号组成的,即点分方式的十进制后面是端口号,中间用逗号或冒号隔开。如下方式:
套接字Socket=(IP地址:端口号)
TCP报文段的首部
TCP协议的首部有20字节的固定长度,以及4N字节的变长段,因此TCP报文段首部最小为20字节。其格式如下:
A)分别占用两个字节的源端口和目的端口。
B)序号。占用4个字节。序号是循环的,当增加到最大值后又回到0。TCP是面向字节流的,这样会个发送的数据按顺序给每个字节编上号。在建立连接时,会指出发送的字节流的起始序号。首部中的序号表示发送的报文段的数据的第一个字节的序号,而报文的给字节的序号是顺序的。如第一个字节为401,报文的数据长度为100,则首部的序号为401,最后一个字节的序号为500,也就是说下一个报文的首部序号为501。
C)确认号。占用4个字节。表示期望收到下一个报文段的第一个数据字节的序号,也是下一个报文段的首部序号。如:B收到了A的200个字节数据的TCP报文段,而这个TCP报文段的首部序号为601,则B希望收到的下一个报文段确认号为801。也可以说如果确认号为N,则前面N-1为止的数据已经收到。
D)数据偏移。占用4位。其表示数据起始位置相对于报文段起始的位置的偏移量,也就是报文段首部的长度。其单位为32位字,也就是说其表示的值应该乘上4个字节。如:该字段的值为4,则其报文段首部长度为16个字节。其最大值只能表示15,也就是说报文段的首部最大只能为60个字节(即变长只能为20个字节)。其最小值为5,因为首部最小值为20。
E)保留。占用6位。其值设为0。
F)紧急URG。其占用1位。如果URG设为1,表示首部中的紧急指针有效。表示其发送的报文段数据有紧急数据,其需要马上发送出去(也就是取得最高优先权),TCP会将紧急数据插入到该报文的最前端,后面任然为普通数据。
G)确认ACK。占用1位。当ACK=1时,表示首部中确认号字段有效,为0时,确认号字段无效。TCP规定,在连接建立后ACK字段必须为1。
H)推送PSH。占用1位。两个应用程序通信,有时应用程序希望键入一个命令马上能够得到对方回应,这是就可以使用这个字段。将PSH设为1,TCP会马上建立一个报文将其发送出去。接收端在收到该报文后,会尽快的将其交给应用程序,不用得到缓冲区满。
I)复位RST。占用1位。当RST=1时,表示连接出现严重错误,需要释放连接,然后重新进行连接。其还用于拒绝打开一个连接或拒绝非法报文。
J)同步SYN。占用1位。用于在连接建立时同步序号。当SYN=而ACK=0时,表示这是一个连接请求报文段。当SYN=1且ACK=1时,表示对方接收建立连接报文段。因此SYN=1,表示这是一个连接请求或连接接受报文段。
K)终止FIN。占用1位。当FIN=1时,表示发送方的数据发送完毕,并要求释放连接。
L)窗口。占用2个字节。表示发送该报文段的一方的接收窗口,表示允许对方发送的数据量。窗口值告诉对方:从报文段首部中的确认好算起,接收方目前允许对方发送的数据量。如:确认为801,窗口值为1000,则表示其还有接收1000个字节数据(801-1800)的接收缓存空间。
M)检验和。占2个字节。其也和UDP一样需要加上伪首部,但是其中的17会变为6。
N)紧急指针。占用2个字节。当URG=1时有效,其指出了紧急数据在报文端中的末尾位置。紧急数据在报文数据段的开始。
O)选项。可选,最大为40个字节。包括MSS、窗口扩大、时间戳、选择确认等。