【程序员笔试】+计算机网络+TCP

TCP特点

  • 面向连接
  • 点对点(客户端和服务端)
  • 可靠交付
  • 全双工
  • 面向字节流

IP是尽最大努力交付
TCP就是在不可靠的网络上实现可靠传输

  • 停止等待协议
  • 连续ARQ协议
  • 滑动窗口
  • 流量控制
  • 拥塞控制

连接管理

TCP建立连接有三个阶段:三次握手,数据传送,四次挥手

三次挥手

TCP连接建立要解决三个问题:
(1)确认存在
(2)协调参数(序列号)
(3)资源分配
采用客户端 服务器模式。客户端主动打开连接,B被动打开连接。

  • 首先是服务器是在监听(Listen)状态
    客户端向服务器发送连接请求(包含同步位SYN和序列号seq=x),发送完进入同步已发送(SYN-SENT)状态
  • 服务端同意建立连接则发送确认(ACK ack=x+1,)以及他的同步和序列号 (SYN seq= y ),进入同步收到(SYN-RCVD)状态
  • 客户端收到服务器的确认,还要给出确认,ACK=1 ack=y+1,ack序号就是服务端的序列号。自身的序列号x+1. 然后客户端进入 连接建立(ESTABLISHED)状态. 客户端收到确认后也进入连接建立状态
image.png
  • 为什么不是两次?

第一次 客户端只知道自己发送了建立连接请求,服务端可以确认正常收到信息,显然服务端不可能在这时候就建立连接,这样的话会消耗大量的资源。
第二次 客户端能确认服务端正常收到了请求并能正常接受客户端的信息。此时,客户端和服务端都知道对方可以正常接受彼此的信息,客户端知道服务端收到连接请求随时能进行连接。 但服务端此时不知道客户端是否收到了自己的确认。
两次握手很容易造成资源浪费。

服务端在第一次握手时知道收到能客户端信息,
客户端在第二次握手时知道了服务端收到了自己的请求。
但服务端在第一次握手时只知道收到能客户端信息, 此时客户端不一定是建立连接的状态。只有知晓了服务端已经进入可建立的状态,客户端才进入可建立的状态。

当网络延迟等原因 导致客户端连续发送多次建立连接请求时候,只有两次握手,使服务端太容易建立连接。造成资源浪费。

客户端服务器建立连接时,不仅需要知道彼此能收到对方信息,还要确定彼此都进入了就绪状态。

  • 为什么不是四次?
    三次已经足够,获取对方能够正常建立连接,和协商好彼此的序列号
    其实第二次握手就 服务端的连续两次合并在一起了

四次挥手

  • 客户端发送 终止位FIN和序列,进入终止等待(FIN-WAIT)状态。
  • 服务端收到后,然后发送确认,进入关闭等待(CLOSE-WAIT)状态。 这时候关闭了一半。
  • 客户端收到服务端确认后,进入终止等待状态2(FIN-WAIT-2),等待服务端关闭。
  • 服务端发送终止位,进入最后确认(LAST-ACK)状态,在收到确认后关闭
  • 客户端收到后发送确认 等待一段时间后进入关闭。


    image.png

你可能感兴趣的:(【程序员笔试】+计算机网络+TCP)