计算机网络知识总结
三次握手,四次挥手
1.为什么需要三次握手才能建立连接
是为了初始化Sequence Number的初始值(seq)
通信双方要互相通知对方自己初始化的seq,这个号要作为以后的数据信号,以保证应用层的数据不会因为网络上的问题而乱序,TCP会用这个序号来拼接数据,第三次握手时因为要客户端告知服务器,我已经收到你发的seq了
黑客使用多个不存在的ip连接server,因为ip不存在,服务器就一直重试,导致SYN队列满了之后,其它连接无法连接服务器,并且其他正常的SYN可能也会被挤出队列,这样最后导致服务器瘫痪
解决:服务端接收到一个SYN包的时候,他返回一个SYN-ACK包,这个数据包的ACK序列号是经过加密的,也就是说,它由源地址,端口源次序,目标地址,目标端口和一个加密种子计算得出。然后服务端释放所有的状态。如果一个ACK包从客户端返回, 服务端将重新计算它来判断它是不是上个SYN-ACK的返回包。如果这样,服务端就可以直接进入TCP连接状态并打开连接。从而使服务端避免守侯半开放连接。
2.为什么需要四次挥手
因为全双工通信,发送方和接收方都需要FIN报文和ACK报文
重点:为什么要等2MSL(2倍的任何报文在网络上存活的最大时间)的时间客户端才关闭?
(1)假如第四次挥手失败了,因为丢失而未到达服务器会怎样呢?这样,服务器会一直收不到客户端的回应,也就无法得知客户端是否收到了即将要断开连接的请求。客户端此刻还蒙在鼓里,还在等待服务器继续发送消息。服务器不能判断客户端是否收到,本身就是一个BUG,于是才有的等待2MSL的情况。为了保证客户端最后一次挥手的报文能够到达服务器,若第4次挥手的报文段丢失了,服务器就会超时重传第3次挥手的报文段,所以客户端此时不是直接进入CLOSED,而是保持TIME_WAIT(等待2MSL就是TIME_WAIT)。当客户端再次受到服务器因为超时重传而发送的第3次挥手的请求时,客户端就会重新给服务器发送第4次挥手的报文(保证服务器能够受到客户端的回应报文)。最后,客户端、服务器才真正断开连接。说白了,等待2MSL就是为了确保服务器能够受到客户端最后的回应。
(2)如果客户端直接关闭,老数据可能存在于网络中,然后下一次新连接到来时,如果还是统一端口号,这样的话,数据就会导致出差错,所以等2MSL就是保证老数据在网络上彻底消失
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编程来进行通信