目录

一、TCP协议段格式

二、TCP原理

1、确认应答机制(安全机制)

2、超时重传机制(安全机制)

3、连接管理机制(安全机制)

4、滑动窗口(效率机制)

5、流量控制(安全机制)

6、拥塞控制(安全机制)

7、延迟应答(效率机制)

8、捎带应答(效率机制)


TCP,即Transmission Control Protocol,传输控制协议。人如其名,要对数据的传输进行一个详细的控制。

一、TCP协议段格式

• 源/目的端口号:表示数据是从哪个进程来,到哪个进程去;

• 32位序号/32位确认号

• 4位TCP报头长度:表示该TCP头部有多少个32位bit(有多少个4字节);所以TCP头部最大长度是 15 * 4 = 60

• 6位标志位:

  • URG:紧急指针是否有效
  • ACK:确认号是否有效
  • PSH:提示接收端应用程序立刻从TCP缓冲区把数据读走
  • RST:对方要求重新建立连接;我们把携带RST标识的称为复位报文段
  • SYN:请求建立连接;我们把携带SYN标识的称为同步报文段
  • FIN:通知对方,本端要关闭了,我们称携带FIN标识的为结束报文段

• 16位窗口大小

•16位校验和:发送端填充,CRC校验。接收端校验不通过,则认为数据有问题。此处的检验和不

光包含TCP首部,也包含TCP数据部分。

• 16位紧急指针:标识哪部分数据是紧急数据;

• 40字节头部选项

二、TCP原理

TCP对数据传输提供的管控机制,主要体现在两个方面:安全和效率。

这些机制和多线程的设计原则类似:保证数据传输安全的前提下,尽可能的提高传输效率。

1、确认应答机制(安全机制)

TCP将每个字节的数据都进行了编号。即为序列号。

每一个ACK都带有对应的确认序列号,意思是告诉发送者,我已经收到了哪些数据;下一次你从哪里开始发。

2、超时重传机制(安全机制)

  • 主机A发送数据给B之后,可能因为网络拥堵等原因,数据无法到达主机B;
  • 如果主机A在一个特定时间间隔内没有收到B发来的确认应答,就会进行重发;

但是,主机A未收到B发来的确认应答,也可能是因为ACK丢失了;

因此主机B会收到很多重复数据。那么TCP协议需要能够识别出那些包是重复的包,并且把重复的丢弃掉。

这时候我们可以利用前面提到的序列号,就可以很容易做到去重的效果。

那么,如果超时的时间如何确定?

  • 最理想的情况下,找到一个最小的时间,保证 "确认应答一定能在这个时间内返回"。
  • 但是这个时间的长短,随着网络环境的不同,是有差异的。
  • 如果超时时间设的太长,会影响整体的重传效率;
  • 如果超时时间设的太短,有可能会频繁发送重复的包;

3、连接管理机制(安全机制)

在正常情况下,TCP要经过三次握手建立连接,四次挥手断开连接

服务端状态转化:
  • [CLOSED -> LISTEN] 服务器端调用listen后进入LISTEN状态,等待客户端连接;
  • [LISTEN -> SYN_RCVD] 一旦监听到连接请求(同步报文段),就将该连接放入内核等待队 列中,并向客户端发送SYN确认报文。
  • [SYN_RCVD -> ESTABLISHED] 服务端一旦收到客户端的确认报文,就进入ESTABLISHED状态,可以进行读写数据了。
  • [ESTABLISHED -> CLOSE_WAIT] 当客户端主动关闭连接(调用close),服务器会收到结束报文段,服务器返回确认报文段并进入CLOSE_WAIT;
  • [CLOSE_WAIT -> LAST_ACK] 进入CLOSE_WAIT后说明服务器准备关闭连接(需要处理完之前的数据);当服务器真正调用close关闭连接时,会向客户端发送FIN,此时服务器进入 LAST_ACK状态,等待最后一个ACK到来(这个ACK是客户端确认收到了FIN)
  • [LAST_ACK -> CLOSED] 服务器收到了对FIN的ACK,彻底关闭连接

客户端状态转化:

  • [CLOSED -> SYN_SENT] 客户端调用connect,发送同步报文段;
  • [SYN_SENT -> ESTABLISHED] connect调用成功,则进入ESTABLISHED状态,开始读写数据;
  • [ESTABLISHED -> FIN_WAIT_1] 客户端主动调用close时,向服务器发送结束报文段,同时 进入FIN_WAIT_1;
  • [FIN_WAIT_1 -> FIN_WAIT_2] 客户端收到服务器对结束报文段的确认,则进入FIN_WAIT_2,开始等待服务器的结束报文段;
  • [FIN_WAIT_2 -> TIME_WAIT] 客户端收到服务器发来的结束报文段,进入TIME_WAIT,并发出LAST_ACK;
  • [TIME_WAIT -> CLOSED] 客户端要等待一个2MSL(Max Segment Life,报文最大生存时 间)的时间,才会进入CLOSED状态。

