传输控制协议TCP
特点:1,面向连接的运输层协议
        2,每一条TCP只能有两个端点。点对点
        3,TCP是可靠的,无差错,不重复,顺序到达。
        4,全双工,允许通信双方进程在任何时候都能收发数据。
        5,面向字节流。无结构字节流。

TCP连接
每一条TCP连接的两端是套接字。
套接字的格式:IP地址:端口号

理想传输的特点:传输信道不产生差错,不管发送方以多块的速度发送数据,接收方总来得及处理。

停止等待协议

停止等待就是每发送完一个分组就停止发送,等待对方确认收到确认后再发送下一个分组。

出现差错
A只要超过一段时间仍然没有收到确认,就认为刚才发送的分组丢失了。因而重传前面发送过的分组。这就是超时重传。每发送完就设置一个超时计时器。如果在超时之前收到确认,就撤销计时器。
注意:1,A在发送完一个分组后,必须暂时保留已发送的分组的副本,只有收到确认时,才清楚副本。
     2,分组和确认进行编号。
     3,超时计时器设置的重传时间应该比数据在分组传输的平均往返时间长一些。

3确认丢失和确认迟到
1,丢弃重复的分组M2,不向上层交付
2,向A发送确认。不能认为已经发送过了就不发送,

信道利用率
A发送分组所需时间TD,B发送确认分组时间TA。A经过TD+RTT+TA后就可以再发送下一个分组。RTT是往返时间。

信道利用率=TD/TD+RTT+TA

为了提高传输效率,发送方可以不适用停止等待协议,而是采用流水线传输。使用流水线传输时,就要使用连续ARQ协议和滑动窗口协议。


连续ARQ协议

发送方每收到一个确认,就把发送窗口向前滑动一个分组的位置。接收方一般采用累积确认方式,不用逐个确认,在收到几个分组后,对按序到达的最后一个分组发送确认。

优点:丢失不必重传
缺点:不能向发送方反映出接收方已经确认正确收到的所有分组的信息。

TCP报文首部

TCP面向字节流,但传输的单元是报文段。一个TCP报文段分为首部和数据两部分。TCP的全部功能体现在首部的各字段。

TCP首部前20个字节固定。后面4N字节根据需要增加,TCP首部最小为20字节。

首部各个字段:
1,源端口和目的端口,各两字节。

2,序号,4字节,范围[0,2^32-1]。在TCP连接中传送的字节流中的每一个字节都按照顺序编号。例如一个报文段序号是300,数据位100字节,则最后一个字节的序号是400。下一个报文的数据序号从401开始,一直到2^32-1结束,重新从0开始。

3,确认号,4字节,期望收到对方下一个报文段的第一个数据字节的序号。比如发送序号为100-200的数据,那么期望收到的序列号应该是201,收到确认号为N,表明N-1为止的所有数据都正常收到。

4,数据偏移,4位,指出TCP报文段的数据起始处距离TCP报文段的起始处有多远。实际指出了TCP报文段首部长度。数据偏移的单位是32位字,也就是4字节。4位二进制最大为15,因此偏移最大为60字节。TCP首部最大的长度。

5,保留,6位,全为0

6,紧急,URG=1表明紧急指针有效,高速系统此报文中有紧急数据,尽快传送。

7,确认ACK,当ACK=1时,确认号有效,ACK=0确认号无效。在连接建立后,ACK设置为1。

8,推送PSH,两个应用进程进行交互,在一端的应用进程希望在键入一个命令后立即就收到对方的响应。

9,复位RST,RST=1,连接中出现严重差错,释放连接,重新建立连接。

10,同步SYN,连接建立时用同步序号,当SYN=1时而ACK=0,表明是一个请求报文段。若对方同意建立连接,响应报文段中应该使SYN=1,ACK=1。因此SYN=1就是表示这是一个连接请求或接受报文。

11,终止FIN,释放连接。FIN=1表明报文段已经发送完毕没要求释放连接。

