任务一 TCP协议
知识点
1.传输层的两个控制协议分别提供什么服务?
传输层控制协议主要有两个:
| 协议 | 服务类型 | 特点 |
|---|---|---|
| TCP(传输控制协议) | 可靠的、面向连接的服务 | 建立跨越 TCP/IP 网络的可靠双向连接,形成面向连接、可靠、有序的字节流传输通道 |
| UDP(用户数据报协议) | 不可靠的、面向无连接的服务 | 提供面向无连接、不可靠的字节流传输通道 |
TCP 和 UDP 都是建立在 IP 协议之上的两个传输层控制协议。
2.什么是套接字?端口号有什么作用?
应用程序不管使用传输层的哪一种传输协议,都要通过套接字(Socket)调用。
类比理解:如果将应用层进程类比于一座房子,那么它的套接字可以类比于它的门户。当一个进程向另一台主机上的另一个进程发送报文时,它把要传输的报文通过自己的套接字推出"门户",由互联网把报文运到目标主机;一旦报文抵达目标主机,该主机通过套接字接收并传送给接收进程。
套接字的组成:
套接字 = 主机的 IP 地址 + 特定的端口号(port)
| 组成 | 作用 |
|---|---|
| IP 地址 | 唯一标识接收进程所在的主机 |
| 端口号 | 唯一标识在该主机上运行的进程 |
端口号分配:Internet 编号分配机构(IANA)已经给广泛使用的应用程序分配了固定的端口号:
| 应用服务 | 使用的协议 | 固定端口号 |
|---|---|---|
| Web 服务进程 | HTTP | 80 |
| 邮件服务进程 | SMTP | 25 |
拓展:端口号的三种类型
| 类型 | 范围 | 说明 |
|---|---|---|
| 熟知端口(Well-known) | 0~1023 | 由 IANA 统一分配给常用服务,如 FTP 21、Telnet 23、SMTP 25、DNS 53、HTTP 80、POP3 110、HTTPS 443 |
| 登记端口(Registered) | 1024~49151 | 由 IANA 登记,供一般应用使用 |
| 动态端口(Dynamic) | 49152~65535 | 客户端进程临时申请使用,通信结束后释放 |
3.TCP为应用层提供哪些服务特性?
TCP 为应用层的程序提供了一个面向连接的、可靠的、数据流量可控的和全双工的传输服务。
| 特性 | 含义 |
|---|---|
| 面向连接 | 发送数据前必须先建立连接 |
| 可靠 | 无差错、不丢失、不重复、按序到达 |
| 数据流量可控 | 通过窗口机制控制发送速度,不超过接收端接收能力 |
| 全双工 | 双方可同时发送和接收数据 |
4.TCP连接是如何建立的(三次握手)?
TCP 是面向连接的,一个应用进程开始向另一个应用进程发送数据之前,这两个进程间必须先建立一条连接。
基本概念:
- 将启动连接的进程称为客户机进程,另一主机上的进程称为服务器进程
- 客户机和服务器进程之间通过 3 次握手方式来建立连接
- 握手的目的是同步连接双方的"序列号""确认号"和 TCP 窗口大小信息
图 4-15 所示的握手过程:
| 步骤 | 方向 | 报文段内容 | 客户机状态 | 服务器状态 |
|---|---|---|---|---|
| ① | 客户机 → 服务器 | SYN=1, seq=x | CLOSED → SYN-SENT | LISTEN |
| ② | 服务器 → 客户机 | SYN=1, ACK=1, seq=y, ack=x+1 | SYN-SENT | SYN-RCVD |
| ③ | 客户机 → 服务器 | ACK=1, seq=x+1, ack=y+1 | ESTABLISHED | ESTABLISHED |
| ④ | 双向 | 数据传送 | ESTABLISHED | ESTABLISHED |
逐步说明:
- 客户机向服务器发送一个特殊的 TCP 报文段,设置 SYN 位为 1,初始的"序列号"(假设为 x)和一个窗口大小(即用来存储从服务器递交来的报文段的缓冲区的大小)
- 服务器发送回一个特殊的 TCP 报文段,设置 ACK 位为 1,初始的"序列号"(假设为 y)、"对客户机的序列号的确认"(为 x+1)和一个窗口大小(即用来存储从客户机发送来的报文段的缓冲区的大小)
- 客户机再向服务器发送一个特殊的 TCP 报文段,设置 ACK 位为 1,"对服务器的序列号的确认"(y+1)和"序列号"(x+1)
- 一旦服务器接收到确认,连接即建立起来。通信双方完成了 3 次握手后,进入了连接建立状态,开始数据传送过程
记忆要点:三次握手 = "请求连接 → 同意并反请求 → 确认";前两次报文段都带 SYN,第三次只带 ACK;确认号总是"对方序列号 + 1"。
5.TCP报文段的组成和首部结构是怎样的?
一旦建立起一个 TCP 连接,两个应用进程之间就可以相互发送数据。
数据加工过程:
- 客户机进程通过套接字传递用户的数据流,数据一旦通过套接字,就由客户机中运行的 TCP 软件控制了
- TCP 将用户的数据加工成 TCP 报文段(TCP Segment) 下传给网络层
- 网络层将其封装在不同的 IP 数据包中,然后发送到网络中
TCP 报文段由首部字段和一个数据字段组成(图 4-16):
| 行 | 字段(按 32 位一行排列) |
|---|---|
| 第 1 行 | 源端口(0 |
| 第 2 行 | 序号(32 位) |
| 第 3 行 | 确认号(32 位) |
| 第 4 行 | 首部长度、保留未用、URG / ACK / PSH / RST / SYN / FIN(6 个标志位)、确认窗口 |
| 第 5 行 | 校验和、紧急数据指针 |
| 第 6 行 | 数据(可选部分为"选项字段") |
6.TCP首部各字段的含义是什么?
| 序号 | 字段 | 含义 |
|---|---|---|
| 1 | 源端口和目的端口 | 标识一个发送应用程序和一个接收应用程序 |
| 2 | 序号 | 字段长度为 32 位,用来确定数据传输过程中 TCP 数据报的第一个数据字节在发送端的字节流中的位置 |
| 3 | 确认号 | 如果已设置了 ACK 位,这个字段用于识别发送端期望接收的下一个数据字节的序号 |
| 4 | 首部长度 | 规定了以 32 位为单位的 TCP 头部的长度 |
| 5 | URG | 当该位被置 1 时,紧急数据指针有效 |
| 6 | ACK | 当该位被置 1 时,确认号有效 |
| 7 | PSH | 当该位被置 1 时,通知接收端的 TCP 模块立即将数据传输到应用程序;否则接收端 TCP 模块暂时缓存此数据,直至缓存中累积了足够的数据再传输 |
| 8 | RST | 当该位被置 1 时,用来通知接收端 TCP 模块因一些异常情况而终止连接 |
| 9 | SYN | 当该位被置 1 时,请求建立一个连接 |
| 10 | FIN | 当该位被置 1 时,用来由发送端通知接收端,此时发送端已经没有数据要发送 |
| 11 | 确认窗口 | 指定了发送端目前可以接收的字节数,该字段可以用来控制数据流的发送速度和拥塞 |
| 12 | 校验和 | 用来检查 TCP 数据报在传输过程中是否发生了错误 |
| 13 | 紧急数据指针 | 当 URG 位被置 1 时,紧急数据指针字段的值加上序号字段的值指向"紧急数据"(需要立即投递的数据)的最后一个字节 |
| 14 | 选项字段 | 可以被用来提供头部没有包括的其他功能,被保留使用 |
6 个标志位速记:URG(紧急)、ACK(确认有效)、PSH(急推)、RST(重置)、SYN(同步/建链)、FIN(结束/拆链)。
7.TCP如何实现可靠数据传输?
TCP 为了确保服务的可靠性,使用了一种称为"重传肯定确认"的机制。
工作机制:
- 每一个 TCP 报文段包含一个校验值,接收方用它来验证数据是否遭到破坏
- 如果接收到的数据段没有遭到破坏,接收者就发送一个肯定确认应答给发送者
- 如果遭到破坏,接收者就废弃该段
- 过了一段时间后,发送端 TCP 就重新发送没有收到肯定确认的任何报文段
流量控制:TCP 利用滑动窗口协议来控制收发双方之间的数据流传输速度,控制发送端发送数据流的速度不会超过接收端的接收能力。
8.TCP连接是如何终止的(四次挥手)?
当客户机进程和服务器进程传输数据完毕后,客户机进程将主动终止 TCP 连接,以释放链路资源(图 4-17)。整个过程共 4 个报文段,故称"四次挥手"。
状态迁移:
| 客户机 | 服务器 |
|---|---|
| ESTABLISHED → FIN-WAIT-1 → FIN-WAIT-2 → TIME-WAIT(等待 2MSL) → CLOSED | ESTABLISHED → CLOSE-WAIT → LAST-ACK → CLOSED |
逐步说明:
- 客户机主动释放连接,发送"TCP 连接释放报文段":终止标志位 FIN=1 表明这是一个"TCP 连接释放报文段",确认标志位 ACK=1,序号 seq=u,确认号 ack=v,表明对之前收到的报文段的确认。此时 TCP 客户端进入**终止等待 1(FIN-WAIT-1)**状态(终止标志位 FIN=1 的报文段即使不携带数据也要消耗一个序号)
- 服务器收到"TCP 连接释放报文段"后,会发送一个"TCP 确认报文段",并进入**关闭等待(CLOSE-WAIT)**状态:确认标志位 ACK=1,序号 seq=v,确认号 ack=u+1
- 服务器此时向上通知应用进程,客户机要断开连接。此时 TCP 连接处于半关闭状态——客户机进程已经没有数据要发送了,但 TCP 服务进程还可以继续发送数据,TCP 客户进程得继续接收数据
- 客户机收到"TCP 确认报文段"后就进入**终止等待 2(FIN-WAIT-2)**状态
- 服务器如果没有要发送的数据了,TCP 服务进程发送"TCP 连接释放报文段"给客户机,并进入**最后确认(LAST-ACK)**状态:终止标志位 FIN=1,确认标志位 ACK=1,序号 seq=w(半关闭状态下 TCP 服务器进程又发送了一些数据),确认号 ack=u+1
- 客户机收到服务器发送的"TCP 释放报文段"后,要发送一个普通的"TCP 确认报文段",此时客户机进入**时间等待(TIME-WAIT)**状态:确认标志位 ACK=1,序号 seq=u+1,确认号 ack=w+1
- 服务器收到客户机发送的"TCP 确认报文段",就进入**关闭(CLOSE)**状态
- 客户机还要等待 2 倍 MSL 时间(2MSL),最多约 4 分钟,最终进入**关闭(CLOSE)**状态
MSL 的定义:MSL(Maximum Segment Lifetime,最长报文段寿命)是报文在网络上存在的最长时间,超过这个时间报文将被丢弃。
为什么要等 2MSL:
- 保证最后一个 ACK 报文段能够到达服务器(若丢失,服务器会重发 FIN,客户机还能再次应答)
- 使本连接持续时间内所产生的所有报文段都从网络中消失,避免影响下一个新连接
9.三次握手与四次挥手有什么区别?
| 比较项 | 三次握手(建立连接) | 四次挥手(释放连接) |
|---|---|---|
| 报文段数 | 3 个 | 4 个 |
| 发起方 | 客户机主动发起 | 客户机主动关闭 |
| 关键标志位 | SYN、ACK | FIN、ACK |
| 核心目的 | 同步双方的序列号、确认号和窗口大小 | 双方各自确认"没有数据要发了"并释放资源 |
| 为什么次数不同 | 服务器收到 SYN 后可一并回送 SYN+ACK,故 3 次即可 | 服务器收到 FIN 后可能还有数据要发,只能先回 ACK,待数据发完再发 FIN,故需 4 次 |
| 特殊状态 | SYN-SENT、SYN-RCVD | CLOSE-WAIT(半关闭)、TIME-WAIT(等 2MSL) |
10.TCP工作过程要点速查表
| 项目 | 关键内容 |
|---|---|
| 套接字 | IP 地址 + 端口号 |
| Web / 邮件服务端口 | 80 / 25 |
| 握手次数 | 3 次(SYN → SYN+ACK → ACK) |
| 挥手次数 | 4 次(FIN → ACK → FIN+ACK → ACK) |
| 序号字段长度 | 32 位 |
| 首部长度的单位 | 32 位(4 字节) |
| 可靠传输机制 | 重传肯定确认 |
| 流量控制机制 | 滑动窗口协议 |
| 等待时间 | 2MSL,最多约 4 分钟 |
| 半关闭状态 | 一方不再发送数据,但仍可接收数据 |