楔子:看不见的约定
你发出一条消息,对方收到了。你怎么知道对方收到了?对方又怎么知道你知道他收到了?
这个看似绕口令的问题,是网络通信的起点。如果两个人同时说话却不知道对方有没有在听,那对话就无法成立。TCP(传输控制协议)用一个极其优雅的设计回答了这个问题——三次握手与四次挥手。
今天这篇文章,不讲复杂的报文结构,不画协议栈的七层模型,只聊一个核心问题:互联网上的两台机器,是怎么做到"我说了你听到了,你说我也听到了"的?
三次握手:建立连接的仪式
TCP要建立连接之前,通信双方必须先达成共识。这个共识不是一次就能完成的,它需要三次信息交换。
第一次握手: 客户端(比如你的手机)向服务器发送一个SYN包,相当于说"我想说话,你能听到吗"。这个包带有一个随机的序列号,比如x。
第二次握手: 服务器收到后,回复一个SYN+ACK包,相当于说"我收到了你的请求,我也准备好了,你能听到我吗"。这个包包含两个关键信息:确认号是x+1(意思是"我期待你的下一个字节序号是x+1"),以及服务器自己的序列号y。
第三次握手: 客户端再回复一个ACK包,确认号是y+1,相当于说"好的,我也听到了你的回复,现在我们正式开始说话吧"。
至此,连接建立完成,双方可以愉快地交换数据了。
为什么必须是三次,不是两次?
这个问题在计算机系里常被问起,它的答案隐藏在网络最底层的不可靠性里。
网络中的数据包可能丢失、延迟、或者顺序错乱。设想一个场景:客户端发送了第一次握手请求(SYN包),但这个包在网络中被卡了很久。客户端迟迟没有收到回复,于是超时重传,再次发送了一个新的SYN包。这次连接顺利建立,双方交换完数据后愉快地断开了连接。
但问题来了——那个被卡了很久的旧SYN包,在连接断开后突然到达了服务器。如果只握手两次,服务器收到这个过时的SYN包后,会以为客户端又想建立新连接,于是回复ACK并分配资源。而客户端这边根本不知道这件事——因为旧请求它早就放弃了。于是一条只有服务器在等待、客户端毫不知情的"幽灵连接"诞生了,白白浪费服务器的资源。
三次握手的精妙之处在于:第三次握手必须回复服务器的序列号。如果服务器收到了一条过时的SYN请求并回复了自己的序列号y,真正在通信的客户端是不知道这个y的——因为正确的客户端正在使用的序列号完全不同。所以正确的客户端不会回复ACK,服务器收不到第三次握手,就会放弃这条连接。
这就是为什么三次握手能解决"幽灵连接"问题。不是多一次浪费,是多一次保护。
四次挥手:体面的告别
当通信结束时,TCP需要四次挥手来断开连接。因为TCP连接是双向的——客户端和服务器各有一条独立的"数据流",类似于两个人各拿着一根电话线,互相在对方面前说话。所以关闭也需要双方各自关掉自己的那根线。
第一次挥手: 主动关闭方(比如客户端)发送一个FIN包,说"我的话说完了,不再发数据了"。
第二次挥手: 被动关闭方(服务器)回复一个ACK包,说"收到,你那条线关了"。但注意——服务器可能还有数据没有发完,所以它自己的那条线仍然是开着的,连接处于"半关闭"状态。
第三次挥手: 服务器终于把剩下的数据也发完了,发送FIN包,说"我也说完了,现在可以把整条连接关了"。
第四次挥手: 客户端回复ACK,然后等待一段时间(2MSL,约两倍的报文最大生存时间),确保服务器收到了这个ACK。如果服务器没收到ACK,它会重发FIN,客户端需要再次回复。等待期结束后,连接正式关闭。
四次的必要性就体现在这里:因为双方关闭的速度可能不同步,主动方关掉自己的流之后,被动方可能还有数据要传。如果只挥手两次就关闭,那些还没传完的数据就丢失了。
为什么不用UDP代替?
UDP(用户数据报协议)是TCP的对照面,也是它的宿敌。它不建立连接,不保证送达,不管顺序。发出去的数据就是一个飞出去的纸飞机——扔了就不管了。
那什么场景用UDP?打游戏、看直播、视频通话。因为这些场景可以容忍丢几个包——画面闪一下、声音卡一下、游戏里瞬移一下,不影响整体体验。但如果用TCP,丢包了就要重传,重传就会等,等就会产生延迟,延迟一高游戏就没法玩了。
而什么场景必须用TCP?打开网页、发送文件、收发邮件、每一次对准确性有要求的通信。因为如果网页的代码少了一段,页面可能整个崩掉;如果文件的几个字节错了,整个文件可能无法解压。
一个经典的类比是:TCP像寄挂号信,有回执、有编号、能追踪、确保送到;UDP像在操场上扔纸飞机,扔出去就不管了,飘到谁手里是谁的。
结语
TCP的设计是计算机科学智慧的一个缩影。它不追求最快速,不追求最简洁,而是追求在最不可靠的网络环境里,给出最可靠的承诺。
三次握手,两次确认,一次最终确认,解决了半个世纪前的幽灵包问题;四次挥手,两阶段关闭,保留了体面告别和等待确认的空间。这套看似繁琐的仪式,撑起了整个互联网的可靠通信。
你的每一次发送消息、每一次评论、每一次刷到这条动态——背后都是这套仪式在默默运行。它不声不响,但实实在在。