12,窗口,2字节,窗口值,[0,2^16-1]之间的整数。窗口值作为接收方让发送方设置其发送窗口的依据。
确认号是100,窗口是1000,表示从101开始,还有1000个字节数据的接收缓存空间。
窗口字段表明现在允许对方发送的数据量,是动态变化的。

13,检验和,2字节。检验范围包括首部和数据。检验时,在TCP报文段前面加上12字节伪首部。

14,紧急指针,2字节,URG=1有意义。指出本报文段中的紧急数据字节数。指出了紧急数据的末尾在报文段中的位置。窗口为0也可以发送紧急数据。

15,选项,长度可变,最长40字节。

最大报文段长度MSS,是每一个TCP报文段中的数据字段的最大长度。

TCP可靠传输的实现

以字节为单位的滑动窗口

假定A收到了B发来的确认报文段,其中窗口是20字节,而确认号是31。表明:B期望收到下一个序号是31,而序号30为止的数据已经收到了。


A发送窗口,在没有收到B的确认的情况下,A可以连续把窗口内的数据发送出去,凡是已经发送过的数据,在未收到确认之前都必须暂时保留,以便超时重传。
发送窗口里面的序号表示允许发送的序号,窗口越大,发送方就可以在收到对方确认之前连续发送更多的数据,因而可能获得更高的传输效率。但接收方必须来得及处理这些收到的数据。
发送窗口后面的部分表示已经发送且得到了确认,不需要保留。发送窗口前沿的前面部分表示不允许发送的,接收方没有为这部分数据保留临时缓存空间。

发送窗口后沿窗口变化分两种,不动(没有收到新的确认),前移(收到新的确认)。后沿不可能向后移动。

发送窗口前沿可能向前移动和不动,没有收到确认,窗口不变。收到新的确认,但对方通知的窗口缩小了,使得发送窗口前沿正好不动。

发送窗口前沿也可能向后收缩。发生在对方通知的窗口缩小了,但TCP标准强烈不建议这样。

描述发送窗口的状态

P3-P1=A的发送窗口
P2-P1=已发送但尚未收到确认的字节数
P3-P2=允许发送但尚未发送的字节数

B收到了序号为32和33,这些数据没有按序到达,因为序号为31的数据没有收到,B只能对按序收到的数据中的最高序号给出确认,因此B发送的确认报告段中的确认号仍然是31,而不是32或33。

假设B收到了序号31,并把31-33的数据交付主机,然后B删除这些数据。接收窗口向前移动3个序号,同时给A发送确认,窗口值仍为20,但确认号为34.表明已经收到33为止的数据,同时还收到37,38,40的数据。但这些都没有按序到达,只能暂存在接收窗口中。A收到B确认后,可以把发送窗口向前滑动3个序号,P2不动,可用窗口增大了。可发送范围42-53

A继续发送完42-53数据,P2和P3重合,窗口序号用完,没有收到确认,可用窗口为0.在没有接收到确认情况下,A经过一段时间后,重传这部分数据。直到收到确认为止。


发送缓存
用途:1,发送应用程序传送给发送方TCP准备发送的数据。    2,TCP已发送出但尚未收到确认的数据。
发送窗口通常只是发送缓存的一部分,已经被确认的数据在发送缓存中删除。发送缓存和发送窗口后沿是重合的。

接收缓存
用途:1,按序到达的,但尚未被接收应用程序读取的数据。     2,未按序到达的数据。
      
注意
1,同一时刻,A的发送窗口并不总和B的接收窗口一样大。
2,对于不按序到达的数据,TCP标准无明确规定。
3,TCP要求接收方必须有累计确认的功能,减小传输开销。

超时重传时间的选择

TCP采用了自适应法,记录一个报文段发出的时间,以及受到相应的确认时间。两个时间差就是报文段的往返时间RTT。RTT的一个加权平均往返时间RTTs。以后每测量一个新的RTT样本就按照下式重新计算一次RTTs
新的RTTs=(1-a)*(旧的RTTs)+a*(新的RTT样本)

