01.传输层协议-TCP

248 阅读8分钟

「这是我参与2022首次更文挑战的第2天,活动详情查看:2022首次更文挑战

TCP(Transport Control Protocol)是一个传输层协议,提供 Host-To-Host 数据的可靠传输,支持全双工,是一个连接导向的协议。

1. 主机到主机(Host-To-Host)

TCP提供的是Host-To-Host传输,一台主机通过通过TCP发送数据给另一台主机。其中主机是一个抽象概念,可以是手机,电脑,平板等。能够进行收发数据的设备都是主机。

TCP协议往上是应用层协议(Application-To-Application),应用层协议比较有针对性,比如微信的聊天协议,传输文件的协议等,如果微信的聊天协议想要工作,那么就需要一个主机到主机的协议帮助他实现通信,而TCP上层的应用数不胜数,比如微信,抖音,网易云等,那要使用TCP能力时就需要告诉TCP是哪个应用——即端口号,端口号用于区分应用

TCP想要实现主机到主机的通信,就需要知道主机的网络地址(IP地址),但是TCP不负责实际的地址到地址(Address-To-Address)的传输,而是交给下一层互联网层处理。

互联网层也叫网络层提供地址到地址的通信,IP协议就工作在这一层。互联网层解决地址到地址的通信,但不负责信号在具体两个设备间传递,因此网络层会调用下方的链路层在两个相邻设备间传递信息。信号在设备间传递时需要介质进行传输,那么物理层就是提供最底层的传输能力

以上五层架构,互联网协议群,也称作TCP/IP 协议群。

总结:主机到主机(Host-To-Host)为应用提供应用间通信的能力。

2 连接与会话

连接是通信双方的一个约定,目标是让两个在通信的程序之间产生一个默契,保证两个程序都在线,而且尽快地响应对方的请求,这就是连接(Connection)。

设计上,连接是一种传输数据的行为。传输之前,建立一个连接。具体来说,数据收发双方的内存中都建立一个用于维护数据传输状态的对象,比如双方 IP 和端口是多少?现在发送了多少数据了?状态健康吗?传输速度如何?等。所以,连接是网络行为状态的记录

会话应用的行为, 比如微信里张三和你聊天,那么张三和你建立一个会话。你要和张三聊天,你们创建一个聊天窗口,这个就是会话。你开始 Typing,开始传输数据,你和微信服务器间建立一个连接。如果你们聊一段时间,各自休息了,约定先不要关微信,1 个小时后再回来。那么连接会断开,因为聊天窗口没关,所以会话还在

在有些系统设计中,会话会自动重连(也就是重新创建连接),或者帮助创建连接。 此外,会话也负责在多次连接中保存状态,比如 HTTP Session 在多次 HTTP 请求(连接)间保持状态(如用户信息)。

总结:会话是应用层的概念,连接是传输层的概念

3 单/双工

任何一个时刻,如果数据只能单向发送,就是单工,所以单工需要至少一条线路。如果在某个时刻数据可以向一个方向传输,也可以向另一个方向反方向传输,而且交替进行,叫作半双工;半双工需要至少 1 条线路。最后,如果任何时刻数据都可以双向收发,这就是全双工,全双工需要大于 1 条线路。当然这里的线路,是一个抽象概念,你可以并发地处理信号,达到模拟双工的目的。

TCP 是一个双工协议,数据任何时候都可以双向传输。这就意味着客户端和服务端可以平等地发送、接收信息。正因为如此,客户端和服务端在 TCP 协议中有一个平等的名词——Host(主机)。

4 可靠性

可靠性指数据保证无损传输。 如果发送方按照顺序发送,然后数据无序地在网络间传递,就必须有一种算法在接收方将数据恢复原有的顺序。另外,如果发送方同时要把消息发送给多个接收方,这种情况叫作多播,可靠性要求每个接收方都无损收到相同的副本。多播情况还有强可靠性,就是如果有一个消息到达任何一个接收者,那么所有接受者都必须收到这个消息。

