本篇内容包括:TCP/IP 传输协议(TCP/IP 传输协议简介,IP 协议,UDP 协议,TCP 协议介绍),TCP 的三次握手、TCP 的四次挥手 以及 TCP 协议是怎么保证有效传输等内容。
一、TCP/IP 传输协议
1、TCP/IP 传输协议简介
TCP/IP(Transmission Control Protocol/Internet Protocol,传输控制协议/网际协议)是指能够在多个不同网络间实现信息传输的协议簇。TCP/IP 协议不仅仅指的是 TCP 和 IP 两个协议,而是指一个由 FTP、SMTP、TCP、UDP、IP 等协议构成的协议簇, 只是因为在 TCP/IP 协议中 TCP 协议和 IP 协议最具代表性,所以被称为 TCP/IP 协议。
TCP/IP 传输协议是严格来说是一个四层的体系结构,应用层、传输层、网络层和数据链路层都包含其中。
2、关于 IP 协议
IP 协议也就是我们所说的网络层协议,它的主要目的就是将一个 IP 地址的数据发送到另外一个 IP 地址所代表的设备,这两个 IP 地址有可能是隶属于同一个网段,也有可能隶属于不同的网段
IP 协议,制定了一套新地址,使得我们能够区分两台主机是否同属一个网络,这套地址就是网络地址,也就是所谓的 IP 地址。IP 协议将这个 32 位的地址分为两部分,前面部分代表网络地址,后面部分表示该主机在局域网中的地址。如果两个 IP 地址在同一个子网内,则网络地址一定相同。为了判断 IP 地址中的网络地址,IP 协议还引入了子网掩码,IP 地址和子网掩码通过按位与运算后就可以得到网络地址。
3、关于 UDP 协议是什么
UDP 即用户数据报协议,UDP 协议定义了端口,同一个主机上的每个应用程序都需要指定唯一的端口号,并且规定网络中传输的数据包必须加上端口信息,当数据包到达主机以后,就可以根据端口号找到对应的应用程序了。UDP 协议比较简单,实现容易,但它没有确认机制,数据包一旦发出,无法知道对方是否收到,因此可靠性较差,为了解决这个问题,提高网络可靠性,TCP 协议就诞生了。
4、关于 TCP 协议是什么
TCP 即传输控制协议,是一种面向连接的、可靠的、基于字节流的传输层通信协议,简单来说 TCP 就是有确认机制的 UDP 协议。TCP 数据包和 UDP 一样,都是由首部和数据两部分组成,唯一不同的是,TCP 数据包没有长度限制,理论上可以无限长,但是为了保证网络的效率,通常 TCP 数据包的长度不会超过 IP 数据包的长度,以确保单个 TCP 数据包不必再分割。 当一个连接被建立或被终止时,交换的报文段只包含 TCP 头部,而没有数据。
一个 TCP 连接由一个 4 元组构成,分别是两个 IP 地址和两个端口号。一个 TCP 连接通常分为三个阶段:连接、数据传输、退出(关闭)。通过三次握手建立一个连接,通过四次挥手来关闭一个连接。
TCP协议头最少 20 个字节,包括以下的区域:
- TCP 源端口(Source Port):16 位的源端口其中包含初始化通信的端口。源端口和源IP地址的作用是标示报问的返回地址;
- TCP 目的端口(Destination port):16 位的目的端口域定义传输的目的。这个端口指明报文接收计算机上的应用程序地址接口;
- TCP 序列号(序列码,Sequence Number):32位 的 seq 序列号由接收端计算机使用,重新分段的报文成最初形式。当 SYN 出现,序列码实际上是初始序列码(ISN),而第一个数据字节是 ISN 1。这个序列号(序列码)是可以补偿传输中的不一致;
- TCP 确认序号(Acknowledgment Number):32 位的序列号由接收端计算机使用,重组分段的报文成最初形式,如果设置了 ACK 控制位,这个值表示一个准备接收的包的序列码;
- 头长度(Header Length):表示 TCP 头的四字节数,如果转化为字节个数需要乘以 4(如果没有任何选项字段,TCP 头部长度为 20 字节;最多可以有 60 字节的 TCP 头部);
- 标志位:共 6 个,即 URG、ACK、PSH、RST、SYN、FIN
- URG:紧急指针(urgent pointer)有效,0 为不使用,1 为使用;
- ACK:确认序号有效,确认序号 ack 与标志位中的 ACK 不同,确认方 ack = 发起方 seq 1,两端配对,0 为请求,1 为应答;
- PSH:接收方应该尽快将这个报文交给应用层;
- RST:重置连接(连线复位,首先断开连接,然后重建);
- SYN:发起一个新连接(同步连线序号,用来建立连线);
- FIN:结束/释放一个连接(如果 FIN 为 0 是结束连线请求,FIN 为 1 表示结束连线);
- 窗口大小(Window):目的机使用 16 位的域告诉源主机,它想收到的每个 TCP 数据段大小;
- 校验和(Check Sum):这个校验和和IP的校验和有所不同,不仅对头数据进行校验还对封包内容校验;
- 紧急指针(Urgent Pointer):当 URG 为 1 的时候才有效。TCP 的紧急方式是发送紧急数据的一种方式。
二、TCP 的三次握手
1、TCP 三次握手概述
三次握手的本质是确认通信双方收发数据的能力。
- 首先,我让信使运输一份信件给对方,对方收到了,那么他就知道了「我的发件能力」和「他的收件能力」是可以的
- 然后,他给我回信,我若收到了,我便知「我的发件能力」和「他的收件能力」是可以的,并且「他的发件能力」和「我的收件能力」是可以。
- 最后,我回馈一次,他若收到了,他便清楚了「他的发件能力」和「我的收件能力」是可以的
次数 | 我的发件能力可以 | 我的收件能力可以 | 他的发件能力可以 | 他的收件能力可以 |
---|---|---|---|---|
第一次 | 他知道 | 他知道 | ||
第二次 | 我知道 | 我知道 | 我知道 | 我知道 |
第三次 | 他知道 | 他知道 |
2、TCP 三次握手的详细过程
三次握手详细过程:
- 第一次握手,客户端向服务端发起连接请求:
- 首先,客户端会生成一个随机起始序列号 ISN(比如是100),
- 然后客户端向服务端发送报文,此时报文段包含 SYN 标志位(也就是 SYN=1),序列号 seq=100;
- 第二次握手,服务端收到客户端发来的报文:
- 首先,服务端发现 SYN=1,确定这是一个连接请求,于是服务端将客户端的起始序列号 100 存起来,并且随机生成一个服务端的起始序列号(比如是200)
- 然后,服务端给客户端回复一段报文,回复报文包含 SYN 和 ACK 标志(也就是SYN=1,ACK=1)、序列号 seq=200、确认号 ack=101(客户端发过来的序列号 1);
- 第三次握手,客户端收到服务端的回复报文:
- 首先:客户端发现 ACK=1 并且 ack=101,于是知道服务端已经收到了序列号为 100 的那段报文;
- 同时,客户端发现 SYN=1,知道了服务端同意了这次连接,于是就将服务端的序列号 200 给存下来;
- 然后,客户端再回复一段报文给服务端,报文包含 ACK 标志位(ACK=1)、ack=301(服务端序列号 1)、seq=101(第一次握手时发送报文是占据一个序列号的,所以这次 seq 就从 101 开始,需要注意的是不携带数据的 ACK 报文是不占据序列号的,所以后面第一次正式发送数据时 seq 还是 101);
- 最后,当服务端收到报文后发现 ACK=1 并且 ack=201,就知道客户端收到序列号为 200 的报文了,就这样客户端和服务端通过 TCP 建立了连接。
三、TCP 的四次挥手
四次挥手的目的是关闭一个连接
比如客户端初始化的序列号 ISA=100,服务端初始化的序列号 ISA=200。TCP 连接成功后客户端总共发送了 1000 个字节的数据,服务端在客户端发 FIN 报文前总共回复了 2000 个字节的数据:
- 第一次挥手:当客户端的数据都传输完毕后,客户端向服务端发出连接释放报文,报文包含 FIN 标志位(FIN=1)、序列号 seq=1101(100 1 1000,其中的,100 时初始序列号 ISA,1000 是目前总共发送了 1000 个字节的数据, 1 是建立连接时占的一个序列号)Ps:客户端发出 FIN 报文段后只是不能发数据了,但是还可以正常收数据;另外 FIN 报文段即使不携带数据也要占据一个序列号;
- 第二次挥手:服务端收到客户端发的 FIN 报文后给客户端回复确认报文,确认报文包含 ACK 标志位(ACK=1)、确认号 ack=1102(客户端 FIN 报文序列号 1101 1)、序列号 seq=2200(200 2000)。此时服务端处于关闭等待状态,而不是立马给客户端发 FIN 报文,这个状态还要持续一段时间,因为服务端可能还有数据没发完;
- 第三次挥手:务端将最后数据(比如50个字节)发送完毕后就向客户端发出连接释放报文,报文包含 FIN 和 ACK 标志位(FIN=1,ACK=1)、确认号和第二次挥手一样 ack=1102、序列号 seq=2350(2300 50);
- 第四次挥手:客户端收到服务端发的 FIN 报文后,向服务端发出确认报文,确认报文包含 ACK 标志位(ACK=1)、确认号 ack=2351、序列号 seq=1102。Ps:客户端发出确认报文后不是立马释放 TCP 连接,而是要经过 2MSL(最长报文段寿命的 2 倍时长)后才释放 TCP 连接。而服务端一旦收到客户端发出的确认报文就会立马释放 TCP 连接,所以服务端结束 TCP 连接的时间要比客户端早一些。
四、TCP 协议是怎么保证有效传输
1、TCP 协议是怎么保证有效传输的?
TCP 是通过序列号、确认应答、重发控制、连接管理以及窗口控制等机制实现可靠性传输的。
- 确认应答:TCP 实现可靠传输的方式之一,是通过序列号与确认应答。
- 连接管理:三次握手、四次挥手
- 重传机制:但在复杂的网络环境下,并不一定能正常的数据传输,万一数据在传输过程中丢失了呢?所以 TCP 针对数据包丢失的情况,会用重传机制解决。
- 超时重传:如果发送方发送数据一段时间后没有收到 ACK,那么就重发数据。
- 此外还有:快速重传、SACK、D-SACK;
- 滑动窗口:我们都知道 TCP 是每发送一个数据,都要进行一次确认应答。当上一个数据包收到了应答了, 再发送下一个。这个模式就有点像我和你面对面聊天,你一句我一句。这样的传输方式有一个缺点:数据包的往返时间越长,通信的效率就越低。 为解决这个问题,TCP 引入了窗口这个概念。即使在往返时间较长的情况下,它也不会降低网络通信的效率。那么有了窗口,就可以指定窗口大小,窗口大小就是指无需等待确认应答,而可以继续发送数据的最大值。窗口的实现实际上是操作系统开辟的一个缓存空间,发送方主机在等到确认应答返回之前,必须在缓冲区中保留已发送的数据。如果按期收到确认应答,此时数据就可以从缓存区清除。
- 流量控制:发送方不能无脑的发数据给接收方,要考虑接收方处理能力。如果一直无脑的发数据给对方,但对方处理不过来,那么就会导致触发重发机制,从而导致网络流量的无端的浪费。为了解决这种现象发生,TCP 提供一种机制可以让「发送方」根据「接收方」的实际接收能力控制发送的数据量,这就是所谓的流量控制。 接收方会在返回 ACK 时同时把自己的即时窗口填入,发送方就根据报文中窗口的大小控制发送速度。
- 拥塞控制:前面的流量控制是避免「发送方」的数据填满「接收方」的缓存,但是并不知道网络的中发生了什么。一般来说,计算机网络都处在一个共享的环境。因此也有可能会因为其他主机之间的通信使得网络拥堵。在网络出现拥堵时,如果继续发送大量数据包,可能会导致数据包时延、丢失等,这时 TCP 就会重传数据,但是一重传就会导致网络的负担更重,于是会导致更大的延迟以及更多的丢包,这个情况就会进入恶性循环被不断地放大… 所以,TCP 不能忽略网络上发生的事,它被设计成一个无私的协议,当网络发送拥塞时,TCP 会自我牺牲,降低发送的数据量。于是,就有了拥塞控制,控制的目的就是避免「发送方」的数据填满整个网络。 拥塞窗口 cwnd 是发送方维护的一个的状态变量,它会根据网络的拥塞程度动态变化的。其实只要「发送方」没有在规定时间内接收到 ACK 应答报文,也就是发生了超时重传,就会认为网络出现了用拥塞。