跳到主要内容

系统

系统

目录

[toc]

TCP

「TCP 三次握手与四次挥手面试题」的问答

来自:

小林coding

https://xiaolincoding.com/

好绕。。。🤣

小林回答:

会的,这件事情是内核做的事情,跟应用层没关系。


小林回答:

下一次的 seq = 上一次 seq + len(数据包长度)。

因为第二次挥手是 ACK 报文,len 是 0,所以第三次挥手的 seq = 上一次 seq + 0,所以还是一样的。


小林回答:

没关系的,其实三次握手、四次挥手都是操作系统的工作。进程只是告诉内核什么时候(调用 connect)发起发起连接建立,什么时候(调用 close)发起断开连接。


小林回答:

  1. 如果客户端处于 establish 状态,还收到服务端的 syn-ack 报文的话,客户端会回 challenge ack(至于什么是 challenge ack,可以看这篇:已建立连接的 TCP,收到 SYN 会发生什么?

  2. 如果服务端发送了 5 次 SYN-ACK 还是没收到回应,服务端的内核就会释放连接,不会发送任何报文。

「如何优化 TCP?」的回答

来自:

小林coding

https://xiaolincoding.com/

小林回答:

不是说「RTT 越小网络越好,应该发送更多的数据」。

而是要让网络稳定在某个期望的 RTT,比如我们期望网络的 RTT 延迟期望在 1ms,那么就以这个标准来计算带宽延时积,然后相应调整发送缓冲区大小,避免发送缓冲区大小超过带宽延时积而发生 RTT 延迟增高。

「TCP 连接,一端断电和进程崩溃有什么区别?」的问答

来自:

小林coding

https://xiaolincoding.com/

小林的回答:

总结的很好。

不过,你说的「其他进程占用了该端口,那么由于 ip+port 四元组不匹配」这里说的不太清楚,其他进程是同一个客户端的其他进程,还是不同客户端?如果是同一个客户端的其他进程,那么 ip+port 四元组是匹配的,如果是不同的客户端,那么 ip+port 四元组就是不匹配的。

进程

「进程间有哪些通信方式?」的问题

来自:

小林coding

https://xiaolincoding.com/

小林的回答:

嗯嗯,我就留言区补充下吧,udp 的 connect 不是建立连接,而是绑定 ip 和 port,也就是建立(UDP 套接字——目的地址 + 端口)之间的映射关系。

如果 UDP 不使用 connect 方式,每次发送报文都会需要这样的过程:

  • 连接套接字→发送报文→断开套接字→连接套接字→发送报文→断开套接字 →………

而如果 UDP 使用 connect 方式,就会变成下面这样:

  • 连接套接字→发送报文→发送报文→……→最后断开套接字

连接套接字是需要一定开销的,比如需要查找路由表信息。所以,UDP 客户端程序通过 connect 可以获得一定的性能提升

文件描述符

nginx 报错文件描述符不够,返回了 500 错误码

网站第一次事故:网站上线 10 分钟就挂了,原因是我没有调大 nginx 的 worker 进程的文件描述符,导致有大量客户端访问的时候,nginx 报错文件描述符不够,返回了 500 错误码。

来自:

小林coding

https://xiaolincoding.com/

为什么会有 500 错误?

收到大家反馈的错误后,我马上就去服务器查看 nginx 的 error 日志了,发现频繁报错了这个错误:“Too many open files”。

很快我就知道是文件描述符受限而导致 nginx 频繁报这个错误,每一个 TCP 连接都会占用一个文件描述符,当时发文不到 10 分钟,文章阅读就已经 1000 多了,瞬间一下子 1000 多个请求过来,就导致文件描述符被占满了,从而 nginx 就回 500 错误。

所以,要解决这个问题,就要调大文件描述符的显示。

首先,先来看看==系统的最大描述符数==:

这个是默认值,有 18 万个,那肯定不是这里受限。

然后,通过 ulimit -n 查看==当前用户的最大描述符数==:

这个也是默认值,也有 6.5 万个,说明也不是这里受限。

然后,通过 /proc//limits 这个文件查看  ==nginx 工作进程的最大描述符数==:

可以看到,最大值才 1024 个!猜测 nginx 工作进程的最大描述符数太小而导致 nginx 报 Too many open files 的错误。

要怎么调大 nginx 的工作进程的最大描述符数呢?

很简单,只需要在 nginx.conf 配置调大 worker_rlimit_nofile 的值,这个参数单跟每个工作进程可以建立的最大连接数量息息相关,我这里调大到了 65535。

然后重新 reload nginx 的配置,再查看 /proc//limits:

可以看到,nginx 的工作进程最大描述符已经设置为 65535。

调大 nginx 工作进程最大描述符后,nginx 的 error 日志就没有在报错了,至此 500 错误的问题就解决了

关于我

我的博客主旨:

  • 排版美观,语言精炼;
  • 文档即手册,步骤明细,拒绝埋坑,提供源码;
  • 本人实战文档都是亲测成功的,各位小伙伴在实际操作过程中如有什么疑问,可随时联系本人帮您解决问题,让我们一起进步!

🍀 微信二维码 x2675263825 (舍得), qq:2675263825。

image-20230107215114763

🍀 微信公众号 《云原生架构师实战》

image-20230107215126971

🍀 个人博客站点

http://47.97.48.237/ (即将上线域名:onedayxyy.cn)

image-20230917111843405

🍀 语雀

https://www.yuque.com/xyy-onlyone

image-20230912072007284

🍀 csdn https://blog.csdn.net/weixin_39246554?spm=1010.2135.3001.5421

image-20230107215149885

🍀 知乎 https://www.zhihu.com/people/foryouone

image-20230107215203185

最后

好了,关于本次就到这里了,感谢大家阅读,最后祝大家生活快乐,每天都过的有意义哦,我们下期见!