1、数据库中的锁?
- xxxx
- xxx
- xzzzzzzz
Mysql哪儿使用了乐观锁机制…
2、三次握手异常 && 四次挥手异常
https://blog.csdn.net/weixin_39406430/article/details/119900938
https://mp.weixin.qq.com/s/3rM_RlwejkMFWm0GdwK6Hg
- 第一次握手失败:
- 客户端触发超时重传 SYN
- 第二次握手失败:
- 双方均会触发重传
- 第三次握手失败:
- 服务端超时重传SYN+ACK
- 第一次挥手
- 如果第一次挥手丢失了,那客户端迟迟收不到服务端的ack报文,也会触发超时重传机制,重传FIN报文,当重传次数达到一定次数的时候,就不在发送FIN报文,直接进入close状态
- 第二次挥手
- 当服务器收到客户端的第一次挥手后,就会发送给服务端一个ACK报文,此时服务端进入CLOSE_WAIT状态,前面我们也强调过,ACK报文是不会重传的,所以会触发客户端的超时重传机制。
- 客户端一直重传?
- 第三次挥手
- 服务端处于CLOSE_WAIT状态时,调用close函数,内核就会发出FIN报文,同时连接进入LAST_ACK状态,等待客户端返回ack报文来确认关闭连接。如果迟迟收不到这个ack,服务端就会重发FIN报文。
- 第四次挥手
- 触发服务端的超时重传机制重传FIN报文。
为什么要有三次握手
- 如果只有两次,已经失效的请求连接报文在服务端建立起正常连接
- 同步序列号
3、close() && shutdown()
- https://www.cnblogs.com/xcywt/p/8127773.html
- https://www.jb51.net/article/40775.htm
https://www.zhihu.com/question/437091851/answer/1652250018
- close() 只能让套接字的引用计数减去,只有当套接字引用计数为0时才会发送FIN给连接方,shut直接发送FIN数据报
- close()会关闭当前的进程的文件描述符,shutdown不会处理文件描述符
- close()读写均关闭,shutdown可选择
4、fork() 父子进程共有什么?
- https://subingwen.cn/linux/process/#2-2-fork-%E5%89%96%E6%9E%90
- COPY ON WRITE
- fork()和vfork()
5、close_wait() 和 time_wait() 怎么处理?
time_wait:
TIME_WAIT是主动关闭连接的一方保持的状态,对于爬虫服务器来说他本身就是“客户端”,在完成一个爬取任务之后,他就会发起主动关闭连接,从而进入TIME_WAIT的状态,然后在保持这个状态2MSL(max segment lifetime)时间之后,彻底关闭回收资源。
那么,如果你用一台机器做压测的客户端,你一分钟能发送多少并发连接请求?如果这台是一个负载均衡服务器,一台负载均衡服务器,一分钟可以有多少个连接同时访问后端的服务器呢?所以大量TIME_WAIT会影响服务器网络性能
问题
1)占用连接
处于TIME-WAIT状态的TCP连接,在链接表槽中存活1分钟,意味着另一个相同四元组(源地址,源端口,目标地址,目标端口)的连接不能出现,也就是说新的TCP(相同四元组)连接无法建立。
再次回想一下前面的问题,如果一条连接,即使在四次握手关闭了,由于TIME_WAIT的存在,这个连接,在1分钟之内,也无法再次被复用,那么,如果你用一台机器做压测的客户端,你一分钟能发送多少并发连接请求?如果这台是一个负载均衡服务器,一台负载均衡服务器,一分钟可以有多少个连接同时访问后端的服务器呢?所以大量TIME_WAIT会影响服务器网络性能。
端口复用???
2)占用内存
一条Socket处于TIME_WAIT状态,它也是一条“存在”的socket,内核里也需要有保持它的数据:
3)占用内存CPU
当然!每次找到一个随机端口,还是需要遍历一遍bound ports的吧,这必然需要一些CPU时间。
解决办法
1)服务器能够快速回收和重用那些TIME_WAIT的资源。
2)设置套接字属性recycle
3)长连接
4)端口复用
5)服务器不主动关闭连接
6)https://mp.weixin.qq.com/s/3rM_RlwejkMFWm0GdwK6Hg
CLOSE_WAIT【代码错误】
1)忘记调用close()
2)fork进程时 子进程复制了父进程的文件描述符号,处理时只有子进程调用close()函数…引用计数未变为0