0<=a<1,若a很接近0,表示新的RTTs和旧的RTTs值相比变化不大。如果接近于1,影响较大。

超时重传时间RTO应略大于上面得出的加权平均往返时间RTTs。
RTO=RTTs+4*RTTd

RTTd是RTT的偏差的加权平均值。与RTTs和新的RTT样本之差有关。

在第一次测量时,RTTd值为测量到的RTT样本值的一半,在以后的测量中,使用公式
RTTd=(1-b)*(旧的RTTd)+b*|RTTs-新的RTT样本|

这里b是个小于1的系数,推荐值是1/4。

选择确认SACK

当字节块不连续送到的时候,应该只重传缺少的。可以把字节块的范围进行标记。

如果要使用选择确认,那么在建立TCP连接时,就要在TCP首部的选项加入允许SACK的选项,双方都商定好。

TCP流量控制

利用滑动窗口实现流量控制

主要功能让发送方发送的速率不要太快,让对方来得及接收。

A向B发送数据。在链接时,B告诉A,我的接收窗口rwnd=400。所以,发送方的发送窗口不能超过接收方给出的接收窗口的数值。TCP的窗口单位是字节,不是报文段。

TCP为每一个连接设有一个持续计时器,只要TCP连接的一方收到对方的零窗口通知,就启动持续计时器,若持续计时器设置的时间到期,就发送一个零窗口探测报文段,如果仍是零窗口,那么就重新设置持续计时器,如果不是零就打破了死锁僵局。

TCP发送报文时机
 1,TCP维持一个变量等于MSS,最大报文段长度。只要缓存中存放的数据达到MSS字节,就组成一个TCP报文发送出去。
 2,由发送方的应用进程指明要求发送报文段,TCP支持的推送操作。
 3,发送方的一个计时器期限到了,当前缓存装入报文段发送,但不超过MSS。

TCP广泛使用的Nagle算法

发送进程要把发送的数据逐个字符送到tcp的发送缓存,则发送方先把第一个数据字节发出去,后面到达的都缓存起来。当第一个确认后,再发送缓存中所有的数据组成报文发送,同时对后续进行缓存。只有在收到前一个的确认,才发送下一个报文。还规定,当到达的数据已经达到发送窗口大小的一半或报文最大长度,就立即发送一个报文段。

解决糊涂窗口综合征:
让接收方等待一段时间,使得或者接收缓存已经足够空间容纳一个最长的报文段,或者等到接收缓存已有一半空闲的空间。

