TCP协议的基本属性 :
1、什么是TCP协议:
TCP是传输层最重要和最常用的协议;它提供一种面向连接的、可靠的、字节流数据传输服务。
2、TCP协议的特性:
- 面向连接: 使用TCP进行数据传输的客户/服务器之间,首先要建立一个TCP连接,数据传输完成后断开连接;
- 全双工: 建立连接后,两个进程之间的数据传输是双向的。
- 可靠: TCP提供了流量控制、拥塞控制、差错控制等保证数据传输的可靠性。
- 基于字节流: 建立TCP连接的应用进程之间交换的数据是字节流。
3、TCP协议的功能:
- TCP比较安全、稳定,但效率不高,占用资源较多。
- 它的作用主要是在计算机之间可靠的传输数据,将具有一定可靠性的流式通信服务提供给应用程序。
TCP报头:
- 源端口: 占16位,发送该报文段的应用程序的端口号;
- 目的端口: 占16位,接受该报文段的应用程序的端口号;
- 序列号: 占32位,数据段中的数据部分在发送方数据流中的位置,唯一标识TCP数据段的数字。
- 确认号: 占32位,下一次希望得到的、来自另一方的序列号;
- 首部长度: 占4位,以字节为单位表示TCP首部的大小;
- 标志: 占6位,定义六种不同的控制位或标志位,同一时间可以设置一位或多位标志,用在TCP的流量控制、连接建立和终止以及数据传送方式等方面;
- 窗口大小: 占16位,TCP接收方缓冲区的长度,以字节为单位;
- 校验和: 占16位,存储TCP段的校验和,包括首部和主题部分。
- 紧急指针: 占16位,是一个正的偏移量,定义了一个数,把这个数加到序列号上,就得出报文段数据中最后一个紧急字节;
- 选项: 最多占40字节,这个字段提供了一些附加设置,如确定主机可接收的报文段的最大长度。
TCP连接 :
1、TCP建立连接:
由客户端主动发起连接
- 三次握手建立连接
- 第一次握手:客户端向服务器发起连接请求报文,其中标志SYN=1,ACK=0,序列号位客户端初始序列号m;
- 第二次握手:服务器等待连接的端口收到TCP连接请求后,回应一个TCP连接应答报文,其中标志SYN=1、ACK=0,序列号为服务器初始序列号n,确认序列号为客户端初始序列号加1(m+1);
- 第三次握手:客户端收到服务器的响应报文后,向服务器发送TCP确认报文,其中标志SYN=0、ACK=1,序列号为客户端初始序列号加1(m+1),确认号为服务器初始序列号加1(n+1)。
- 半开连接: 一般将服务器收到SYN而未收到客户端的ACK时的连接状态称为半开连接。
- 服务器在发送SYN/ACK给客户端之前,就先分配一个数据区域以服务即将形成的TCP连接;
- 发生这种情况时,由于服务器不知道客户端的状态,所以会不断发送SYN/ACK段,试图完成握手过程,这样会消耗大量服务器资源;
- 人为利用这一点,就可以对服务器实施攻击,SYN洪泛攻击就是利用了这一点。
-
为什么建立连接要三次握手?
如果是两次握手的话,就有可能导致失效的连接请求又传送到服务器端(请求报文因为在网络中阻塞,如果客户端将其丢弃,重新发起新连接请求,经过一段时间,阻塞的请求报文也到达了服务器,服务器分不清这是否为有效的请求报文,所以也会响应,这就导致重复连接的问题);为了实现可靠传输,发送方和接收方始终需要同步( SYNchronize )序号,所以就有了三次握手。
2、TCP关闭连接:
客户端与服务器双方都可以关闭连接,一般情况下是客户端发起
- 四次挥手关闭连接
- 第一次挥手:客户端发送一个FIN段,主动关闭客户端到服务器的数据传送,
- 第二次挥手:服务器收到FIN段后就向应用程序传送一个文件结束符,在给客户端发回一个ACK确认段,确认号为所收到的序列号加1(m+1);
- 第三次挥手:服务器被动关闭与客户端的连接,发送一个FIN段给客户端;
- 第四次挥手:客户端收到FIN段后,回复一个确认(ACK段),确定收到了服务器的FIN段,并将确认号设置为所收到的序列号加1。
-
半关闭
TCP提供连接的一方在结束它的发送后还能接受来自另一方数据得能力,这就是所谓的半关闭。
-
为什么关闭连接是四次挥手?三次可以吗?
确保数据能够完整传输: 当被动方收到主动方的FIN报文通知时,它仅仅表示主动方没有数据再发送给被动方了。但未必被动方所有的数据都完整的发送给了主动方,所以被动方不会马上关闭SOCKET,它可能还需要发送一些数据给主动方后,再发送FIN报文给主动方,告诉主动方同意关闭连接,所以这里的ACK报文和FIN报文多数情况下都是分开发送的。
三次挥手的情况是,将四次挥手中的FIN段与ACK段合并成一个一个数据段发送给主动关闭方。
3、TCP连接复位:
FIN标志是正常关闭TCP连接,还可以使用RST标志非正常关闭连接,TCP首部中的RST标志就是用于复位的,复位主要用于快速结束连接。
TCP连接复位(非正常关闭)的几种情形:
1. 拒绝连接请求:请求连接不存在的端口(或目标端口没打开)
2. 异常关闭连接:TCP连接的某一方因为特殊原因(突然断电等)突然断开连接,另一方就会异常关闭
3. 终止空闲连接:一方TCP可能发现另一方已经空闲了很长时间,就可以发送RST段来关闭这个链接。
4、TCP状态转换:
TIME_WAIT状态:
- 主动关闭的一方在发送完FIN段的确认(ACK段)后,就会进入TIME_WAIT状态(一般是客户端),此链接不能再被使用,但并没有完全断开。
- TIME_WAIT状态又称2MSL状态;MSL是任何报文段在网络中的最长生存时间。
设置TIME_WAIT状态的意义:
- 可靠的终止TCP连接;若处于TIME_WAIT状态的客户端发送给服务器端的确认报文段(ACK段)丢失了,还可以等待下一个FIN段的到来。
- 保证让迟来的TCP报文段有足够的时间被识别并丢弃;避免从一个连接来的重复报文段可能会出现在下一个连接中造成混淆。
5、序列号与确认号机制:
-
TCP协议使用序列号和确认号来确保传输的可靠性,每一次传输数据时都会标明该段的编号,
以便对方确认,同时在确认号字段中对已收到的TCP段进行确认。 -
确认并不需要单独发送确认报文段,可以放在传到对方的TCP段中。
-
在TCP协议中并不直接确认收到哪些分段,而是通知发送方下一次该发送哪一个分段,表示前面的分段都已收到。
-
序列号和确认号确保了数据的适当排序,并防止报文段丢失。
要发送的确认号 = 已收到的序列号 + 已收到数据的字节数
TCP可靠性:
TCP采用的可靠性技术主要包括:差错控制、流量控制、拥塞控制。
1、TCP差错控制
检查和纠正差错的方法有 校验和、确认、重传。
校验和: 数据损坏可以通过TCP的校验和检测出来;若检测出报文遭到破坏,则将其丢弃。
确认: TCP采用确认来证实收到了报文段。
重传: 当某个报文段损坏、丢失、或者被延迟,就需要重传。一般有超时重传和快重传两种机制。
2、TCP流量控制
通过 滑动窗口机制 实现。
滑动窗口机制: 通过发送方窗口和接收方窗口的配合来完成传输控制。
3、TCP拥塞控制
4中机制分别是 慢启动、拥塞避免、快重传、快恢复。
慢启动: 慢启动算法就是在主机刚开始发送数据报的时候先探测一下网络的状况,如果网络状况良好,发送方每发送一次文段都能正确的接受确认报文段。那么就从小到大的增加拥塞窗口的大小,即增加发送窗口的大小(按指数增长)。当窗口大小到达慢启动最大阈值时停止进入下一阶段。
拥塞避免: 当拥塞窗口大小达到慢启动阈值时进入此阶段,这个阶段的窗口大小是按线性(加法)规律增长。
快重传: 接收方如果接收到一个乱序的分组,就返回对前一个正确分组的确认应答,当发送方连续收到3个相同的ACK,就会马上快速重传丢失数据,不必等到超时时间再重传。
快恢复: 当收到3个重复ACK时,TCP最后进入的不是拥塞避免阶段,而是快速恢复阶段。