网络协议的两个问题

TCP为什么是三次握手

   这个问题是面试过程中问到的,应该在对三次握手的理解上予以回答。查过一些资料,大家都对此做了详尽的分析。这里说点Tips。

  1-谢希仁的《计算机网络》这本书中提到,“**三次是保证双方互相明确对方能收能发的最低值**”,理论上,无论多少次握手,信道都可能是不可靠的。

  2-回答要点引自知乎问答:

让双方都证实对方能发收。 知道对方能收是因为收到对方的因为收到而发的回应。 具体:
1:A发,B收, B知道A能发
2:B发,A收,
3:A发,B收, B知道A能收

-

SYN Flood:
假设一个用户向服务器发送了SYN报文后突然死机或掉线,那么服务器在发出SYN+ACK应答报文后是无法收到客户端的ACK报文的(第三次握手无法完成),这种情况下服务器端一般会重试(再次发送SYN+ACK给客户端)并等待一段时间后丢弃这个未完成的连接,这段时间的长度我们称为SYN Timeout,一般来说这个时间是分钟的数量级(大约为30秒-2分钟);
一个用户出现异常导致服务器的一个线程等待1分钟并不是什么很大的问题,但如果有一个恶意的攻击者大量模拟这种情况,服务器端将为了维护一个非常大的半连接列表而消耗非常多的资源—-数以万计的半连接,即使是简单的保存并遍历也会消耗非常多的CPU时间和内存,何况还要不断对这个列表中的IP进行SYN+ACK的重试。
实际上如果服务器的TCP/IP栈不够强大,最后的结果往往是堆栈溢出崩溃—即使服务器端的系统足够强大,服务器端也将忙于处理攻击者伪造的TCP连接请求而无暇理睬客户的正常请求(毕竟客户端的正常请求比率非常之小),此时从正常客户的角度看来,服务器失去响应,这种情况我们称作:服务器端受到了SYN Flood攻击(SYN洪水攻击)。

WebSocket是如何实现全双工的
首先什么是全双工,什么是半双工。

单工 – 数据传输只支持数据在一个方向上传输;
半双工 – 数据传输允许数据在两个方向上传输,但是,在某一时刻,只允许数据在一个方向上传输,它实际上是一种切换方向的单工通信;
全双工 – 数据通信允许数据同时在两个方向上传输,因此,全双工通信是两个单工通信方式的结合,它要求发送设备和接收设备都有独立的接收和发送能力。

    对这个问题的反思,最初觉得我是被面试官坑了一把……严格意义上说,全双工和半双工是传输协议,其实现是基于硬件的,全双工使用两条电缆线,半双工和单工使用一条(这个让我想起了上《计算机网络》课时候来时)。 WebSocket是HTML5中的一个协议,两者的关系其实并不大。
    但是既然别人问了……我去搜了一下,维基百科上描述如下:

WebSocket is a computer communications protocol, providing full-duplex communication channels over a single TCP connection

WebSocket是一个计算机传输协议,通过单个TCP连接提供全双工的传输通道。

so….它是如何实现全双工的呢?

    简单地说,WebSocket是建立在TCP的一次握手上的,TCP是全双工的,那WebSocket就是全双工的(emm.....会不会被怼?估计接下来要问为啥TCP就是全双工的了)
    那TCP为什么是全双工的呢?这个我还没查到。估计要细心地去看看书了。了解了之后再过来补吧。

推荐阅读:
TCP之为什么系列
从TCP三次握手说起——浅析TCP协议中的疑难杂症(真心不错)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值