【环球快播报】字节三面,答的不满意
作者:小林coding
八股文网站:xiaolincoding.com
大家好,我是小林。
(资料图)
早上看到一个读者说面字节三面的时候,问了这个问题:
这位读者的角度是以为服务端没有调用 listen,客户端会 ping 不通服务器,很明显,搞错了。
ping 使用的协议是 ICMP,属于网络层的事情,而面试官问的是传输层的问题。
针对这个问题,服务端如果只 bind 了 IP 地址和端口,而没有调用 listen 的话,然后客户端对服务端发起了连接建立,此时那么会发生什么呢?
这个问题,自己做个实验就知道了。
我用下面这个程序作为例子,绑定了 IP 地址 + 端口,而没有调用 listen。
/*******服务器程序TCPServer.c************/#include#include #include #include #include #include #include #include intmain(intargc,char*argv[]){intsockfd,ret;structsockaddr_inserver_addr;/*服务器端创建tcpsocket描述符*/sockfd=socket(AF_INET,SOCK_STREAM,0);if(sockfd<0){fprintf(stderr,"Socketerror:%s\n\a",strerror(errno));exit(1);}/*服务器端填充sockaddr结构*/bzero(&server_addr,sizeof(structsockaddr_in));server_addr.sin_family=AF_INET;server_addr.sin_addr.s_addr=htonl(INADDR_ANY);server_addr.sin_port=htons(8888);/*绑定ip+端口*/ret=bind(sockfd,(structsockaddr*)(&server_addr),sizeof(structsockaddr));if(ret<0){fprintf(stderr,"Binderror:%s\n\a",strerror(errno));exit(1);}//没有调用listensleep(1000);close(sockfd);return0;}
然后,我用浏览器访问这个地址:http://121.43.173.240:8888/
报错连接服务器失败。
同时,我也用抓包工具,抓了这个过程。
可以看到,客户端对服务端发起 SYN 报文后,服务端回了 RST 报文。
所以,这个问题就有了答案,服务端如果只 bind 了 IP 地址和端口,而没有调用 listen 的话,然后客户端对服务端发起了连接建立,服务端会回 RST 报文。
接下来,带大家源码分析一下。
Linux 内核处理收到 TCP 报文的入口函数是 tcp_v4_rcv,在收到 TCP 报文后,会调用 __inet_lookup_skb 函数找到 TCP 报文所属 socket 。
inttcp_v4_rcv(structsk_buff*skb){...sk=__inet_lookup_skb(&tcp_hashinfo,skb,th->source,th->dest);if(!sk)gotono_tcp_socket;...}
__inet_lookup_skb 函数首先查找连接建立状态的socket(__inet_lookup_established),在没有命中的情况下,才会查找监听套接口(__inet_lookup_listener)。
查找监听套接口(__inet_lookup_listener)这个函数的实现是,根据目的地址和目的端口算出一个哈希值,然后在哈希表找到对应监听该端口的 socket。
本次的案例中,服务端是没有调用 listen 函数的,所以自然也是找不到监听该端口的 socket。
所以,__inet_lookup_skb 函数最终找不到对应的 socket,于是跳转到no_tcp_socket。
在这个错误处理中,只要收到的报文(skb)的「校验和」没问题的话,内核就会调用 tcp_v4_send_reset 发送RST中止这个连接。
至此,整个源码流程就解析完。
其实很多网络的问题,大家都可以自己做实验来找到答案的。
好了,今天周末就水到了,下次见!
相关阅读
-
世界热推荐:今晚7:00直播丨下一个突破...
今晚19:00,Cocos视频号直播马上点击【预约】啦↓↓↓在运营了三年... -
NFT周刊|Magic Eden宣布支持Polygon网...
Block-986在NFT这样的市场,每周都会有相当多项目起起伏伏。在过去... -
环球今亮点!头条观察 | DeFi的兴衰与...
在比特币得到机构关注之后,许多财务专家预测世界将因为加密货币的... -
重新审视合作,体育Crypto的可靠关系才能双赢
Block-987即使在体育Crypto领域,人们的目光仍然集中在FTX上。随着... -
简讯:前端单元测试,更进一步
前端测试@2022如果从2014年Jest的第一个版本发布开始计算,前端开发... -
焦点热讯:刘强东这波操作秀
近日,刘强东发布京东全员信,信中提到:自2023年1月1日起,逐步为...