TCP三次握手
TCP(传输控制协议)是一种重要的网络协议,它属于互联网协议套件中的传输层,主要用于在不可靠的互联网上提供可靠的、有序的和无差错的数据传输。下面详细介绍TCP的工作原理,包括其连接建立的三次握手过程。
TCP的特点
- 面向连接:在数据传输之前,必须在两个通信端点之间建立连接。
- 字节流服务:数据被视为无结构的字节流,发送方的字节流和接收方接收的字节流完全相同。
- 可靠性:TCP通过序列号、确认应答、重传机制等确保数据传输的可靠性。
- 流量控制:TCP使用滑动窗口协议进行流量控制,确保发送方不会因为发送数据过快而淹没接收方。
- 拥塞控制:TCP还包括多种拥塞控制机制,如慢启动、拥塞避免、快速重传和快速恢复等,以适应网络状况的变化。
三次握手过程
三次握手(Three-way Handshake)是TCP建立连接的过程,它涉及发送和接收三个包。这个过程的主要目的是同步连接双方的序列号和确认号,并交换TCP窗口大小信息。三次握手的具体步骤如下:
- SYN:
- 客户端发送一个SYN(同步序列编号)报文到服务器。
- 在这个报文中,客户端将设置一个随机的序列号(例如x)。
- SYN+ACK:
- 服务器收到SYN报文后,会发送一个SYN+ACK(确认应答)报文。
- 服务器的SYN+ACK报文中,确认号设置为客户端的序列号加一(即x+1),同时服务器也选择一个随机序列号(例如y)。
- ACK:
- 客户端收到SYN+ACK报文后,向服务器发送一个ACK报文。
- 这个ACK报文的序列号是客户端原始的序列号加一(即x+1),确认号是服务器序列号加一(即y+1)。
- 三次握手完成后,TCP连接建立。
连接的终止
TCP连接的终止则通常涉及四次挥手(Four-way Handshake)。这个过程确保双方都能完全关闭连接,释放资源。
总结
通过三次握手,TCP协议能够在不可靠的网络环境中提供一种可靠的、有序的数据传输方式。这种机制使TCP成为互联网上应用最广泛的协议之一,广泛用于Web浏览、电子邮件、文件传输等。
TCP(传输控制协议)的头部包含多个关键字段,每个字段都对于维持TCP的可靠性、效率和数据完整性至关重要。以下是各个字段的详细解释:
- 16位端口号 (Port Number)
- 源端口号和目的端口号分别用于标识发送和接收的应用程序。端口号是与IP地址一起用来标识网络上的特定进程。
- 客户端通常使用由系统自动选择的临时端口号,而服务器通常使用固定端口号(如HTTP服务通常使用端口80)。
- 32位序号 (Sequence Number)
- 用于标识从TCP连接开始后发送的每个字节的位置。
- 序号是基于字节流的,每个字节都会被计数。
- 初始序列号(ISN)是随机选取的,用以增加连接的安全性。
- 32位确认号 (Acknowledgement Number)
- 用于确认接收到的数据。
- 确认号是期望收到的下一个序列号,即对方发送的最后一个字节的序列号加一。
- 4位头部长度 (Header Length)
- 也称为数据偏移,表示TCP头部的长度,以32位(4字节)为单位计量。
- 因为TCP头部可以包含不定数量的选项,所以这个字段是必需的。
- 6位标志位 (Control Flags)
- URG(紧急): 指示紧急指针字段有效。
- ACK(确认): 表示确认号字段有效。
- PSH(推送): 提示接收应用程序应该立即从TCP缓冲区读取数据。
- RST(重置): 用于重新建立连接。
- SYN(同步): 用于建立连接。
- FIN(结束): 用于关闭连接。
- 16位窗口大小 (Window Size)
- 用于流量控制。
- 表示接收端的TCP缓冲区还能接收多少字节的数据,用来控制发送端的发送速率。
- 16位校验和 (Checksum)
- 用于确保TCP头部和数据在传输过程中的完整性。
- 通过在发送和接收时计算和验证,检测数据是否在传输中被破坏。
- 16位紧急指针 (Urgent Pointer)
- 当URG标志位被设置时,这个字段表示紧急数据的结束位置相对于序列号的偏移。
- 它用于标识数据流中紧急消息的结束位置。
以上字段共同工作,确保TCP能够提供可靠、有序且无差错的数据传输服务。这些机制也使TCP成为复杂网络环境中健壮的传输协议之一。
第一次握手:
1.客户端将SYN标志位置为1
2.生成一个随机的32位的序号seq=J , 这个序号后边是可以携带数据(数据的大小)
第二次握手:
1.服务器端接收客户端的连接: ACK=1
2.服务器会回发一个确认序号: ack=客户端的序号 + 数据长度 + SYN/FIN(按一个字节算)
3.服务器端会向客户端发起连接请求: SYN=1
4.服务器会生成一个随机序号:seq = K
第三次握手:
1.客户单应答服务器的连接请求:ACK=1
2.客户端回复收到了服务器端的数据:ack=服务端的序号 + 数据长度 + SYN/FIN(按一个字节算))
为什么是三次:因为双方都要确认服务端和客户端都能够收发
TCP滑动窗口
滑动窗口(Sliding Window)是一种关键的流量控制技术,广泛应用于TCP协议中,用于优化数据传输效率和管理网络拥塞。滑动窗口机制通过允许发送方在接收到应答(ACK)之前发送多个数据包,从而提高网络的吞吐量。以下是关于滑动窗口的一些详细解释:
滑动窗口的工作原理
**滑动窗口机制允许发送方在接收任何确认应答之前连续发送一组数据包,而不是逐个等待应答。**接收方通过ACK应答告知发送方当前可以接受的窗口大小,从而控制发送方发送数据的速度和数量。
关键概念
-
窗口大小(Window Size):
- 表示接收方缓冲区中可以接受的数据字节数。
- 窗口大小由接收方动态调整,反映其当前可用的缓冲区空间。
-
发送窗口(Send Window):
- 位于发送方,用于存储已发送但未确认的数据。
- 发送窗口的大小由接收方通过ACK消息告知。
-
接收窗口(Receive Window):
- 位于接收方,用于存储已接收到但未被应用程序读取的数据。
- 接收窗口的大小会动态变化,反映出接收方的处理能力和缓冲区使用情况。
滑动窗口的具体过程
-
初始化:
- 发送方和接收方在连接建立时交换初始窗口大小。
-
发送数据:
- 发送方在发送窗口大小范围内连续发送数据包,并等待接收方的ACK。
- 每发送一个数据包,发送窗口滑动。
-
接收数据:
- 接收方接收到数据包后,将其存入接收缓冲区,并发送ACK确认收到的数据。
- ACK消息中包含新的窗口大小信息,告知发送方接收方当前能接受的字节数。
-
确认和滑动:
- 发送方收到ACK后,调整发送窗口,将窗口向前滑动到下一个未确认的字节位置,继续发送新的数据包。
示例
假设发送窗口大小为4,表示发送方可以在未收到任何ACK的情况下发送4个数据包。窗口大小根据接收方的接收能力动态调整。滑动窗口的操作如下:
-
发送数据包:
- 发送方连续发送数据包1、2、3、4。
- 等待接收方的ACK应答。
-
接收和确认:
- 接收方收到数据包1、2、3、4后,发送ACK确认,告知窗口大小为4。
- 发送方收到ACK后,窗口向前滑动4个位置,继续发送数据包5、6、7、8。
滑动窗口的优势
-
提高吞吐量:
- 通过允许发送方在等待ACK的同时发送多个数据包,提高了数据传输的并发性和吞吐量。
-
流量控制:
- 通过动态调整窗口大小,发送方可以根据接收方的处理能力控制数据发送速率,避免缓冲区溢出。
-
拥塞控制:
- 滑动窗口机制结合拥塞控制算法(如TCP的慢启动和拥塞避免),有效管理网络拥塞,确保数据传输的稳定性和效率。
总结
滑动窗口机制在TCP协议中扮演着重要角色,确保数据传输的可靠性和效率。通过动态调整窗口大小,滑动窗口能够适应网络状况的变化,优化数据传输过程中的流量控制和拥塞管理。
发送方的缓冲区:白色格子:空闲的空间灰色格子:数据已经被发送出去了,但是还没有被接收紫色格子:还没有发送出去的数据
接收方的缓冲区:白色格子:空闲的空间紫色格子:已经接收到的数据
# mss: Maximum Segment Size(一条数据的最大的数据量)
# win: 滑动窗口
1. 客户端向服务器发起连接,客户单的滑动窗口是4096,一次发送的最大数据量是1460
2. 服务器接收连接情况,告诉客户端服务器的窗口大小是6144,一次发送的最大数据量是1024
3. 第三次握手
4. 4-9 客户端连续给服务器发送了6k的数据,每次发送1k
5. 第10次,服务器告诉客户端:发送的6k数据以及接收到,存储在缓冲区中,缓冲区数据已经处理了2k,窗
口大小是2k
6. 第11次,服务器告诉客户端:发送的6k数据以及接收到,存储在缓冲区中,缓冲区数据已经处理了4k,窗
口大小是4k
7. 第12次,客户端给服务器发送了1k的数据
8. 第13次,客户端主动请求和服务器断开连接,并且给服务器发送了1k的数据
9. 第14次,服务器回复ACK 8194, a:同意断开连接的请求 b:告诉客户端已经接受到方才发的2k的数据
c:滑动窗口2k
10.第15、16次,通知客户端滑动窗口的大小
11.第17次,第三次挥手,服务器端给客户端发送FIN,请求断开连接
12.第18次,第四次回收,客户端同意了服务器端的断开请求
TCP四次挥手
四次挥手发生在断开连接的时候,在程序中当调用了close()会使用TCP协议进行四次挥手。
客户端和服务器端都可以主动发起断开连接,谁先调用close()谁就是发起。
因为在TCP连接的时候,采用三次握手建立的的连接是双向的,在断开的时候需要双向断开。
为什么要四次:确保双方数据传输完成