思维导图:
5.3 传输控制协议TCP概述笔记
目的和方法概述
- 简介:TCP是一个复杂的协议,需先理解基础概念后再深入其可靠性、流量控制、拥塞控制等高级特性。
- 学习方法:分步骤逐渐深入,从基础特性理解到实现机制。
5.3.1 TCP最主要的特点
-
面向连接:
- 必须建立连接才能通信,类似于打电话的过程。
- 连接建立后,数据传输结束需释放连接。
-
点对点通信:
- 每个TCP连接只有两个端点,是一对一的通信。
-
可靠交付服务:
- 数据准确无误,不会丢失,不会重复,且按序到达。
- 通过序列号、确认应答、重传机制等实现。
-
全双工通信:
- 双方都可以同时发送和接收数据。
- 通过维护发送和接收缓冲区来管理数据。
-
面向字节流:
- TCP不关心传输的数据结构,只管字节序列。
- 发送方和接收方的数据块大小可能不一致。
- 接收方应用程序需要能够处理字节流并重建成有意义的数据。
图5-8 TCP面向字节流的概念说明:
- 示意图展示了TCP如何将应用数据处理成字节流并发送。
- 强调了TCP的发送策略是与UDP不同的,它基于窗口大小和网络拥塞控制决定报文段的大小。
- TCP报文段在网络上传输时还会加上IP首部,进一步封装到数据链路层。
- 虽然示意图中报文段较小,但实际中TCP报文段可包含上千个字节。
注意事项:
- 虽然TCP提供可靠交付,但不保证实时性或最短延迟。
- TCP的可靠性和控制特性可能引入额外的延迟和开销。
- 了解TCP的首部结构对于理解其功能至关重要。
我的理解:
让我们用一些日常生活中的比喻来理解TCP的工作原理:
-
面向连接(打电话): 想象你在打电话前,需要先拨号建立连接。对方接听后,你们开始通话。这就像是TCP的三次握手过程,确保双方都准备好了数据交换。通话结束后,你们要挂断电话,这类似于TCP连接的终止过程。
-
点对点(邮寄信件): 把TCP连接想象成寄一封信。信件从你(发送方)通过邮局发送到你的朋友(接收方)。就像TCP连接一样,信件只在你和你的朋友之间传递,没有第三方参与。
-
可靠性(快递服务追踪): 就像使用带有追踪服务的快递,即便包裹经过多个转运站,最终都能确保送达。如果包裹丢失,快递公司会找到它或者发送替代品。这就像是TCP的重传机制,确保所有数据都能准确到达。
-
有序传输(装配线): 想象一个装配线,部件必须按照一定的顺序组装。就算某个部件晚到了,装配工也会等待并按顺序装配好每个部件。TCP在接收数据时也是这样,即使数据包到达顺序不对,它们也会被重新排列,以保证最终数据的正确顺序。
-
流量控制(交通信号灯): 就像交通信号灯控制车辆流量,避免交通拥堵一样,TCP使用滑动窗口机制来控制数据流,以免网络或接收方处理不过来。
-
拥塞控制(人流控制): 想象一个音乐会入口,在人太多时需要限制进入速度以避免拥挤。TCP的拥塞控制也是如此,它能感知网络中的拥堵并调整数据发送速度。
-
全双工通信(双向车道): 把TCP连接想象成一条双向车道,允许汽车同时往来。即使在同一时刻,两辆车也可以互相穿过,类似于TCP连接的双方可以同时发送和接收数据。
-
面向字节流(电影流): 就像你在网上观看电影,虽然影片是由一帧帧图片组成的,但你感受到的是连续的视频流。TCP将数据作为一个连续的流处理,而不关心数据的具体边界。
5.3.2 TCP的连接
TCP连接的基础概念
- 面向连接的协议:TCP是一个面向连接的协议,这意味着在数据传输之前,必须在两个端点之间建立一个连接。
- 端点的定义:在TCP中,端点不是指主机、IP地址、应用进程或端口,而是指套接字(socket)。
套接字(Socket)
- 定义:套接字是IP地址与端口号的组合,用于唯一标识网络中的一个端点。
- 表示方法 :套接字通过点分十进制的IP地址后接端口号表示,两者之间用冒号分隔。例如,IP为192.3.4.5、端口号为80的套接字表示为
(192.3.4.5:80)
。 - 数学表示 :
- 套接字:
socket = (IP地址:端口号)
- TCP连接:由两端的套接字唯一确定,
TCP连接 := {socket₁, socket₂} = {(IP1:port₁), (IP2:port₂)}
- 套接字:
TCP连接的唯一性
- 每一条TCP连接是通过通信双方各自的套接字唯一确定的,这两个套接字分别是连接两端的端点。
- 在网络中,同一个IP地址可以有多个不同的TCP连接;同样,同一个端口号也可以用于多个不同的TCP连接。
抽象层次
- 协议软件的抽象:TCP连接是由网络协议软件提供的一种抽象概念。
- 端点的抽象 :尽管在讨论时我们可能会提到"应用进程之间的TCP连接",但实际上TCP连接的端点是由套接字抽象表示的,即
(IP地址:端口号)
。
套接字(Socket)的多重含义
- 应用编程接口(API):Socket作为应用程序访问网络协议的API,是传输层和应用层之间的接口,通常称为socket API。
- 函数名称 :在socket API中,有一个函数名也叫做
socket
。 - 函数调用的端点 :调用
socket
函数创建的端点被称为socket(例如,"创建一个数据报socket")。 - 返回值 :调用
socket
函数时,返回的文件描述符也被称为socket。 - 系统实现:在操作系统内核中的网络协议实现,尤其是Berkeley实现,也被称为socket实现。
注意事项
- 概念区分:上述不同层次和场景中的"socket"概念应当加以区分,以避免混淆。特别是与RFC 793中定义的套接字(端口号拼接到IP地址)是不同的。
我的理解:
-
建立连接:当你拨打电话之前,需要有一个电话号码,这个电话号码就像是网络中的IP地址和端口号组成的套接字。当你拨号时,电话网络会为你和接听人建立一条连接,这个过程就像是TCP三次握手的过程,它确保了你和对方都准备好接收和发送信息。
-
通信过程:一旦连接建立,你和对方就可以开始通话了。你们可以互相听到对方的声音,确保信息准确无误地传达。在TCP连接中,这对应于数据的传输,TCP保证数据按顺序、完整地到达对方那里,如果有什么错误或丢失,就会要求重新发送,就像如果电话里听到的声音断断续续或不清楚时,你可能会说"你能再说一遍吗?"
-
结束通话:通话结束时,你会挂断电话,而对方也会挂掉电话,这样电话线路就被释放了。在TCP连接中,这个"挂断"过程对应于四次挥手的过程,它确保双方都同意关闭连接,并且所有的数据都已经传输完毕。
就像一次电话通话从拨号到挂断的全过程,TCP连接保证了数据通信的可靠性。每次通话都是独立的,就像网络中每个TCP连接都是独立的,有自己的起点和终点(套接字)。而多个电话通话可以同时进行,就像一台主机可以同时有多个TCP连接。