那些年,被我们误解的TCP

张喜硕

引言

clipboard.png

最近在结合“慕课网”的实战课程《剑指Java面试-Offer直通车》复习基础知识,在复习计算机网络时,发现原来我在书上学的TCP相关知识是不准确的,不符合面试要求。

clipboard.png

这是我学习计算机网络时使用的课本,让我们一起来见识见识真正的TCP

学习

简介

TCP:全称Transmission Control Protocol,传输控制协议。TCP是面向连接的、可靠的、基于字节流的传输层通信协议。

我们每天都在用的HTTPHTTPS都是基于运输层的TCP协议。

TCP数据包格式

每个TCP报文内都有序号和确认号,结合重传机制保障数据传输的可靠性。

clipboard.png

TCP报文中的下列三种表示十分重要。

ACK:确认序号标志
SYN:同步序号,用于建立连接过程
FINfinish标志,用于释放连接

三次握手

TCP连接中最著名的要属三次握手了!

clipboard.png

详解

第一次握手:建立连接时,客户端发送SYN ( seq = x )包到服务器,同时进入SYN_SEND状态,等待服务器确认。

第二次握手:服务器收到SYN包,必须确认客户的SYN ( ack = x + 1 ),同时自己也发送一个SYN ( seq = y )包,即SYN + ACK包,此时服务器进入SYN_RECV状态。

第三次握手:客户端收到服务器的SYN + ACK包,向服务器发送确认包ACK ( ack = y + 1 ),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。

clipboard.png

为什么需要三次握手才能建立起连接?

非常有深度的问题,非认真思考而不可达。

这是《计算机网络》一书中对此的解释。

clipboard.png

满满的两页,一句说到核心的都没有。

TCP三次握手的核心是交换ClientServer初始的Sequence Number

假设

我们假设TCP连接中没有三次握手。我们再假设通信过程中已经建立好了ClientServer的全双工通信通道。

如果ClientServer发送数据包。该数据包编号是18888,长度是100

如果是正确收到,根据TCP的机制,应该回复ACKack = 18988

clipboard.png

如果是这个数据包时第一个数据包,这样是合理的,回复18988,意味着当前的18988之前的数据包都已经收到了,下一个期待的数据编号是18988

clipboard.png

假设ClientServer同时发送了两个数据包,1878818888,而18788因为网络的问题,传丢了。那服务器端再回复ACK就不合理了。

所以,在TCP连接中通信的双方,都需要知道对方所开始发送数据的初始的Sequence Number。而为了完成这个任务,才有了TCP的三次握手。

三次握手

  1. 客户端发送它的Sequence Number初始值。
  2. 服务端确认收到。
  3. 服务端发送它的Sequence Number初始值。
  4. 客户端确认收到。

2、3两步可以进行合并,即服务端发一个TCP数据包就可以完成确认和发送自己的Sequence Number两项任务,所以就是三次握手。

总结

写书不易,出错时难免的,每位作者也都应该收到尊重。

但是毕竟作为教授万千学子的教科书,请求学校选择课本时请慎重。

阅读 1.6k

Tomorrow
明天,你好

浅梦辄止,书墨未浓。

2k 声望
417 粉丝
0 条评论

浅梦辄止,书墨未浓。

2k 声望
417 粉丝
文章目录
宣传栏