TCP(一)的更多相关文章

  1. Tcp/ip 报文解析

    在编写网络程序时,常使用TCP协议.那么一个tcp包到底由哪些东西构成的呢?其实一个TCP包,首先需要通过IP协议承载,而IP报文,又需要通过以太网传送.下面我们来看看几种协议头的构成 一 .Ethe ...

  2. C#高性能TCP服务的多种实现方式

    哎~~ 想想大部分园友应该对 "高性能" 字样更感兴趣,为了吸引眼球所以标题中一定要突出,其实我更喜欢的标题是<猴赛雷,C#编写TCP服务的花样姿势!>. 本篇文章的主 ...

  3. Android实现TCP断点上传,后台C#服务实现接收

    终端实现大文件上传一直都是比较难的技术,其中涉及到后端与前端的交互,稳定性和流量大小,而且实现原理每个人都有自己的想法,后端主流用的比较多的是Http来实现,因为大多实现过断点下载.但稳定性不能保证, ...

  4. 漫谈TCP

    不得不承认,tcp是一个非常复杂的协议.它包含了RFC793及之后的一些协议.能把tcp的所有方面面面具到地说清楚,本身就是个很复杂的事情.如果再讲得枯燥,那么就会更让人昏昏欲睡了.本文希望能尽量用稍 ...

  5. 高性能 TCP/UDP/HTTP 通信框架 HP-Socket v4.1.1

    HP-Socket 是一套通用的高性能 TCP/UDP/HTTP 通信框架,包含服务端组件.客户端组件和 Agent 组件,广泛适用于各种不同应用场景的 TCP/UDP/HTTP 通信系统,提供 C/ ...

  6. TCP/IP基础

    TCP/IP 是用于因特网 (Internet) 的通信协议. 计算机通信协议是对那些计算机必须遵守以便彼此通信的规则的描述. 什么是 TCP/IP? TCP/IP 是供已连接因特网的计算机进行通信的 ...

  7. TCP/IP之TCP_NODELAY与TCP_CORK

    TCP/IP之Nagle算法与40ms延迟提到了Nagle 算法.这样虽然提高了网络吞吐量,但是实时性却降低了,在一些交互性很强的应用程序来说是不允许的,使用TCP_NODELAY选项可以禁止Nagl ...

  8. TCP/IP之Nagle算法与40ms延迟

    Nagle算法是针对网络上存在的微小分组可能会在广域网上造成拥塞而设计的.该算法要求一个TCP连接上最多只能有一个未被确认的未完成的小分组,在该分组确认到达之前不能发送其他的小分组.同时,TCP收集这 ...

  9. TCP的数据传输小结

    TCP的交互数据流 交互式输入 通常每一个交互按键都会产生一个数据分组,也就是说,每次从客户传到服务器的是一个字节的按键(而不是每次一行) 经受时延的确认 通常TCP在接受到数据时并不立即发送ACK: ...

  10. TCP服务和首部知识点小结

    服务 应用程序会被TCP分割成数据段,而UDP不分割. TCP有超时重传和确认 如果检验和出错将丢弃 IP数据包可能会失序或者重复,所以TCP会处理 滑动窗口来进行流量控制 对字节流的内容不做任何解释 ...

随机推荐

  1. MySQL binlog2sql-闪回数据

    binlog2sql 从MySQL binlog解析出你要的SQL.根据不同选项,你可以得到原始SQL.回滚SQL.去除主键的INSERT SQL等. 用途 数据快速回滚(闪回) 主从切换后新mast ...

  2. GoLand、Pycharm注册码

    GoLand.Pycharm注册码 K71U8DBPNE-eyJsaWNlbnNlSWQiOiJLNzFVOERCUE5FIiwibGljZW5zZWVOYW1lIjoibGFuIHl1IiwiYXN ...

  3. day1--一个简单的登录接口

    _usrename = "Yvan"_password = "abc123"count=0while count <3:    username = in ...

  4. vue3.0中如何使用ueditor

    1.在官网下载一个ueditor版本[https://ueditor.baidu.com/website/download.html],解压后放到public文件下的static文件中重命名为Edit ...

  5. php从数据库中取二进制流文件转换为图片,图片以二进制流存入数据库实现

    php从数据库中取二进制流文件转换为图片,图片以二进制流存入数据库实现 function data_uri($contents, $mime) { $base64 = base64_encode($c ...

  6. Windows环境下在sublime text3配置C编译环境

    1. 检查本机有没有安装GCC,没有的话先进行安装 2. 选择 sublime 的Tools->Build System->New Build System,建立配置文件,文件命名为C.s ...

  7. jq 通配符,模糊查询

    $("input[id^='code']");//id属性以code开始的所有input标签 $("input[id$='code']");//id属性以cod ...

  8. Docker笔记——jdk镜像制作

    openjdk镜像依赖如下: openjdk:8-jdk -> buildpack-deps:jessie-scm -> buildpack-deps:jessie-curl -> ...

  9. (14/24) css进阶:(入门)去除冗余的css

    在平时的项目开发中,我们会引入一些框架,比如:Bootstrap,但是在项目中通常我们只使用它的一小部分,还有部分是冗余的.更有甚有时候需求更改,带来DOM结构的更改,这时候我们可能无暇关注CSS样式 ...

  10. LoadRunner 安装汉化后的一些问题

    我装好LoadRunner11后,按照下面的方法破解: 1.  把loadrunner相关程序全部退出: 2.  用LR8.0中的mlr5lprg.dll.lm70.dll覆盖LR9.5安装目录下“b ...