不落辰

知不可乎骤得,托遗响于悲风

0%

计算机网络-CS144-lab4-补充

补充八股

挥手丢失 发生什么

https://xiaolincoding.com/network/3_tcp/tcp_interview.html#tcp-%E5%9F%BA%E6%9C%AC%E8%AE%A4%E8%AF%86

两军问题

A1 B A2
背景: 只有A1 和 A2同时向B发起进攻,才能成功。注:A1 和 A2的通信只能通过B,且是不可靠的通信。

前提:A1发送给A2 的消息 ,可能被B截获
目标:A1 和 A2达成一致… 到底什么叫一致 ? 我要学raft啊啊啊。春节之前学啊啊啊。
困难:A1 和 A2无法达成一致
A1无法确定A2是否收到A1发送的消息,A2为使得A1知道A2收到消息,则A2向A1发送确认报文;然而,A2无法确认A1是否收到该确认报文,则A1为使得A2知道A1收到确认,A1需要向A2发送确认报文(用于确认A2发送的确认报文);那么同理,A2又需要向A1发送确认报文(用于确认A1发送的,用于确认A2发送的确认报文 的报文); …. 如此,无穷无尽。
一言以蔽之 : 由于信道B不可靠,A1和A2无法确定对方是否收到本端发送的消息,因此会造成无穷多的ack.

TCP Keepalive

  • TCP Keepalive是TCP的保活机制,为了及时知道对方的TCP是否还存活,以判断该连接是否已经死亡.
  • 如果两端的 TCP 连接一直没有数据交互,达到了触发 TCP 保活机制的条件,那么内核里的 TCP 协议栈就会发送探测报文。
    • 如果对端程序是正常工作的。当 TCP 保活的探测报文发送给对端, 对端会正常响应,这样 TCP 保活时间会被重置,等待下一个 TCP 保活时间的到来。
    • 如果对端主机崩溃,或对端由于其他原因导致报文不可达。当 TCP 保活的探测报文发送给对端后,石沉大海,没有响应,连续几次,达到保活探测次数后,TCP 会报告该 TCP 连接已经死亡。
  • TCPConnection实现:segment_received()的special case
    1
    2
    3
    if (_receiver.ackno().has_value() and (seg.length_in_sequence_space() == 0) and seg.header().seqno == _receiver.ackno().value() - 1) {    //  local TCP expect the seqno to be _receiver.ackno().value()
    _sender.send_empty_segment();
    }

HTTP Keep-Alive

  • HTTP 的 Keep-Alive,是由应用层(用户态) 实现的,称为 HTTP 长连接;
  • HTTP协议 : 请求-应答模式
    • HTTP短连接
      • 一次http请求 就要发起一条tcpconnection
      • 每次请求都会经历 : 三次握手 -> 请求 -> 响应 -> 四次挥手
    • HTTP长连接
      • 使用同一条tcpconnection 来传送多条http请求/响应 , (1)从而避免连接建立和释放的开销
      • http层的双方通过在请求/响应的包头中添加 Connection: Keep-Alive来达成协议.
      • http长连接不仅减少了多次连接/释放的开销,(2)也是http流水线技术的基础
        • http流水线 : 客户端可以先一次性发送多个请求,而在发送过程中不需先等待服务器的回应,服务器按照顺序响应请求

        • 归功于多个请求使用同一条tcp连接,server的多条响应才能按序到达client