4、滑动窗口(效率机制)

对每一个发送的数据段,都要给一个ACK确认应答。收到ACK后再发送下一个数据段。这样做有一个比较大的缺点,就是性能较差。尤其是数据往返的时间较长的时候。

既然这样一发一收的方式性能较低,那么我们一次发送多条数据,就可以大大的提高性能(其实是将多个段的等待时间重叠在一起了)。

  • 窗口大小指的是无需等待确认应答而可以继续发送数据的最大值。上图的窗口大小就是4000 个字节(四个段)。
  • 发送前四个段的时候,不需要等待任何ACK,直接发送;
  • 收到第一个ACK后,滑动窗口向后移动,继续发送第五个段的数据;依次类推;
  • 操作系统内核为了维护这个滑动窗口,需要开辟 发送缓冲区 来记录当前还有哪些数据没有 应答;只有确认应答过的数据,才能从缓冲区删掉;
  • 窗口越大,则网络的吞吐率就越高;

5、流量控制(安全机制)

接收端处理数据的速度是有限的。如果发送端发的太快,导致接收端的缓冲区被打满,这个时候如果发 送端继续发送,就会造成丢包,继而引起丢包重传等等一系列连锁反应。
因此TCP支持根据接收端的处理能力,来决定发送端的发送速度。这个机制就叫做流量控制(Flow Control
  • 接收端将自己可以接收的缓冲区大小放入 TCP 首部中的 "窗口大小" 字段,通过ACK端通知 发送端;
  • 窗口大小字段越大,说明网络的吞吐量越高;
  • 接收端一旦发现自己的缓冲区快满了,就会将窗口大小设置成一个更小的值通知给发送端; 发送端接受到这个窗口之后,就会减慢自己的发送速度;
  • 如果接收端缓冲区满了,就会将窗口置为0;这时发送方不再发送数据,但是需要定期发送 一个窗口探测数据段,使接收端把窗口大小告诉发送端。

6、拥塞控制(安全机制)

虽然TCP有了滑动窗口这个大杀器,能够高效可靠的发送大量的数据。但是如果在刚开始阶段就发送大量的数据,仍然可能引发问题。

因为网络上有很多的计算机,可能当前的网络状态就已经比较拥堵。在不清楚当前网络状态下,贸然发送大量的数据,是很有可能引起雪上加霜的。

TCP引入 慢启动 机制,先发少量的数据,探探路,摸清当前的网络拥堵状态,再决定按照多大的速度传输数据;

  • 此处引入一个概念程为拥塞窗口
  • 发送开始的时候,定义拥塞窗口大小为1;
  • 每次收到一个ACK应答,拥塞窗口加1;
  • 每次发送数据包的时候,将拥塞窗口和接收端主机反馈的窗口大小做比较,取较小的值作为实际发送的窗口;
像上面这样的拥塞窗口增长速度,是指数级别的。"慢启动" 只是指初使时慢,但是增长速度非常快。
  • 为了不增长的那么快,因此不能使拥塞窗口单纯的加倍。
  • 此处引入一个叫做慢启动的阈值
  • 当拥塞窗口超过这个阈值的时候,不再按照指数方式增长,而是按照线性方式增长

7、延迟应答(效率机制)

如果接收数据的主机立刻返回ACK应答,这时候返回的窗口可能比较小。

  • 假设接收端缓冲区为1M。一次收到了500K的数据;如果立刻应答,返回的窗口就是500K;
  • 但实际上可能处理端处理的速度很快,10ms之内就把500K数据从缓冲区消费掉了;
  • 在这种情况下,接收端处理还远没有达到自己的极限,即使窗口再放大一些,也能处理过来;
  • 如果接收端稍微等一会再应答,比如等待200ms再应答,那么这个时候返回的窗口大小就1M;

一定要记得,窗口越大,网络吞吐量就越大,传输效率就越高。我们的目标是在保证网络不拥塞的情况下尽量提高传输效率;

8、捎带应答(效率机制)

在延迟应答的基础上,我们发现,很多情况下,客户端服务器在应用层也是 "一发一收" 的。意味着客户端给服务器说了 "How are you",服务器也会给客户端回一个 "Fine, thank you";

那么这个时候ACK就可以搭顺风车,和服务器回应的 "Fine,thank you" 一起回给客户端

TCP协议的相关特性相关推荐

  1. 网络编程释疑之:TCP协议的“流”特性

    与网络开发相关的招聘时最常被问起的问题是TCP和UDP的区别,现在几乎是道上混的都能答出来几点"比如TCP是面向连接的,UDP是无连接的:TCP是可靠的,UDP是不可靠的:",其中 ...

  2. ppp协议pap验证过程状态转移图_电脑网络知识:TCP协议的高级特性,你所不知道的TCP...

    一. TCP状态转换 要清楚的掌握在连接建立.连接终止以及数据传送时所发生的不同事件,TCP协议以有限状态机的形式来实现.有限状态机是能够经历有限数目状态的一种机器.这个机器总是处于某一个状态中.若没 ...

  3. Linux——TCP协议与相关套接字编程

    一.TCP协议概念 与UDP协议相同,TCP协议也是应用在传输层的协议.虽然都是应用在传输层,但是使用方式和应用场景上大不一样.TCP协议具有:有连接(可靠).面向字节流的特点. (一).有连接 所谓 ...

  4. TCP/IP五层模型基本协议及相关报文知识

    组成 : 物理层.数据链路层. 网络层 . 传输层.应用层 <1> 物理层: 传输比特流 依赖物理(电气)特性 <2> 数据链路层: 主要作用有三个: 封装成帧 . 透明传输. ...

  5. 网络协议 -- TCP协议(1)特性及协议首部

    一.TCP特性 尽管TCP和UDP都是用IP协议作为网络层,但TCP却提供和UDP完全不同的网络服务.TCP是面向连接的.稳定可靠的字节流服务.TCP首部的很多字段都是为了实现这2大特性而设计的. 在 ...

  6. Java—— TCP协议(相关代码实现以及相关优化)

    代码运行的时候先运行服务端,然后在运行客户端 * TCP协议:* 1,客户端* 创建Socket连接服务器(指定IP地址,端口号)通过IP地址找到对应的服务器* 调用Socket的getInputSt ...

  7. TCP协议-相关面试题

    一.TCP协议简介 一般问到TCP协议的时候 最常见的是TCP连接建立和断开的过程,也就是三次握手和四次挥手,两张图足矣. 1.1 三次握手 1.2 四次挥手 二.常见面试题 2.1 TCP连接阶段 ...

  8. 网络原理之TCP协议特性

    TCP协议: TCP,即Transmission Control Protocol,传输控制协议.人如其名,要对数据的传输进行一个详细的 控制.TCP是相对可靠并不是绝对的安全. TCP协议格式段 6 ...

  9. 一文读懂物联网 MQTT 协议之基础特性篇

    一.前言 上个月有个读者问我物联网 MQTT 协议实战相关的问题,我说后面会搞,没想到不知不觉一个月了,太忙了,再怎么忙答应的事情还是要给读者一个交代,所以就有了此文. 二.MQTT 协议概要 2.1 ...

最新文章

  1. 如何自学python到做项目-总算明白如何通过项目学习python
  2. StringBuilder/StringBuffer类
  3. 单播、多播和广播详解
  4. PAT甲级1085 Perfect Sequence :[C++题解]双指针
  5. win7系统升服务器版本,WIN7专业版可update补丁,WIN7旗舰版无法update补丁,WSUS服务器是按windows类型还是版本区别updata的还是其他什么方式...
  6. Asp.net中利用ExecuteNonQuery()执行存储过程返回-1解决方案
  7. 程序实现php文件上传,PHP实例:实现文件上传的程序源码_php
  8. (一)导学(Javascript设计模式系统讲解与应用)
  9. android弹窗闪退,[Android 小记] PopupWindow中放置Spinner 点击直接闪退的问题分析
  10. js中的内置对象(详细篇)
  11. 知行之桥®中文版EDI系统正式发布
  12. iphone一键转移_换iPhone数据转移太麻烦?用腾讯电脑管家iPhone助手一键搞定
  13. 移动平均法,加权平均法
  14. 20190803——python文件操作
  15. 阿里云香港云服务器ECS适合什么场景?
  16. CondaHTTPError: HTTP 000 CONNECTION FAILED for url <https://repo.anaconda.com/pkgs/main/win-64/curre
  17. 解决 ajax 跨域
  18. 福建省三明市谷歌卫星地图下载
  19. 设备未连接_电气设备安装工程常见定额解释!不要错过
  20. 长文慎入!经验分享-专科毕业5年,成功入职腾讯!

热门文章

  1. android rtmp推流,Android使用libRtmp直播推流
  2. webView加载全景图
  3. 互联网快讯:京东公布“双11”节奏;猿辅导、掌门教育布局素质教育
  4. 求最长上升子序列——LIS的O(nlogn)算法(二分)
  5. CAD的图层过滤器有什么用?
  6. 最适合小白的编程语言是什么?网友直呼:那当然是Python!
  7. Python三方微博登录
  8. html中加入清除浮动,HTML中清除浮动的几种办法
  9. Linux 下的用户、用户组、文件权限设置
  10. 程序员在网吧敲代码,这波操作真的太秀了!