Loading

TCP

TCP在客户端和服务端建立一个连接,并且可以提供可靠性。当TCP向另一端发送数据时,它要求对方返回一个确认。如果没有收到确认,TCP会自动重发数据并等待更长时间。

在数次重传失败以后,TCP才确认放弃,重传数据花费的时间通常在4~10分钟。但是TCP并不能保证数据一定会被对方接收。因此TCP并不是百分百可靠的传输协议,它只是提供了可靠的的数据传输和可靠的错误通知。

TCP内部会有算法动态估计TTT(round-trip time)动态往返时间,所以它知道等待确认有多长时间,另外,由于RTT会在网络传输时受到不同因素影响,所以TCP会持续估计RTT。

TCP通过对传输的每个字节关联一个序列号来对数据进行排序。即即使传到另一端的数据是无序的,TCP也会在将数据进入接收应用之前根据序列号对其进行排序。如果TCP接收到的是重复数据,它也可以判定是重复

数据而将它丢弃。

TCP提供流量控制,TCP总是在任意时刻确切告诉其对端它愿意从对端接受多少字节的数据。这称之为advertised windwo。窗口是接受缓冲区中当前可用的空间量,保证发送方不会溢出接收缓冲区。这个窗口是动态改变的,当从发送方接受数据后,窗口大小会减小,当接收应用程序聪buffer里读取数据后,窗口大小会增加。窗口的大小有可能会0.这时它必须要等接收应用读取数据后,才能从对端接收数据。

TCP是full-duplex全双工的,这意味着应用程序可以随时在给定连接上双向发送和接收数据。这意味着TCP必须要追踪每个方向的数据流的状态信息:比如序列号和窗口大小。当全双工建立以后,如果愿意它可以变成单向传输的。

 


 二、TCP输出:

  

 

  application Writes data to a TCP socket.

  • 当application 调用write,kernel 从application buffer 复制所有data到socket send buffer,每个TCP socket 都有一个send buffer,通过SO_SNDBUF改变其size。
  • 如果send buffer的room容不下 application data或者application buffer 大于socket send buffer或者socket send buffer中已经有数据,那么此时process(进程)将被put to sleep。挂起(睡眠),这里假设套接口是阻塞的。在application的所有data 从application buffer 全部拷贝到socket send buffer之前,内核不会从write系统调用返回。因此从一个TCP socket的write成功返回只意味着我们可以重新使用application buffer,并不意味着对方的TCP或application已经接收到数据。

 

  • TCP取socket send buffer的数据并把它发送给对端TCP,其过程基于TCP数据传输的所有规则。对端TCP必须确认收到的数据,只有收到对端的ACK,本端TCP才能删除socket send buffer中已经确认的数据,TCP必须data 的copy直到收到对端的ACK。

 

  • TCP以MSS-sized 或者更小的chunks将数据发送给IP,在每个数据段前面加上TCP header,MSS的value是对方告知的,如果对方没有发送一个 MSS,默认是536.
  • IP给每个TCP分节加上IP Header构成IP数据报,查找其宿IP地址的路由表项以确定外出接口,然后把数据报传递给相应的数据链路。

 

posted @ 2019-08-15 14:43  三只猫-  阅读(219)  评论(0编辑  收藏  举报