Jack:一个TCP连接是如何建立的呢?
我:通过三次握手建立的。
Jack:“三次握手”这种说法只要有TCP常识的人都知道,从内核实现上,它是怎么实现的呢?
我:你需要弄明白两点。1、你要建立的是“TCP的连接”而不是“连接”。2、三次握手里的syn、ack、seq等到底是什么。
Jack:TCP连接和连接有区别吗?
我:有区别的。从代码层来说,只要调用了socket和bind,就建立好了一条通路(而不是连接)。也就是说,只要使用了socket和bind调用,客户端就可以把数据发送过来了(如果发送不过来,TCP连接建立就无从谈起了)。但是这条通路是不具备任何“容错处理能力”的,也就是说,数据的传输和你预期的是否一样,只能看马克思的心情好不好。
Jack:那syn、ack、seq?
我:你知道三次握手里发送的syn包、syn+ack包、ack包是什么东西吗?
Jack:这个网络教材上不是都有讲解吗?
我:你不要看意淫的教材,你就说说你自己的理解或者是代码的实现。
Jack:。。。
我:syn包就是一个syn字段被置为1的TCP段,它只是把这个段的syn标志设为1,而没有来自用户的数据,数据是空的。syn段的生产组装过程是在内核里完成的,这个过程和用户数据没有半点关系。