一 概述
TCP协议是TCP/IP协议族中非常复杂的一个协议,主要特点如下:
(1)TCP是面向连接的传输层协议。即在使用TCP协议之前,必须先建立连接,然后使用完毕后再释放连接。
(2)TCP协议是点对点进行连接。
(3)TCP提供可靠交付。即在传输过程中,可靠、无差错、不丢失,不重复,并且按照顺序到达。
(4)TCP提供全双工通信。即在通信过程中,允许双方的应用进程在任何时候都能发送数据。TCP连接的两端都设置有发送缓存和接受缓存,用来临时存放双向通信的数据。
(5)面向字节流。“流”指的是流入到进程或从进程中流出的字节序列。虽然应用程序和TCP的交互是一次一个数据块,但TCP把应用程序交下来的数据仅仅看成是一连串的无结构字节流,不保证接收方应用程序收到的数据库和发送方应用程序所发出的数据库具有对应大小的关系。通俗点来说,及时我TCP协议传输数据报,我只管发送,对于发送前和发送后发生的事情,我不关注。
二 TCP报文的首部格式
TCP虽然是面向字节流的,但是传送的数据单元确实报文段。一个TCP报文段分为首部和数据两部分。TCP报文首部的前20字节是固定的,后面有4*n字节是根据需要而增加的选项,所以TCP首部的最小长度是20字节。
源端口和目的端口:各占2字节。
序号:占3字节。序号范围[0,2^32-1],序号增加到2^32-1后,又回到0开始继续增加。指的是本报文段所发送的数据第一个字节的序号。例如,一个报文段的序号字段值是201,携带的数据共有100字节,那么,该数据传输过程的下一个报文段的序号应当是301,。
确认号:占4字节,是期望收到对方下一个报文段的第一个数据字节的序号。如,某一个传输过程,B收到了来自A的报文段,序号字段为301,数据长度为100字节,B对于整个100字节数据包都正确接受,因此,B期望下次收到来自A的从序号401开始的数据段,于是B在发送给A的确认报文段中把确认序号设置为401。总之一句话:当确认号为N时,则表面到序号N-1为之的所有数据包都已经正确接受完成。
数据偏移:占4位,即报文段的数据起始处举例TCP报文段的起始处有多远,实际上就是指出TCP报文段的首部长度,单位为32位字。
保留:占6位,为未来使用,目前为全0。
紧急字段:URG字段,当URG为1时,紧急指针字段生效,表示当前数据包有紧急数据,需要优先发送,不需要在按照原先排队顺序发送。
确认字段:ACK字段,仅当ACK=1时字段生效,当TCP连接见留生效时,所有报文段都必须把ACK置为1。
推送字段:PSH字段,当两个进程希望在发送一个指令后立马就能得到对方的响应,这时候就可以使用推送操作。发送放将PSH字段设置为1,并理解创建一个报文段发送出去,接收方收到PSH=1的报文段,就尽快交付接受应用程序,而不是等到整个缓存空间满了再向上交付。
复位字段:RST字段。当RST字段=1时,表示TCP连接过程中出现了严重差错,必须释放连接,然后重新建立运输连接。
同步字段:SYN字段,在建立连接时同步序号,当SYN=1,ACK=0时目标是这是一个请求连接报文段,如果对方他同意连接,则在响应报文中设置SYN=1,ACK=1,所以SYN字段为1表示这是一个请求连接字段或者接受连接报文。
终止字段:FIN字段,用来释放一个连接,当FIN=1时,表示次报文段的发送方数据已经发送完毕,并请求释放连接。
窗口:占2字节,窗口值为[0,2^16-1]之间的整数。窗口值意思为:从本报文段首部中的确认号开始,接收方目前允许对方发送的数据量。
检验和:占2字节。检验和字段检验的范围包括首部和数据两部分。和UDP用户数据报一样,在计算检验和时,要在TCP报文段前面加上12字节的伪首部。
紧急指针:占2字节,仅当紧急指针URG=1时有效。
选项:长度可变,最长可达40字节,当没有使用选项时,首部长度为20字节。
三 实战分析
本地随意抓包,如下:
首部长度共32字节,无数据部分。
源端口:59605
目的端口:80
序列号:3667362952
确认号:0
由图我们可知,此时SYN字段为1,表示当前为请求建立连接的过程,还未开始传输数据段,所以确认号字段为0。
头部长度(数据偏移):1000,十进制为8,表示8个32位字,共32字节长度。
窗口位:保留字节选项
阻塞位:保留字段选项
紧急位:0,非紧急。
确认位:0,未成功建立连接。
急迫位(推送位):0,无需立马回复。
重置位:不需要重置连接。
同部位:1,用于建立连接请求。
终止位:0,不生效,不尽兴连接释放。
窗口:64240,允许对方最大发送64240的数据量。
校验和:0xaaf3,检验和正确。
紧急指针:0,紧急指针未生效。
选项分组:选项字段。