1.端口号
标记同一台计算机上的不同进程
源端口:占2个字节,源端口和IP的作用是标记报文的返回地址。
目的端口:占2个字节,指明接收方计算机上的应用程序接口。
TCP报头中的源端口号和目的端口号同IP报头中的源IP和目的IP唯一确定一条TCP连接。
2.序号:Sequence number(顺序号码)
占4个字节,是TCP可靠传输的关键部分。是本报文段发送的数据组的第一个字节的序号。
在TCP传输流中,每一个字节一个序号。(例如:一个报文段的序号为300,此报文段数据部分共有100字节,则下一个报文段的序号为400.)所以序号确保了TCP传输的有序性。序列号的初始值并非为0,而是在建立连接以后由随机数生成,后面的计算则是对每一字节加1。
3.确认序号:Acknowledge number(确认号码)
即ack,占4个字节,指明下一个期待收到的字节序号,表明该序号之前的所有数据已经正确无误的收到。确认号只有当ACK=1时才有效。比如建立连接时,SYN报文的ACK标志位为0。
4.数据偏移
占4位,它指出TCP报文的数据距离TCP报文段的起始处有多远。
由于首部可能含有可选项内容,因此TCP报头的长度是不确定的,报头不包含任选子段时长度为20字节;4位首部长度字段所能表示的最大值为1111,转化为10进制为15,故报头最大长度为15*32/8=60个字节。首部长度也叫数据偏移。
5.保留
为将来定义新的用途保留,一般置为0。
6.控制位
SYN:同步序号,用于建立连接过程,在连接请求中,SYN=1和ACK=0表示该数据段没有使用捎带的确认域,而连接应答捎带一个确认,即SYN=1和ACK=1。ACK:确认序号标志。1:确认号有效;0:忽略确认号段。FIN:结束标志,用于释放连接,为1时表示发送方已经没有数据发送了,即关闭本方数据流。PSH:push标志。1:带有push标志的数据,表示接收方在接收到该报文后应尽快将这个报文段交给应用程序,而不是缓冲区排队。RST:重置连接标志。用于重置由于主机崩溃或其他原因而出现错误的连接。或者用于拒绝非法的报文段和拒绝连接请求。 URG:紧急指针标志。1:紧急指针有效;0:忽略紧急指针。
位码即tcp标志位,有6种标示 # SYN(synchronous建立联机) SYN: 请求建立连接. 我们把含有SYN标识的报文称为同步报文段。UDP是一种面向无连接的通信协议,因此不检查。 对端是否可以通信,直接将UDP包发出去。TCP正好相反,它会在数据通信之前,通过TCP首部发送一个SYN包。作为建立连接的请求等待确认应答。 如果对端发来确认应答,则认为可以进行数据通信。如果对端的确认应答。未能到达,就不会进行通信。此外,在通信结束时会进行断开连接的处理(FIN包)。 # ACK(acknowledgement 确认) ACK: 标识确认序号是否有效。即当发送端的数据到达接收主机时,接收端主机会返回一个已收到消息的通知。 这个消息叫做确认应答(ACK)。在一定时间内没有等到确认应答,发送端就可以认为数据已经丢失,并进行重发。 由此,即使产生丢包,仍然能够保证数据能够到达对端,实现可靠传输。ACK超时未收到,会重发,但数据也不会。 被无限的、反复的重发。达到一定的重发次数之后,如果仍没有任何确认应答返回,就会判断为网络或对端主机。 发生了异常,强制关闭连接,并且通知应用通信异常强行终止。 # FIN(finish结束) FIN: 通知对端, 本端即将关闭. 我们把含有FIN标识的报文称为结束报文段。 # PSH(push传送) PSH: 用来提示接收端应用程序立刻将数据从tcp缓冲区读走。 # RST(reset重置) RST: 要求重新建立连接. 我们把含有RST标识的报文称为复位报文段 # URG(urgent紧急) URG: 标识紧急指针是否有效 # Sequence number(顺序号码) # Acknowledge number(确认号码)
6.1 收到RST原因
在某些特殊情况下,TCP连接的一端会向另一端发送复位报文段,以通知对方关闭或重新建立连接。
一般来说,有以下三种情况:
1. 访问不存在的端口。若端口不存,则直接返回RST,同时RST报文接收通告窗口大小为0.其实客户端向服务器的某个端口发起连接,如果端口被处于TIME_WAIT 状态的连接占用时,客户端也会收到RST
2. 异常终止连接。一方直接发送RST报文,表示异常终止连接。一旦发送方发送复位报文段,发送端所有排队等待发送的数据都被丢弃。应用程序可以通过socket选项 SO_LINGER来发送RST复位报文。
3.处理半打开连接。一方关闭了连接,另一方却没有收到结束报文(如网络故障),此时另一方还维持着原来的连接。而一方即使重启,也没有该连接的任何信息。这种状态就叫做半打开连接。而此时另一方往处于半打开状态的连接写数据,则对方回应RST复位报文。
7.窗口
滑动窗口大小,用来告知接收端的缓存大小,以此控制发送端发送数据的速率,从而达到流量控制。窗口大小是2个字节,因而窗口大小最大为65536。
TCP以1个段为单位,每发一个段的数据进行一次确认应答的处理,这样的传输方式有一个缺点。那就是,包的往返时间越长通信性能就越低。为解决这个问题,引入窗口这个概念。确认应答不再是以每个段,而是以更大的单位进行确认时,转发时间将会被大幅度缩短。也就是说,发送端主机,在发送了一个段以后不必要一直等待确认应答,而是继续发送。窗口大小就是指无需等待确认应答而可以继续发送数据的最大值。这个机制实现了使用大量的缓冲区,通过对多个段同时进行确认应答的功能。
8.校验和
奇偶校验,此校验和是针对整个TCP报文段的,包括TCP报头和TCP报文数据段,以2个字节进行计算所得。由发送端计算和存储,并由接收端进行验证。
9.紧急指针
只有当URG标志置1时紧急指针才有效。紧急指针是一个正的偏移量,和顺序号字段中的值相加表示紧急数据最后一个字节的序号。TCP的紧急方式是发送端向另一端发送紧急数据的一种方式。
10.选项和填充
最常见的可选字段是最长报文大小,又称为MSS(Maximum Segment Size),每个连接方通常都在通信的第一个报文段(为建立连接而设置SYN=1的那个段)中指明这个选项,它表示本端所能接受的最大报文段的长度。选项长度不一定是32位的整数倍,所以要加填充位,即在这个字段中加入额外的0,以保证TCP头部是32的整数倍。
11.数据部分
TCP报文段中的数据部分是可选的。在一个连接建立和一个连接终止时,双方交换的报文段仅有TCP首部。如果一方没有数据要发送,也使用没有任何数据的首部来确认收到的数据。在处理超时的许多情况中,也会发送不带任何数据的报文段。