您的位置:首页 > 理论基础 > 计算机网络

TCP协议之<你好——再见>

2017-09-01 21:29 549 查看

1:TCP协议简介

2:TCP协议报头的结构分析

3:TCP协议三次握手

4:TCP协议四次挥手

5:抓包实验过程呈现

一、TCP协议简介

作为TCP/IP协议栈的核心协议之一,TCP协议早已成为可靠数据传输的首选协议之一,众多的协议都是基于TCP协议之上的,例如:远程连接协议Telnet、ssh协议、http协议等。

TCP传输控制协议是一种面向连接的、可靠的、基于字节流的传输层通信协议,在1981年由IETF的RFC793正式提出。

TCP协议的特性有:工作在传输层的面向连接的协议、全双工协议、半关闭、错误检查、数据打包成段为报文进行排序、确认机制、错误检查、恢复重传、流量控制、拥塞控制四部分:慢启动、拥塞控制、快速重传和快速恢复。

TCP的主要功能是在互联网中为提供可靠的、面向连接的进程间通信服务。其基本的功能如下:

1)基本数据传输

    TCP能够在通信双方间的每个方向(即全双工)传送一个连续的字节流,并将一定数量的字节封装成段然后通过互联网传输。

2)可靠性

    TCP能够将数据从损坏、丢失、重复、乱序中恢复。

3)流控制

    TCP能为数据发送者提供控制发送数据数量的手段。

4)复用

     允许一个主机内的多个进程同时使用TCP。

5)面向连接

TCP是面向连接的协议,意味着通信双方必须先建立连接,然后才能传输数据,数据传输结束后必须关闭连接。使用面向连接的方式提供服务使得TCP能够通过保存连接信息等手段,更好地提供可靠数据交付。这意味着TCP无法支持多播,多播只能使用UDP一类无连接的协议来完成。

二、TCP报头的结构分析

TCP最重要的特性就是其传输的可靠性,要想连接TCP的可靠传输过程,那我们必须先从TCP报文头部的结构分析入手。接下来由小编带大家参观一下TCP报文的头部。

对TCP报文首部的字段进行解读:

源端口 :本机应用进程端口

目的端口:目的主机应用进程端口

序列号:主机发送的数据报的序号(第几个)

确认号:发送给对方下次要发送的数据报的序列号(暗示上个数据帧已经接收到了)

数据偏移:指数据报中的数据在本报文中的起始位置,反过来也就是TCP头部的长度。TCP报文头部是以4个字节为单位的,数据偏移位为四个字节,虽大表示15,所以最大能表示TCP报文头部的长度为15*4=60字节。报文的选项位是可以不要的,所最小的长度是20字节。

保留位:顾名思义,正在保留。

URG:表示报文段中发送的数据是否包含紧急数据。后面的紧急指针字段(urgent pointer)只有当URG=1时才有效

ACK:表示是否前面的确认号字段是否有效。ACK=1,表示有效。只有当ACK=1时,前面的确认号字段才有效。TCP规定,连接建立后,ACK必须为1,带ACK标志的TCP报文段称为确认报文段。(ack小写表示确认号)

PSH:提示接收端应用程序应该立即从TCP接收缓冲区中读走数据,为接收后续数据腾出空间。如果为1,则表示对方应当立即把数据提交给上层应用,而不是缓存起来,如果应用程序不将接收到的数据读走,就会一直停留在TCP接收缓冲区中。

RST:如果收到一个RST=1的报文,说明与主机的连接出现了严重错误(如主机崩溃),必须释放连接,然后再重新建立连接。或者说明上次发送给主机的数据有问题,主机拒绝响应,带RST标志的TCP报文段称为复位报文段

SYN:在建立连接时使用,用来同步序号。当SYN=1,ACK=0时,表示这是一个请求建立连接的报文段;当SYN=1,ACK=1时,表示对方同意建立连接。SYN=1,说明这是一个请求建立连接或同意建立连接的报文。只有在前两次握手中SYN才置为1,带SYN标志的TCP报文段称为同步报文段。

FIN:表示通知对方本端要关闭连接了,标记数据是否发送完毕。如果FIN=1,即告诉对方:“我的数据已经发送完毕,你可以释放连接了”,带FIN标志的TCP报文段称为结束报文段

窗口大小:表示现在充许对方发送的数据量,也就是告诉对方,从本报文段的确认号开始允许对方发送的数据量

校验和:提供额外的可靠性

紧急指针:标记紧急数据在数据字段中的位置

选项部分:其最大长度可根据TCP首部长度进行推算。TCP首部长度用4位表示,选项部分最长为40字节

最大报文段长度:Maxium Segment Size,MSS

指明自己期望对方发送TCP报文段时那个数据字段的长度。默认是536字节。数据字段的长度加上TCP首部的长度才等于整个TCP报文段的长度。

窗口扩大:Windows Scaling

TCP首部的窗口大小字段长度是16位,所以其表示的最大数是65535。但是随着时延和带宽比较大的通信产生(如卫星通信),需要更大的窗口来满足性能和吞吐率,所以产生了这个窗口扩大选项。

时间戳: Timestamps

可以用来计算RTT(往返时间),发送方发送TCP报文时,把当前的时间值放入时间戳字段,接收方收到后发送确认报文时,把这个时间戳字段的值复制到确认报文中,当发送方收到确认报文后即可计算出RTT。也可以用来防止回绕序号PAWS,也可以说可以用来区分相同序列号的不同报文。因为序列号用32为表示,每2^32个序列号就会产生回绕,那么使用时间戳字段就很容易区分相同序列号的不同报文。

