TCP

在TCP/IP协议模型中, 传输层协议有TCP和UDP, 这里主要介绍下可靠传输TCP协议, 目前是传输层协议首选.

特点

  • 面向数据流(字节流形式)
  • 虚电路连接
  • 有缓冲传输(提供push机制 )
  • 无结构数据流(无边界)
  • 全双工

连接建立

socket接口使用 connect()时建立连接,  采用三次握手,  请看下图 :

在这个过程中完成了几个重要功能 :

  1. 建立连接, 做好传送数据准备.
  2. 协商各自报文段初始序号ISN( 任意选取, TCP准规定不可为1, 其中一个原因是避免IP欺骗).
  3. 协商报文段最大长度MSS.

为什么要三次握手 ?

考虑正常情况:  主机A给主机B发送数据包, 在网络中丢失了. 主机A定时器到期后未收到来自主机B的确认, 于是A重新发送数据包, 主机B收到再发送确认.  如果之前的数据包没有丢失呢 ? 只是延迟了比较长的时间.  那么这个失效的数据包又重新发给主机B, 主机B以为A要建立连接, 会给A发送确认,  同意建立连接.   A肯定不会理它了,  所以主机B一直在那白白地等A传送数据, 所以采用三次握手能很好解决这个问题. 其他精彩回答可参考  https://www.zhihu.com/question/24853633

可靠传输

1.防止丢失

如果限定一个时间之内未收到报文段的确认, 则认为该报文丢失, 进行重传.  超时定时器设定采用自适应动态算法.

2.防止重复和乱序

采用唯一序号机制. 这种方法相当于给每个字节编号, 体现了TCP面向数据流的特征

3.确认机制

1.确认指明期望收到下个报文段的序号, 而不是已经收到的报文段序号.

2.累计确认(确认信息报告已经累积了多少个字节的数据).

3.捎带确认(不单独发送确认信息, 捎带在自己发送的报文段中).

拥塞控制

慢启动算法:  发送方维持一个拥塞窗口cwnd的变量.  cwnd取决于网络拥塞情况动态变化, 也可以小于对方接收窗口.  开始不发送大量数据, 先发送试探报文, 一步步增大cwnd的值.

为防止cwnd过大导致网络拥塞, 需要设置一个慢开始门限值ssthresh :

当cwnd小于ssthresh时, 使用慢开始算法.

当cwnd等于ssthresh时, 使用慢开始算法或拥塞避免算法都可以.

当cwnd大于ssthresh时, 使用拥塞避免算法.

拥塞避免算法 : 每进过一个RTT就把cwnd+1, 而不是加倍, 这样使得拥塞窗口线性增长.

无论是在慢开始阶段还是在拥塞避免阶段, 只要发送方判断网络出现拥塞(未收到确认, 可能是丢失了, 也视为拥塞), 就把慢开始门限减小到拥塞窗口cwnd的一半, 并设置拥塞窗口大小为1, 执行慢开始算法.

这里拥塞窗口的单位应该是字节数.

快重传和快恢复

要求接受方在收到一个失序的报文后立即发送重复确认, 而发送方在连续接收三个重复确认时要重传失序报文, 不必等待设置的超时计数器到期.

在发送方收到三个重复确认以后, 执行乘法减小算法, 将门限值ssthresh减小到一半.

在网络拥塞情况下, 有可能接收方收不到三个重复确认, 这是发送方认为网网络没有出现拥塞, 把cwnd设置为ssthresh大小, 然后执行拥塞避免算法.

连接关闭

断开连接使用四次挥手,  在客户端调用socket接口 close() 后发送FIN数据包,  参考下图:

TCP连接是全双工的, 两个方向上都要关闭, 原则是发起关闭的一方发送FIN字段,  另一方接收到后必须发送关闭的确认. 从图中可以看出, 当收到FIN并不是立即关闭, 它是先发送确认, 然后再继续发送自己的FIN请求.

需要注意的是 当客户端收到关闭确认ACK之后, 它仍然可以接受服务器的数据, 并且向服务器发送确认信息, 一个仅包含确认信息的报文不占用序号.

客户端最后发送ACK后进入TIME_WAIT状态而不是CLOSED, 因为最后的这个ACK可能丢失,  如果是CLOSED话就已经断开连接了.  服务器方的这个连接关闭就会出错. 所以这里应该等待一段时间再进入CLOSED状态, 这个时间就是最大报文生存周期(MSL).

异常关闭:   发送RST报文段,  立即停止传输,  关闭连接, 释放资源.

半开放连接: 引入保活定时器, 指点时间之内仍然没有数据通信, 则发送侦查报文, 根据不同情况进行处理.

