共计 948 个字符,预计需要花费 3 分钟才能阅读完成。
三次握手, 四次挥手
1. 为什么需要三次握手才能建立连接
是为了初始化 Sequence Number 的初始值(seq)
通信双方要互相通知对方自己初始化的 seq, 这个号要作为以后的数据信号,以保证应用层的数据不会因为网络上的问题而乱序,TCP 会用这个序号来拼接数据,第三次握手时因为要客户端告知服务器, 我已经收到你发的 seq 了
黑客故意多次连接 server 然后关闭, 服务器就一直重试, 导致 SYN 队列满了之后, 其它连接无法连接服务器
2. 为什么需要四次挥手
因为全双工通信, 发送方和接收方都需要 FIN 报文和 ACK 报文
3. 为什么出现大量的 close_wait
对方关闭 socket 连接, 我方忙于读或者写, 导致没有及时关闭连接
在程序中的体现: 写代码的人忘记 closeSocket 这句代码, 或者是线程池的配置不对
导致的后果:一个 CLOSE_WAIT 会维持至少 2 个小时的时间(这个时间外网服务器通常会做调整,要不然太危险了)。
如果有个流氓特地写了个程序,给你造成一堆的 CLOSE_WAIT,消耗你的资源,那么通常是等不到释放那一刻,系统就已经解决崩溃了。
使用 netstat 来看 closewait, 如果 closewait 一旦达到上线, 其它 socket 无法连接,就会出现 too many open files 异常
4.UDP 的特点:
面向非连接
不维护连接状态, 支持同时向多个客户端传输相同的消息
用户数据报只有 8 个字节, 额外开销较小
吞吐量只受限于数据生成速率, 传输速率以及机器性能
尽最大努力交付, 不保证可靠交付, 不需要维持复杂的链接状态表
面向报文, 不对应用程序提交的报文信息进行拆分或者合并
它的可靠性要交给上面的应用层来保证, 又应用层来实现,并且面向报文的
5.TCP 的特点: 面向链接, 保证消息的可靠性,但开销比较大, 效率比较低, 是面向字节流的, 有流量控制和拥塞控制
6. 超时重传
RTT: 发送一个数据包到收到对应的 ACK, 所花费的时间
RTO: 重传的时间间隔
发送一个数据包之后 RTO(定时器)启动,在一个 RTO 内没有完成数据包的传输, 则进行重传(超时重传),保证了可靠的传输
7.http 相关
7.htt 状态码
8.http 和 http 的区别
9.https 真的安全吗
10.socket
socket 是对 TCP/Ip 的抽象, 可以通过 socket 编程来进行通信