-
传输层是端对端的传输——进程对进程
IP:标识网络上的唯一主机。
port:标识主机上的唯一进程。
ip + port :标识网络上唯一主机上的唯一进程。
四元组:端(IP + port) 对 端(IP + port)四个信息标识了唯一的端对端通信。
五元组信息:四元组 + 协议(TCP或UDP),是TCP/IP协议栈内部用来标识传输层上唯一一个端对端 通信。
一、TCP协议
核心性质>>>>>>端对端的可靠性
网络天生传输是不可靠的,因为:
- 传输过程中通过物理介质传输,传输过程有一定概率会改变其二进制值。
- 网络上数据是经过一个一个路由器传输的,每台设备都有一定概率损坏。
- 即使数据传输成功,也不一定有序。
TCP尽可能的把数据传输到给对方优点如下:
- 解决了有序性问题——它给每一份发送的数据做了编号。
- 确认应答机制——接收方(TCP)有责任告知发送方(TCP),数据是否收到。
- 超时重传机制——若数据丢失(长时间没有收到应答),将会重新发送该数据。
二、 TCP协议Header格式
- 源端口号:说明是哪个进程发送的。
- 目的端口号:说明要发到应用层的哪个进程(分用)。
- 首部长度:记录TCPHeader长度(解包)。
- 32位序列号(SN):数据第一个字节的编号,确保发送的数据对方按序收到。
- 32位确认序列号(ASN):确认对象收到了哪些数据(确认应答),希望发送方从哪开始发送。
- 6个标志位(0或1):ACK(确认应答),SYN(请求建立连接),FIN(通知对方, 本端要关闭了),RST(发送方发送RST表示我方TCP协议栈遇到了异常 ; 接收方收到RST直接断开连接),PSH(提示接收端应用程序立刻从TCP缓冲区把数据读走),URG(紧急指针是否有效)
- 16位校验和:确保数据完整。
- 窗口大小:接收数据能力(滑动窗口机制)
- 紧急指针:标识哪部分数据是紧急数据。
三、TCP协议实现可靠性⭐⭐⭐
1、三个优点:——对应单个segment如何工作
-
解决有序性问题——关于TCP Header中SN和ASN如何进行填写
TCP协议栈内部维护了一个包用来管理序列号。SN表示发送的数据中第一个字节的编号,ASN表示接收方希望发送方下次发送的数据编号。在一次通信中,TCP对发送方的segment中的SN进行填写。接收方收到后,用接收的数据长度(在IP协议中得知)加上SN得到ASN的长度,填写到segment中,并发送给发送方。这样一来发送方就得知下次要从序列号的哪一位开始发送。保证了数据的有序性。
-
确认应答机制——接收方的职责
接收方收到TCP段后有责任发送应答数据发送给对方,其中应答数据中要填写以下字段:
① ASN = 收到数据中的SN + 收到数据中的长度②ACK标志位,置为1,
-
超时重传机制——发送方的职责
①如果在一定时间内,发送发没有收到应答segment,则需要重新发送segment。所以发送后的数据不能丢掉,一直保留到收到这份数据的应答为止。所以TCP具有发送缓存区。 在代码层面,发送成功只是成功加载到了发送缓存区,至于何时发送就不知道了。
②无论是对方没有收到,还是收到了但发送方未收到应答,统一都需要超时重传。对于第二种情况因为segment中有SN序列号的存在,所以也不会产生重复接收的现象。
③如果因为某种原因一直接收不到应答,以异常的形式通知TCP协议的应用层。
2、连接管理——对应整体的工作
-
连接的概念
TCP协议栈服务的对象是多个发送者对多个接收者。每个发送者都对应一个接受者,他们之间的交互是通过连接实现的。如下图颜色相同的线就连成了一条连接。
以通信双方位例,连接的管理过程如下图所示,每个TCP协议栈都管理自己的连接(不止一个),应用层通过socket控制TCP内部。
他是一个抽象的概念,在计算机层面通过类和对象模拟连接。实际上TCP协议栈是通过Map<五元组,Connection>或Map<Socket,Connection>来管理 ,不同的连接对象一定拥有不同的五元组,所以五元组是连接的唯一标识。
每个连接都有其生命阶段如下图所示:
-
连接状态转换
TCP连接的状态转移图如下:
-
建立连接——三次握手
在建立连接阶段,双方需要交流一些基本信息同步信息:SYN,SN,窗口大小。确认信息:确认序列号(ASN), ACK标志位。
假设有主动方与被动方,其同步过程如下图所示:
在该阶段双方需要同步:初始序列号(ISN)、数据的接受能力(window)、最长segment的长度(MSS)。通过三次握手确保将数据同步给对方。三次握手过程在应用层不可见。
-
断开连接——四次挥手
连接的关闭是应用层进程决定的,TCP协议并不能决定一个连接的关闭。那么为什么需要四次挥手才能断开连接呢?因为在建立连接的过程中,SYN和ACK标志位可以 保证(百分之百 的) 合并发送,但在断开连接时,FIN与ACK不能百分百保证合并发送,有可能被断开方数据没发送完所以不能发FIN,只能发ack,所以在标准的情况下,双方需要四次通信完成关闭连接的操作。
当断开连接时,分为主动断开方和被动分开方。因为应用层程序分开情况的不确定性,断开连接主要分三种情况,不论哪种情况,只要是主动关闭方,其状态都是TIME_WAIT状态。
结合状态转移,主要有两个状态处理连接关闭的情况 (重要重要):CLOSE_WAIT