TCP传输控制协议的更多相关文章

  1. 9.TCP:传输控制协议

    1.TCP功能     TCP向应用层提供面向连接的.可靠的字节流服务.TCP可以认为是一个没有选择确认或否认的滑动窗口协议.     TCP将用户数据打包构成报文段:它发送数据后启动一个定时器:另一 ...

  2. TCP 传输控制协议

    开头先说几个协议: IP:网际协议 TCP:传输控制协议 Http:超文本传输协议 AMQP:高级消息队列协议 一:TCP是什么? TCP(Transmission Control Protocol ...

  3. 运输层3——传输控制协议TCP概述

    目录 1. TCP最主要的特点 2. TCP的连接 3. socket在不同场景中的含义 写在前面:本文章是针对<计算机网络第七版>的学习笔记 运输层1--运输层协议概述 运输层2--用户 ...

  4. TCP传输层协议的流程

    http://blog.chinaunix.net/uid-24399976-id-77905.html 通过对互联网的认识,我们发现TCP传输层协议是网络进行工作的核心也是基础.它的重要性我们在此也 ...

  5. TCP/IP 笔记 - 传输控制协议

    与UDP不同,TCP提供面向连接的.可靠的.基于字节流的传输层协议,且提供差错纠正. TCP传输的概念 对与分组丢失和比特差错的处理方法,最直接的方法是重发分组,直到它被正确接收. 这需要一种方法来判 ...

  6. TCP/IP详解学习笔记(12)-- TCP:传输控制协议

    1.概述      TCP提供了一种可靠的面向连接的字节流运输层服务.      TCP将用户数据打包成报文段,它发送后启动一个定时器,另一端收到的数据进行确认,对失序的数据重新排序,丢弃重复数据,T ...

  7. 传输控制协议TCP

    TCP主要特点: (1)面向连接 (2)只能是点到点 (3)可靠的传输协议 (4)全双工通信,各自各自的读写缓冲区,应用层吧数据交给发送缓冲区,tcp合适就发送了,接受的时候tcp写入接受缓冲区,应用 ...

  8. 【TCP/IP详解 卷一:协议】第十七章 TCP:传输控制协议

    本章作为TCP的入门章节,简单的概述了一些TCP的知识,和TCP数据报的首部格式. TCP 最重要的特性:reliable. 17.1 引言 本章介绍的是 TCP为应用层提供的服务. 17.2 TCP ...

  9. TCP/IP详解 读书笔记:TCP:传输控制协议

    TCP的服务 TCP为应用层提供一种面向连接的.可靠的字节流服务. 一个TCP连接中,仅有两方进行彼此通信,所以广播和多播不能用于TCP. TCP通过以下方式提供可靠性: 应用数据被切割为TCP认为最 ...

随机推荐

  1. Linux:查看磁盘空间占用情况

    Linux:查看磁盘空间占用情况 工作中有时被分配的测试机空间不大,经常遇到磁盘空间占满的情况.排查过程如下: 一.首先使用df -h 命令查看磁盘剩余空间,通过以下图看出/目录下的磁盘空间已经被占满 ...

  2. Python3.x:pdf2htmlEX(解析pdf)安装和使用

    Python3.x:pdf2htmlEX(解析pdf)安装和使用 简介 pdf2htmlEX是一款优秀的pdf转换成html的工具: 下载 windows下载地址:http://soft.rubypd ...

  3. 通俗理解数字签名,数字证书和https

    最近在开发关于PDF合同文档电子签章的功能,大概意思就是在一份PDF合同上签名,盖章,使其具有法律效应.签章有法律效应必须满足两个条件: 能够证明签名,盖章者是谁,无法抵赖 PDF合同在签章后不能被更 ...

  4. AtCoder Regular Contest 097

    AtCoder Regular Contest 097 C - K-th Substring 题意: 求一个长度小于等于5000的字符串的第K小子串,相同子串算一个. K<=5. 分析: 一眼看 ...

  5. DataStage系列教程 (Pivot_Enterprise 行列转换)

    有人提到Pivot_Enterprise这个组件,之前没有用过,今天捣腾了会,写下来供以后参考,如果有什么不对的,还请多指出,谢谢! Pivot_Enterprise主要用来进行行列转换. 1 示例 ...

  6. java处理图片base64编码的相互转换

    转载自http://www.cnblogs.com/libra0920/p/5754356.html 直接上代码 import sun.misc.BASE64Decoder; import sun.m ...

  7. WildcardMatching和Regex,通配符匹配和正则表达式匹配

    WildcardMatching:通配符匹配 算法分析: 1. 二个指针i, j分别指向字符串.匹配公式. 2. 如果匹配,直接2个指针一起前进. 3. 如果匹配公式是*,在字符串中依次匹配即可. 注 ...

  8. LeetCode第[17]题(Java):Letter Combinations of a Phone Number

    题目:最长公共前缀 难度:EASY 题目内容: Given a string containing digits from 2-9 inclusive, return all possible let ...

  9. js 验证 -身份证等

    js验证身份证: function isIdCard(idCard) { var num = idCard.toLowerCase().match(/\w/g); if (idCard.match(/ ...

  10. SeekBar拖动条控件

    SeekBar拖动条控件 一.简介 1. 二.SeekBar拖动条控件使用方法 1.创建SeekBar控件 <SeekBar android:id="@+id/SeekBar1&quo ...