三、TCP三次握手

通过对上面TCP报文首部的字段进行了一些认识,接下来跟随小编去看看TCP是如何进行连接的。废话不多说,直接上图解释:

在TCP三次握手的建立中,主动发出请求的一方称为客户端,被动提供服务的一方是服务器端。从图中,我们可以看出,在整个建立连接的过程中,客户端和服务器端共有5种状态:Closed 、LISTEN、SYN-SENT、SYN-RCVD、ESTAB-LISHED。

CLOSED 没有任何连接状态

LISTEN 侦听状态,等待来自远方TCP端口的连接请求

SYN-SENT 在发送连接请求后,等待对方确认

SYN-RECEIVED 在收到和发送一个连接请求后,等待对方确认

ESTABLISHED 代表传输连接建立,双方进入数据传送状态

整个传输过程如下:

请求方发送请求建立连接的报文,报文中携带的标志位SYN=1,seq=0,ACK=0,由上面我们了解到SYN标志位为同步标志位,表明,客户端要与服务器建立连接,seq=0是携带包的序列号,因为这是传输过程中的第一个包,所以没有ack的值,在首次请求的时候,这是ACK标志位唯一一次等于0的时候,因为,TCP协议规定,在建立连接后,ACK标志位,必须为1。

请求端发送完请求之后,立马进入SYN-SENT 状态进行同步等待,而处于监听状态的服务器端接收到请求后,如果条件满足,就给客户端回应一个统一进入同步状态的报文,并立即进入SYN-RCVD状态。

客户端收到服务器的同意建立连接报文后,再给服务器反馈一个确认收到的报文,并立即进入ESTAB-LISHED状态。

服务器收到客户的确认后,立马进入ESTAB-LISHED。

在发送建立连接的报文中需要将SYN标志位标记为1,在确认报文中,并不需要SYN,但必须要使ACK=1。

四、TCP协议四次挥手

有聚必有散,在双方都进行传输完成后,需要断开连接,同样的为了体现TCP的可靠性,断开连接的时候也不能草草断开,必须确保双方都同意了断开,并确认断开才行。不废话,上图说明:

看到没,建立连接容易,可是断开可不是那么简单,所谓的有始有终,也许正是TCP的体现吧。猛地看去貌似有些乱,但是仔细的分析一下发现,断开的过程中一共有ESTAB-LISHED、FIN-WAIT1、FIN-WAIT2、CLOSE-WAIT、LAST-ACK、TIME-WAIT、CLOSED七种状态。

CLOSED 没有任何连接状态

FIN-WAIT-1 主动关闭,主机已发送关闭连接请求,等待对方确认

FIN-WAIT-2主动关闭,主机已收到对方关闭传输连接确认,等待对方发送关闭传输连接请求

TIME-WAIT 完成双向传输连接关闭,等待所有分组消失

CLOSE-WAIT 被动关闭,收到对方发来的关闭连接请求,并已确认

LAST-ACK 被动关闭,等待最后一个关闭传输连接确认,并等待所有分组消失

CLOSING 双方同时尝试关闭传输连接,等待对方确认

过程说明:

当一方觉得没什么服务需要的时候,请求断开连接,发送的报文中携带的FIN标志位为1,表示这是一个终结会话的报文。

当服务器收到后,一看这是一个请求断开连接的报文,这个时候服务器就会考虑,看是否还有数据需要发送或者正在发送,这个时候分两种情况,我们先说一种,另一种,在下文进行说明,当服务器还有数据需要发送或者正在发送的时候,服务器给客户端发送一个确认收到断开连接请求的报文,这个报文是不携带标志位FIN=1的,因为,只是一个确认收到客户端信息的报文,并没有同意立马断开,因为服务器有数据正在传输。

当客户端收到服务器的确认报文后,一看报文中标志位FIN没有为1,说明服务器可能还没传输完毕,于是,客户端就进入FIN-WAIT2阶段进行等待。

当服务器数据传输完毕之后,会主动向客户端发送请求断开连接的报文,并携带标志位FIN=1 的报文,这个时候服务器进入LAST-ACK(最后确认阶段),它要等客户端收到我的请求后才能断开呀,所以进入最后的确认等待阶段。

客户端收到断开连接的报文后,立马发送确认报文,确认收到了服务器的断开请求,携带标志位ACK=1的报文,并立即进入最后的TIME-WAIT阶段,这个阶段时长为两个最大传输时长(2MSL),是为了确保正在路上的数据包在断开接收端口之前能全部到达。计时一到就关闭。

服务器端收到客户端的确认报文后立即进入关闭状态,一个完整的TCP连接正式结束。

额外补充:

如果客户端和服务器端同时发送请求断开连接报文,就会同时进入closeing状态。发送确认报文,进行断开,中间的FIN-WAIT2阶段会省略。

五、抓包实验过程呈现

到这里,一个完整的TCP连接建立并且成功断开。接下来小编带你去捉几个包看看,验证这个过程,废话不说,截图为证:

    三次握手的包,头两个包带有标志位SYN=1,最后一个位ACK=1进行确认。

    哈哈,看吧,是不是与文中介绍的对上号了呢。说明这个实验是一个完美的实验,每一步都非常的准确。到这里,小编的实验就结束了,如果有什么不足的地方,请多多指教,如果你有疑问,小编很乐于帮助你解答疑惑。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  TCP协议