下班之后,你一阵空虚,想起远方的她,倍感思念。这日子看似有尽头,但实际经历起来,却好像没有终点。在别人欢乐的时候,你却有自己的忧伤;在你高兴的时候,有人却在经历生死的考验。
人与人之间的悲喜并不同步,但此时,你就想找个人聊天。心中有千言万语,到最后却无力吐露,深思熟虑之后,你掏出了自己的手机。
“吃了么?”
三个方块大字,带着既好奇又关心又忐忑的标点符号,冲破无尽的阻碍,冲了出去。
感情不需要言语,这个时候,忠实的互联网传播了你的忧伤和眷恋。你并不是麻花家族员工,但你隐约的猜到了数据的传播过程。在远方的她回复之前,你脑子里虚构了整个的过程。
合情合理,但为什么又感到一丝丝上头的悲伤。
看不懂的密文
你用的是华为手机,并没有使用苹果手机,因为你觉得只有她才配;你也没有升级鸿蒙系统,因为你认为那是瞎折腾的智商税。在各种红粉绿粉沸腾的时候,你只关心你的消息能不能到达。
即使是这么普通的三个字,你也不希望它像裸体一样被其他人观看。事实上,你的信息是通过加密通道传输的。由于你使用了你的账户密码进行了登录,所以这条连接,就已经存在了。
你长舒一口气,终于不TM再想一次那老掉牙的四次变三次的握手了。
这条连接应该是HTTPS的,每一个连接,生成了唯一的加密密钥。别人看到了也不知道你再说啥,发言自然放心。虽然后台有私钥的程序员能看到,但大家都忙着赚钱,谁关心你这点屁事呢?
此时,“吃了么?”会被加密成一串看不懂的报文,发送出去。这是一串TLS协议格式的数据,工作在应用层。
接下来,数据将在传输层进行传输,也就是TCP,你手机上的ip+端口号,加上服务器端的ip+端口号,构成了你们幽会的秘密通道。
奔跑吧,数据包
由于你连接的是自己的Wifi,所以你的IP地址还进行了一层PNAT转换,路由器最终把绑定在公网的IP,加上某个端口,映射到你的192网段IP,躲在路由器背后的你,竟感觉到莫名的安全感。
但是下层的网络层(IP协议),可没有什么端口号之称,你的网络包,都会被你的路由器直接发送出去。此时的端口号,已经变成了IP协议的报文内容。即使是光速,等传递到服务器的时候,端口号存在不存在,也是个未知数。其实,连这条连接的存在与否,都是个未知数。
你以为的连接,是一条直线,A和B之间稳固的一塌糊涂,但其实它只是两个点。一个点,永远无法在同一时间知晓另外一个点此时是否存活。有时候,如果没有心跳,一个点会永远的傻傻的等在那里。
海上生明月,天涯共此时?你摇了摇头,这种哲学问题,还是交给龙泉寺的方丈去想吧。IP协议通过我尽力的方式去发送信息,根据路径节点上的路由表横冲直撞,接力赛跑。说不定哪个不靠谱的节点,就把你可爱的数据包给搞丢了;或者RIP达到了15,你的数据包就被那样无情的丢掉了。
还好传输层的TCP有重传机制,ACK确保了数据包,也确保了你的爱。
然后终于到了不讲道理的连接层,因为此时,连IP地址都变成了报文,因为在这里的传输,根本不讲道理,就是赤裸裸的Frame(以太网帧)。你的数据包就是以这种原始的数据,发送了出去。
接下来的事情我们就都知道了,物理层网卡用高电压表示1,低电压表示0,最终生出了万物。
但是等等,事情并没有这么简单,没有这么顺畅。
原因就在于传输层的TCP,并不是直接把数据写到网卡,它还有一个缓冲区,比如SO_SNDBUF就表示设置套接字发送方的缓冲区大小。在对端返回ACK之前,这个缓冲区会一直存在,它不像UDP一样那么无情。
所以缓冲区这玩意儿,硬生生的在TCP之前插了个队,属于乱入的电灯泡。
嗯,是时候发送缓冲区了。由于缓冲区是在内存里,这里就是把内存的数据发往网卡的过程。TLS包在用户态生成TCP报文,发送缓冲区的时候要切换成内核态。
通过一系列的封装和网卡驱动的转换,将sk_buff搞到网卡上去。
谁去发送呢?CPU不屑于干这种活,那就通过中断交给DMA吧,CPU可以有时间去干更有意义的事情。
解包
经过99八十一难,服务器的网卡接收到相关的数据包。
它发现,目标机器,竟然是一台LVS负载均衡。
通过路由查找,它发现,后面是一台Nginx服务器。
不好意思,Nginx后面竟然是一个二层的微服务网关。
微服务网关后面,赫然有多台机器在那里伺服者,等君入瓮。
通过负载均衡策略,终于定位到了某台机器。
拿到你的用户ID,系统打算查询另外一个微服务模块组装你的个人信息,比如头像。
终于,它要处理“吃了么?“几个字了,非常的激动人心。
这条消息,会有什么效果呢?她会回复你么?还是会落入无尽的虚空?
终于,有回复了。
竟然是那伤人的一串字:”XX开启了好友验证,你还不是她的好友....“。
也好,就让整个链路上的机器们,少几次交互,多休息一下吧。
你狠狠的踢了一下脚下的猫,心想。