网络复习-笔记06-传输层(2)

2018-06-15  本文已影响0人  桔子满地

TCP

  1. 点对点:
  1. 可靠的、按序的字节流
  2. 流水线机制:
  1. 发送方/接收方缓存


    TCP发送方/接收方缓存.png

    (和SR略有相似)

  2. 全双工:

  1. 面向连接:
  1. 流量控制机制

TCP段结构

TCP段结构.png

TCP:序列号和ACK

序列号:

ACKs:

处理乱序到达的segment:


TCP的可靠数据传输

TCP RTT和超时

设置定时器的超时时间时,考虑RTT的大小,需大于RTT。如果过短,则会进行不必要的重传;如果过长,又会对段丢失时间反应慢。
则需要估计RTT:

定时器超时时间的设置:

安全边界的确定:

则定时器超时时间的设置:


定时器超时时间的设置.png

TCP发送方事件

从应用层收到数据:

超时:

收到ACK:
如果确认此前未确认的segment:

TCP重传示例

TCP重传示例(a).png

在(a)例中,ACK丢失,引起超时重传,重新传送seq92.

TCP重传示例(b).png

在(b)例中,超时时间设置过短,则ACK=100在超时时间内并未被收到,因此重传seq=92。接着又陆续收到ACK=100,ACK=120,因此陆续更新sendbase=100, sendbase=120。此时接收方又收到了seq=92,而之前接收方已经发送过ACK=120,故此时再发送一个ACK=120。

TCP重传示例(c).png

在(c)例中,ACK=100没有被收到,但是接收方并不知道,接收方已经正确的接收了seq=
92,则seq=100是按序收到的,于是接收方继续发送ACK=120。此时发送方收到120,则确认此前未确认的segment,并将sendbase更新为120。

TCP ACK的生成:

接收方:

  1. 收到一个按序的段,有个延迟ACK的动作,等待最多500ms,如果没有下一个段,就发送ACK
  2. 如果一个按序的段到了,并且之前有段在等待,则立即发送累计ACK,确认这两个段
  3. 如果一个乱序的段到了,立即发送重复ACK

快速重传机制

为什么要快速重传? TCP的实现中,如果发生超时,超时时间间隔将重新设置,即将超时时间间隔加倍,导致其很大

可以通过重复ACK检测分组丢失:

如果sender收到对同一数据的3个ACK,则假定该数据之后的段已经丢失


TCP流量控制

接收方为TCP连接分配buffer:


接收方buffer.png

流量控制:控制发送方不会传输太多、太快以至于淹没接收方(buffer溢出),实际上是一个速度匹配机制

假定:TCP receiver丢弃乱序的segments
则如上图所示,buffer中的可用空间(spare room)= RcvWindow = RcvBuffer - [LastByteRcvd - LastByteRead]


TCP连接管理

TCP的sender和receiver在传输数据前需要建立连接
初始化TCP变量

Client:连接发起者

Socket clientSocket = new Socket("hostname", "port number");

Server:等待客户连接请求

Socket connectionSocket = welcomeSocket.accept( );

三次握手(非常重要):

  1. 客户机发送TCP SYN段给服务器,无数据
  2. 服务器接收SYN,回复SYNACK段给客户机,此时分配buffer给它
  3. 客户机接收SYNACK,回复它一个ACK段


    三次握手.png

四次挥手(非常重要):

TCP连接关闭:

client closes socket: clientSocket.close( );

四次挥手.png
  1. 客户机向服务器发送TCP FIN控制segment
  2. 服务器收到FIN,回复ACK,关闭连接,发送FIN
  3. 客户机收到FIN,回复ACK
  1. 服务器收到ACK,连接关闭。
TCP客户机生命周期.png TCP服务器生命周期.png
上一篇 下一篇

猜你喜欢

热点阅读