5 TCP 的握手和挥手

TCP 是一个连接导向的协议,设计有建立连接(握手)和断开连接(挥手)的过程。TCP 没有设计会话(Session),因为会话通常是一个应用的行为。

5.1 TCP 协议的基本操作

基本操作:

    • 如果一个 Host 主动向另一个 Host 发起连接,称为 SYN(Synchronization),请求同步;
    • 如果一个 Host 主动断开请求,称为 FIN(Finish),请求完成;
    • 如果一个 Host 给另一个 Host 发送数据,称为 PSH(Push),数据推送。

以上 3 种情况,接收方收到数据后,都需要给发送方一个 ACK(Acknowledgement)响应。请求/响应的模型是可靠性的要求,如果一个请求没有响应,发送方可能会认为自己需要重发这个请求。

5.2 建立连接的过程(3次握手):

因为要保持连接和可靠性约束,TCP 协议要保证每一条发出的数据必须给返回,返回数据叫作 ACK(也就是响应)。

1.客户端发消息给服务端(SYN);

2.服务端准备好进行连接后,服务端针对客户端的 SYN 给一个 ACK,同时服务端发送一个 SYN 给客户端;

3.客户端准备就绪后,客户端给服务端发送一个 ACK。

双方都需要准备好之后发送自己的确认包,对方收到确认包之后确认对方已经准备好了,再进行收发数据操作。

5.3 断开连接的过程(4次挥手):

1.客户端要求断开连接,发送一个断开的请求,这个叫作(FIN);

2.服务端收到请求,然后给客户端一个 ACK,作为 FIN 的响应;

3.因为断开连接要处理的问题比较多,比如说服务端可能还有发送出去的消息没有得到 ACK;也有可能 服务端自己有资源要释放。因此断开连接不能像握手那样操作——将两条消息合并。所以,服务端经过一个等待,确定可以关闭连接了,再发一条 FIN 给客户端;

4.客户端收到服务端的 FIN,同时客户端也可能有自己的事情需要处理完,比如客户端有发送给服务端没有收到 ACK 的请求,客户端自己处理完成后,再给服务端发送一个 ACK。

6 总结

1.TCP 提供连接(Connection),让双方的传输更加稳定、安全;

2.TCP 没有直接提供会话,因为应用对会话的需求多种多样,比如聊天程序会话在保持双方的聊天记录,电商程序会话在保持购物车、订单一致,所以会话通常在 TCP 连接上进一步封装,在应用层提供;

3.TCP 是一个面向连接的协议(Connection -oriented Protocol),说的就是 TCP 协议参与的双方(Host)在收发数据之前会先建立连接。后面我们还会学习 UDP 协议,UDP 是一个面向报文(Datagram-oriented)的协议——协议双方不需要建立连接,直接传送报文(数据);

4.最后,连接需要消耗更多的资源。比如说,在传输数据前,必须先协商建立连接。因此,不是每种场景都应该用连接导向的协议。像视频播放的场景,如果使用连接导向的协议,服务端每向客户端推送一帧视频,客户端都要给服务端一次响应,这是不合理的。

7 问题

TCP 为什么是 3 次握手,4 次挥手?

答:TCP 是一个双工协议,为了让双方都保证,建立连接的时候,连接双方都需要向对方发送 SYC(同步请求)和 ACK(响应)。

握手阶段双方都没有烦琐的工作,因此一方向另一方发起同步(SYN)之后,另一方可以将自己的 ACK 和 SYN 打包作为一条消息回复,因此是 3 次握手——需要 3 次数据传输。

到了挥手阶段,双方都可能有未完成的工作。收到挥手请求的一方,必须马上响应(ACK),表示接收到了挥手请求。类比现实世界中,你收到一个 Offer,出于礼貌你先回复考虑一下,然后思考一段时间再回复 HR 最后的结果。最后等所有工作结束,再发送请求中断连接(FIN),因此是 4 次挥手。