TCP传输工作原理
引言
在TCP/IP体系结构中,IP协议只管将数据包尽力传送到目的主机,无论数据传输正确与否,它都不做验证,不发确认,也不保证数据包的顺序,因而不具有可靠性。这一问题要由传输层TCP协议来解决,TCP协议为Internet提供了可靠的无差错的通信服务。
一、OSI参考模型和TCP/IP参考模型
OSI模型(open system interconnection reference model)是基于国际标准化组织(ISO)的建议而发展起来的,它分为如图1所示的七层。
TCP/IP最初是为ARPANET网开发的网络体系结构,主要由两个重要协议即TCP协议和IP协议而得名。
虽然TCP/IP不是ISO倡导的标准,但它有广泛的商业应用,因此TCP/IP是一种事实上的标准。由于Internet已经得到了全世界的承认,因而Internet所使用的TCP/IP体系在计算机网络领域中就占有特殊重要的地位。
图1 OSI模型和TCP/IP模型
TCP/IP协议体系分为四个层次。由于TCP/IP协议集中没有考虑具体的物理传输介质,因此在TCP/IP的标准中并没有对数据链路层和物理层做出规定,而只是将最低的一层取名为网络接口层,只是规定了与物理网络的接口。这样,如果不考虑网络接口层,那么TCP/IP体系实际上就只有三个层次:应用层、传输层和网际层。
应用层有许多著名协议,如远程登录协议TELNET,文件传送协议FTP,简单邮件传送协议SMTP等。
传输层使用两种不同的协议。一种是面向连接的传输控制协议TCP;另一种是无连接的用户数据报协议UDP。传输层传送的数据单位是报文或数据流。
网际层主要协议就是无连接的网络互连协议IP。该层传送的数据单位是分组。与IP协议配合使用的还有三个协议:Internet控制报文协议ICMP、地址解析协议ARP和逆地址解析协议RARP。
二、TCP协议简介
TCP是专门用于在不可靠的因特网上提供可靠的、端对端的字节流通信的协议。通过在发送方和接收方分别创建一个称为套接字的通信端口就可以获得TCP服务。
TCP协议是一个可靠的面向连接的传输层协议,它将某结点的数据以字节流的形式无差错地传送到互联网的任何一台机器上。发送方的TCP将用户递交的字节流划分成独立的报文进行发送,而接收方的TCP将接收的报文重新装配上交给接收用户。TCP同时处理有关流量控制的问题,以防止快速的发送方“淹没”慢速的接收方。一旦数据报被破坏或丢失,通常是TCP将其重新传输,而不是应用程序或IP协议。
三、TCP数据报的传输
1.TCP数据报报头
发送和接收方TCP实体以数据报的形式交换数据。一个数据报包含一个固定的20字节的头、一个可选部分以及0或多字节的数据。TCP必须与低层的IP(使用IP定义好的方法)和高层的应用程序(使用TCP-ULP元语)进行通信。TCP还必须通过网络与其他TCP软件进行通信。图2给出了TCP数据报头的格式:
图2 TCP数据报头结构
●源端口、目的端口:16位长。标识出远端和本地的端口号。
●顺序号:32位长。表明了发送的数据报的顺序。
●确认号:32位长。希望收到的下一个数据报的序列号。
●TCP头长:4位长。表明TCP头中包含多少个32位字。
接下来的6位未用。
●URG:报文携带了紧急数据,urgent offset有效。
●ACK:ACK位置1表明确认号是合法的。如果ACK为0,那么数据报不包含确认信息,确认字段被省略。
●PSH:表示是带有PUSH标志的数据。接收方因此请求数据报一到便可送往应用程序而不必等到缓冲区装满时才传送。
●RST:用于复位由于主机崩溃或其它原因而出现的错误的连接。还可以用于拒绝非法的数据报或拒绝连接请求。
●SYN:用于建立连接。
●FIN:用于释放连接。
●窗口大小:16位长。窗口大小字段表示在确认了字节之后还可以发送多少个字节。
●校验和:16位长。是为了确保高可靠性而设置的。它校验头部、数据和伪TCP头部之和。
●可选项:0个或多个32位字。包括最大TCP载荷,窗口比例、选择重发数据报等选项。
2.可靠传输
当TCP发出一个分组后,它启动一个超时计时器,如果在超时计时器到期之前收到了对方的确认,就撤销已设置的超时计时器。如果不能及时收到一个确认,就认为刚才发送的分组丢失了,将重发这个分组,这就叫超时重传。
TCP中保持可靠性的方式就是确认和重传机制,这样就可以在不可靠的传输网络上实现可靠的通信。
3.传输策略
如果发送方把数据发送得过快,接收方可能会来不及接收,这就会造成数据的丢失。所谓流量控制就是让发送方的发送速率不要太快,要让接收方来得及接收。利用滑动窗口机制可以很方便地在TCP连接上实现对发送方的流量控制。
TCP中采用滑动窗口来进行传输控制,滑动窗口的大小意味着接收方还有多大的缓冲区可以用于接收数据。发送方可以通过滑动窗口的大小来确定应该发送多少字节的数据。当滑动窗口为0时,发送方一般不能再发送数据报。但有两种情况除外,一种情况是可以发送紧急数据,例如,允许用户终止在远端机上的运行进程。另一种情况是发送方可以发送一个1字节的数据报来通知接收方重新声明它希望接收的下一字节及发送方的滑动窗口大小。
4.拥塞控制
拥塞控制:防止过多的数据注入到网络中,这样可以使网络中的路由器或链路不致过载。
拥塞控制方法:慢开始( slow-start )、拥塞避免( congestion avoidance )、快重传( fast retransmit )和快恢复( fast recovery )。
发送方维持一个拥塞窗口 cwnd ( congestion window )的状态变量。拥塞窗口的大小取决于网络的拥塞程度,并且动态地在变化。发送方让自己的发送窗口等于拥塞窗口。
慢开始算法:当主机开始发送数据时,因为现在并不清楚网络的负荷情况。因此,较好的方法是先探测一下,即由小到大逐渐增大发送窗口,也就是说,由小到大逐渐增大拥塞窗口数值。
通常在刚刚开始发送报文段时,先把拥塞窗口 cwnd 设置为一个最大报文段MSS的数值。每经过一个传输轮次,拥塞窗口 cwnd 就加倍。慢开始的“慢”并不是指cwnd的增长速率慢,而是指在TCP开始发送报文段时先设置cwnd=1,使得发送方在开始时只发送一个报文段(目的是试探一下网络的拥塞情况),然后再逐渐增大cwnd。
为了防止拥塞窗口cwnd增长过大引起网络拥塞,还需要设置一个慢开始门限ssthresh状态变量(如何设置ssthresh)。慢开始门限ssthresh的用法如下:
当 cwnd < ssthresh 时,使用上述的慢开始算法。
当 cwnd > ssthresh 时,停止使用慢开始算法而改用拥塞避免算法。
当 cwnd = ssthresh 时,既可使用慢开始算法,也可使用拥塞控制避免算法。
拥塞避免算法:让拥塞窗口cwnd缓慢地增大,即每经过一个往返时间RTT就把发送方的拥塞窗口cwnd加1,而不是加倍。这样拥塞窗口cwnd按线性规律缓慢增长,比慢开始算法的拥塞窗口增长速率缓慢得多。
无论在慢开始阶段还是在拥塞避免阶段,只要发送方判断网络出现拥塞(其根据就是没有收到确认),就要把慢开始门限ssthresh设置为出现拥塞时的发送方窗口值的一半(但不能小于2)。然后把拥塞窗口cwnd重新设置为1,执行慢开始算法。这样做的目的就是要迅速减少主机发送到网络中的分组数,使得发生拥塞的路由器有足够时间把队列中积压的分组处理完毕。
如下图,用具体数值说明了上述拥塞控制的过程。现在发送窗口的大小和拥塞窗口一样大。
参考文献:
[1] TCP传输工作原理.
http://hi.baidu.com/qu_wj/item/e2d76d4418daf236fa8960d4
[2] TCP的流量控制和拥塞控制.
http://blog.sina.com.cn/s/blog_6988593e01015wu0.html
[3] 谢希仁.计算机网络(第5版)[M].北京:电子工业出版社,2007
TCP传输工作原理的更多相关文章
- TCP 重置攻击的工作原理
原文链接:https://fuckcloudnative.io/posts/deploy-k3s-cross-public-cloud/ TCP 重置攻击 是使用一个单一的数据包来执行的,只有几个字节 ...
- TCP可靠传输的工作原理
TCP可靠传输的工作原理 一.停止等待协议 1.1.简介 在发送完一个分组后,必须暂时保留已发送的分组的副本. 分组和确认分组都必须进行编号. 超时计时器的重传时间应当比数据在分组传输的平均往返时间更 ...
- TCP/IP协议工作原理简述
TCP/IP协议工作原理简述 // */ // ]]> TCP/IP协议工作原理简述 Table of Contents 1 概要 2 应用层 3 传输层 4 网络层 5 链路层 1 概要 ...
- [网络编程] TCP、UDP区别以及TCP传输原理、拥塞避免、连接建立、连接释放总结
TCP.UDP都是属于运输层的协议,提供端到端的进程之间的逻辑通信,而IP协议(网络层)是提供主机间的逻辑通信,应用层规定应用进程在通信时所遵循的协议.一.UDP主要特点:传输的是用户数据报协议.1. ...
- TCP协议通讯工作原理
TCP协议通讯工作原理 一.TCP三次握手 传输控制协议(Transport Control Protocol)是一种面向连接的,可靠的传输层协议.面向连接是指一次正常的TCP传输需要通过在TCP ...
- FTP(文件传输协议)工作原理
目前在网络上,如果你想把文件和其他人共享.最方便的办法莫过于将文件放FTP服务器上,然后其他人通过FTP客户端程序来下载所需要的文件. 1.FTP架构 如同其他的很多通讯协议,FTP通讯协议也采用客户 ...
- 运输层4——TCP可靠运输的工作原理
目录 1. 停止等待协议 写在前面:本文章是针对<计算机网络第七版>的学习笔记 运输层1--运输层协议概述 运输层2--用户数据报协议UDP 运输层3--传输控制协议TCP概述 运输层4- ...
- 《浏览器工作原理与实践》<02>TCP协议:如何保证页面文件能被完整送达浏览器?
前言: 在衡量 Web 页面性能的时候有一个重要的指标叫“FP(First Paint)”,是指从页面加载到首次开始绘制的时长.这个指标直接影响了用户的跳出率,更快的页面响应意味着更多的 PV.更高的 ...
- 转:TCP/IP协议栈的基本工作原理
转载自:http://jasonccie.blog.51cto.com/2143955/422966 TCP/IP是互联网的核心协议,也是大多数网络应用的核心协议.就前面一段时间面试中问到的TCP/I ...
随机推荐
- Sql server 本地临时表、全局临时表的区别
创建了本地临时表#Tmp.全局临时表##Tmp: 本地临时表: 取名以#开头.如:#Tmp(会自动加上一串后缀) 只有当前的连接可以访问 连接关闭后,本地临时表自动释放 全局临时表: 取名以##开头. ...
- iOS显示一张图片 Objective-C
图片文件放在项目目录下 #import "ViewController.h" @interface ViewController () @end @implementation V ...
- 在iframe内页面完全加载完后,关闭父页面生成的div遮罩层
遮罩层div为iframe父页面生成,需在iframe内页面完全加载完后,关闭遮罩层 alertMsgClose() :函数为关闭遮罩层函数 此段代码在iframe页面内: <script> ...
- HDU_1072_Nightmare
题目:http://acm.hdu.edu.cn/showproblem.php?pid=1072 题目描述:矩阵表示迷宫,0表示墙,1表示路,2表示起点,3表示终点,4表示重置炸弹时间(6秒),你需 ...
- c++类简介
C++类(Class)总结 一.C++类的定义 C++中使用关键字 class 来定义类, 其基本形式如下:class 类名{ public: //行为或属性 protected: // ...
- 浅谈GFC
Web页面的布局,我们常见的主要有“浮动布局(float)”.“定位布局(position)”.“行内块布局(inline-block)”.“CSS3的多栏布局(Columns)”.“伸缩布局(Fle ...
- 若要允许 GET 请求,请将 JsonRequestBehavior 设置为 AllowGet(转载)
若要允许 GET 请求,请将 JsonRequestBehavior 设置为 AllowGet 若要允许 GET 请求,请将 JsonRequestBehavior 设置为 AllowGet 请将 J ...
- BZOJ 2223: [Coci 2009]PATULJCI 主席树
Code: #include<bits/stdc++.h> #define maxn 300001 #define mid ((l+r)>>1) using namespace ...
- C++ 实现Golang里的defer
不多说了,直接贴代码.就一个hpp文件. 1 #include <functional> 2 3 #define CONCAT_(a, b) a##b 4 #define CONCAT(a ...
- for 循环新的写法==列表解析
1. (for x in L1) 是一个可迭代对象: 2. 列表解析比for 循环快,列表解析的迭代在解释器内部是以C语言速度执行, 而不是手动python代码执行: (x+10 for x in L ...