在一个黑夜中,一个人独自呆在近千平方英尺的教室里。机械键盘的敲击声和空调电扇的声音交织在一起,营造出一种可怕的宁静。然而,黑夜本身更加可怕。这个人被称为TCP,他专注地敲击着键盘,教室里只有微弱的月光和屏幕的光亮。TCP回想起白天,他的同学UDP在白底黑字的屏幕上以难以想象的速度编写代码。他黯然地说道:“在这个名为传输层的教室里,我的连接效率比不上UDP。” TCP为了提高自己的连接效率,拼命敲击着代码。然而,进展并不明显。他的机械键盘因为长时间高强度的使用已经坏了三次,起初他还敢去咨询部门的老师换新的,但第二次他不敢了。他去竟东那里买了一个,第三次则买了个咸鱼的。突然,他停下了手。屏幕上的字符再也没有动过,教室里只剩下空调电扇的声音。“你们来了。” TCP说出这句话时没有动一下,声音低得只有他自己能听见。“是的,我们来了。” 一个声音从教室后面传来,第四排和第三排多出了两个人,他们几乎像黑影一样融入了人体工学椅子中。“你们想要什么?” “你们知道我们想要什么。” “你们知道我不会给你们。” “我们知道你不会给,但我们还是要。” “客户端和服务器端,既然你们想要,就过来拿吧,你们无非是想要我的三次握手心法。” TCP淡淡地说道。他脑海中回忆起了三次握手心法。三次握手是源自传输层教室的TCP协议心法,通过它可以建立客户端和服务器端之间的可靠连接,需要发送三个数据包,并涉及六个标志位,分别是SYN(建立连接)、ACK(确认)、PSH(传送)、FIN(结束)、RST(重置)和URG(紧急)。此外,还有序号辅助,当TCP数据量过大时,需要进行分段传输,序号字段用于重新组合TCP数据。序号字段指的是发送的第一个字节的序号。第一次握手:客户端将SYN置为1,随机生成一个序号seq=j,并将数据包发送给服务器端,客户端进入SYNSEND状态,等待服务器端确认。第二次握手:服务器端收到数据包,根据标志位SYN=1判断客户端建立连接的意图,服务器端将SYN和ACK都置为1,将ack=j+1,随机生成一个序号seq=k,并将数据包发送给客户端以确认连接请求,服务器端进入SYNRCVD状态。
第三次握手:客户端收到确认后,检查ack是否为k+1,ACK是否为1。如果正确,则将ACK置为1,ack=y+1,并将数据包发送给服务器端。服务器端检查ack是否为k+1,ACK是否为1。如果正确,客户端和服务器端就可以建立连接了。TCP想到这里,凝视着ThinkPad的屏幕。又是一片寂静,空调电扇的声音似乎更加明显了。黑影犹豫了一下,TCP甚至没有转过头去。“不可能!”他大声说道。在这个世界上,只有两种人背叛你,一个是不懂武功的傻瓜,一个是不屑于你的高手。TCP绝对不是傻瓜,黑影隐约看到TCP的13寸屏幕上明明就是编程界失传多年的绝学心法。江湖上很多人都知道Socket,但是失传已久的四次分手却只有少数人知道。客户端和服务器端惊讶地说道:“难道你已经掌握了四次分手心法?”四次分手心法是指在终止服务器和客户端的连接时,需要发送四个数据包来确认连接的断开。这个过程可以由服务器端或客户端的任意一方来实现。由于TCP连接是全双工的,所以每个方向都必须单独关闭。当一方完成数据发送任务后,发送一个FIN来终止该方向的连接。第一次分手:客户端发送一个FIN来关闭客户端到服务器端的连接,此时客户端进入FINWAIT1状态。第二次分手:服务器端收到FIN后,发送一个ACK给客户端,确认序号为收到的序号加1。服务器端进入CLOSEWAIT状态。第三次分手:服务器端发送一个FIN来关闭客户端和服务器端之间的连接,服务器端进入LASTACK状态。第四次分手:客户端收到FIN后,客户端进入TIME_WAIT状态,然后发送一个ACK给服务器端,确认序号为收到的序号加1。服务器端进入CLOSE状态。
TCP终于转过头来,但只能看到黑影的侧面。他缓缓地说道:“你们这么想要三次握手,那么我就告诉你们,其实很简单,听好了。”“你们在担心什么?”“看你们有什么了不起的。”“来,我们来聊聊。”黑影的身体一震,似乎明白了什么……全文完。