1. 概述
本文主要讲述的内容主要包含以下部分
- TCP的概念
- 连接的建立过程
- 连接的拆除过程
2. TCP协议
我们首先要明确一点,这里讨论的TCP协议并不是指TCP/IP协议簇,而是单指TCP协议,即Transmission Control Protocol,指传输控制协议,位于传输层(OSI七层模型的第四层,或是TCP/IP四层协议的第三层)
都应该清楚,传输层负责报文从进程到进程的传递,也可以说是从端口到端口的协议,所以TCP协议也属于一种端对端的协议。常用的端口号有:
- 20:FTP(文件传输协议)的数据传输
- 25:SMTP(简单邮件传输协议)
- 53:DNS(域名系统)
- 80:HTTP(超文本传输协议)
- 111:RPC(远程过程调用)
TCP是一个面向流的协议,允许发送进程以字节流的方式传递数据,同样地,接收方也以字节流的方式接收数据,这就存在了一个抽象的“管道”,管道的建立与拆除,就对应着TCP连接的创建和销毁,在接下来我们就来详细讲解这一过程
3. TCP分组
在讲解具体的过程之前,先来做一些准备工作。首先,TCP是一个全双工的通信协议,也就是连接的双方都能够发送和接收数据,这些数据,也就是字节,TCP会对其进行编号,这是因为TCP需要保证接收数据的顺序。编好号之后,TCP会为发送的每一个段分配一个序号,实际就是段中第一个字节的编号
发送的段,在TCP中也叫做分组,分组首部(首部不包含数据)的格式是如下这样的:
源端口、目的端口、序号和校验和的概念相信应该大家都能理解,这里就不再展开了,数据偏移、保留部分、紧急指针、选项,以及填充部分相对来说不太重要,感兴趣的可以自行了解。剩余相对重要的确认号、控制位(URG/ACK/PSH…)和窗口中,我们这里指讲和本文相关的前两种
如果了解过数据链路控制的相关知识,应该会知道ack的概念,就相当于我们这里的确认号,指的是我们期待接收到的分组的序号,因为我们发送的每一个分组都是为了期待对方给我们回应,为了避免接收到不正确的数据,就使用确认号机制