计算机网络note_面向连接的传输TCP

1、TCP概述

  • 进程到进程的通讯;
  • 可靠的,按顺序的字节流,没有报文边界;
  • 流水线方式,TCP拥塞控制、流量控制,设置窗口的大小;
  • 全双工:在同一连接中数据双向流动;
  • 面向连接:在数据交换之前,通过握手(交换控制报文)初始化发送方、接收方的状态;

2、TCP报文段结构

序号:本TCP报文段第一个数据 在应用层报文中的字节序号;

           以MSS(最大报文段大小)为单位切分段;

MTU 最大传输单元:以太网最大传输单元是1500字节;

MSS = 1500 - 20(TCP头部)- 20(IP头部)= 1460字节;

确认号:累积确认,确认n-1及以前的字节;

(比如确认号是555,代表554及以前都到了,下回想要555)

首部长度:固定20字节+可选项的长度,就是整个首部;

                  首部长度是以4字节为单位,4bit;

比如,首部长度最大是1111,即最多15*4=60字节;

校验和:求和,进位回卷,取反码;

紧急数据指针:古老的字段,已经不用了;


关于序号和确认号的例子

A 发给 B:我现在发送编号42的数据,希望下一个收到编号79的数据(78以以前都收到了);

B 发给 A:我现在发送编号79的数据,希望下一个收到编号43的数据(42以以前都收到了);


 3、怎样设置TCP的超时时间?

超时时间不能太短,否则会重复发送数据;也不能太长,响应太慢;

RTT是变化的,用最近几次RTT的平均值(权重不同)来估算,即EstimatedRTT;

用EstimatedRTT作为参照来设置,比EstimatedRTT要长,再加上4倍的标准差;

正态分布,实际值 在 (均值 ± 4倍标准差) 范围的概率是99.99%以上;


4、TCP如何实现可靠数据传输?

流水线(管道化)的方式

  • 累积确认(像GBN)
  • 单个重传定时器(像GBN),超时后只发送最早未确认的段(像SR);
  • 接收方是否接受乱序,没有规范;

 3次冗余确认后,快速重传 

假设编号99的数据已收到,接收方返回ACK100(第一次),接收方一次接受一个数据,即只期待100;

然后,发送方发了100,101,102,103,在路上100丢失了,到达的只有101,102,103;

由于到达的编号大于期待的编号100,所以接收方只得发送之前的ACK100;

当101发的ACK100(冗余第一次)到发送方,可能是101和100乱序;

当102发的ACK100(冗余第二次)到发送方,也可能是102和100乱序,再等等;

当收到103发的ACK100(冗余第三次),基本断定100是丢失了,所以立即重发;


TCP发送方流程 


 TCP重传机制

最右边的图,即便是ACK100丢失,但是由于TCP是累计确认的,在收到ACK120的时候,就认为119及以前的数据以及收到了,所以发送窗口的后沿base = 120;


 产生TCP ACK的建议

接收方事件接收方动作

1、期望序号之前的数据已被确认;

2、期望序号的报文段到达;

延时ACK;

若500ms超时,下一报文段还没到,则发送ACK;

1、期望序号的报文段到达,等待发ACK过程中;

2、下一个报文段到了;

立即发送一个累计ACK;(可确认两个报文段收到)

1、比期望序号大的报文段先到达;

2、检测数据流的间隔;

立即发送之前的ACK(冗余ACK),指明期待字节序号;
1、能全部或部分填充数据间隔的报文段到达;

若该报文段起始于间隔的低端,立刻发送ACK;

(这是间隔,所以后面数据已经到了,不用等)


5、TCP流量控制

 接收端有接收的缓冲区,除了已收到但上层应用还未读出的数据,剩余的空间就是还能再接收数据的空间RevWindow;

RevWindow在TCP报文中的 接收窗口 中表明,发送方就不会发送比这个值多的数据,这就是流量控制;


6、TCP连接管理

6.1、2次握手,存在的问题

半连接:

  • A向B发出请求建立连接,B同意,但是B同意的ACK比较慢到达,导致A又发送一次申请建立连接;
  • 后来AB传输数据,拆除连接;
  • 某一时刻,滞留在网络中的那次A的申请连接到达B,B误以为A要建立连接;

老数据被当成新数据:

  • 在上面半连接的基础上,还有一个A曾经发送的数据也到达B;
  • B不仅单方面建立连接,还接收了数据;


6.2、3次握手

在正式交换数据之前,双方要都知道对方愿意建立连接

  • A:申请建立连接,我从序号X开始发;
  • B:已收到X,ACK(X+1);
  • B:申请建立连接,我从序号Y开始发;
  • A:已收到Y,ACK(Y+1);

 中间的两次B可以合并为一次,所以是三次握手; 

  初始序号要是变化的,防止滞留在网络中的数据对以后通信造成影响;



6.3、TCP关闭连接

双方分别关闭自己这一侧的连接,共4次挥手;

  • A:我要关闭连接,FIN;
  • B:好的,ACK;
  • B:我要关闭连接,FIN;
  • B:好的,ACK;

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值