标签:smi mod 滑动窗口 end 不用 另一个 port mission ima
最新教程下载:http://www.armbbs.cn/forum.php?mod=viewthread&tid=95243
本章节为大家讲解TCP(Transmission Control Protocol,传输控制协议),通过本章节的学习,需要大家对TCP有个基本的认识,方便后面章节TCP实战操作。
(本章的知识点主要整理自网络)
10.1 初学者重要提示
10.2 TCP基础知识参考资料
10.3 TCP基础知识点
10.4 TCP可靠性实现
10.5 TCP端口号
10.6 总结
磨刀不误砍柴工,初学者务必要对TCP的基础知识点有个认识,不是特别理解没有关系,随着后面逐渐的实战操作,会有比较全面的认识。
首次搞TCP通信,需要对TCP的一些基础知识有个了解。大家可以从以下地址获得TCP基础知识:
对于初学者来说,学习上面四个参考资料就够了。如果大家有网络方面的书籍,比如《TCP/IP详解》,也可以直接看书籍。
(这里的知识点整理自上面的参考资料地址)
教程这里也对TCP的基础知识做个介绍,方便大家快速上手操作。
TCP(Transmission Control Protocol,传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议,由IETF的RFC 793定义。在简化的计算机网络OSI模型中,它完成第四层传输层所指定的功能,用户数据报协议UDP是同一层内另一个重要的传输协议。在因特网协议族中,TCP层是位于IP层之上,应用层之下的中间层。不同主机的应用层之间经常需要可靠的、像管道一样的连接,但是IP层不提供这样的流机制,而是提供不可靠的包交换。
应用层向TCP层发送用于网间传输的数据流,然后TCP把数据流分成适当长度的报文段(受最大传输单元MTU的限制)。之后TCP把数据包传给IP层,由它来通过网络将数据包传送给接收端的TCP层。TCP为了保证不发生丢包,会给每个包一个序号,同时序号也保证了传送到接收端时,数据包的按序接收。然后接收端对已成功收到的包发回一个应答(ACK),如果发送端在设置的重传时间内未收到应答,那么对应的数据包会被认为已丢失将会进行重传。TCP使用校验和来检验数据是否有错误,在发送和接收时都要计算校验和。
Source Port(源端口16bits)
发送端口。
Destination Port(目的端口16bits)
接收端口。
Sequence Number(序列号32bits)
Acknowledgement Number(确认号32bits)
如果设置了ACK标志,则该字段的值是期望收到的数据的开始序列号,也即已经收到数据的字节长度加1。
Data Offset(报头长度4bits)
以4字节为单位计算出的数据段开始地址的偏移值。
Reserved(保留)
必须置0。
标志符
Window(窗口16bits)
表示从确认号开始,本报文的源方可以接收的字节数,即源方接收窗口大小,用于流量控制。
Checksum(校验和16bits)
对整个的TCP报文段,包括TCP头部和TCP数据,以16bits为单位进行计算所得。这是一个强制性的字段。
Urgent Pointer(紧急指针16bits)
本报文段中紧急数据的最后一个字节的序号。
Options(选项字段)
最多40字节。每个选项的开始是1字节的类型字段,说明选项的类型。
发送端的时间戳(Timestamp Value field,TSval,4字节)。
时间戳回显应答(Timestamp Echo Reply field,TSecr,4字节)。
Padding(零填充)
TCP头填充用于确保TCP头数据是4字节的整数倍,填充零。
TCP Data(TCP数据段)
剩下就是TCP数据字段了。
TCP使用三次握手协议建立连接。当主动方发出SYN连接请求后,等待对方回答SYN+ACK,并最终对对方的SYN执行ACK确认。这种建立连接的方法可以防止产生错误的连接,TCP使用的流量控制协议是可变大小的滑动窗口协议。TCP三次握手的过程如下:
三次握手完成,TCP客户端和服务器端成功地建立连接,可以开始传输数据了。
在TCP的数据传送状态,很多重要的机制保证了TCP的可靠性和强壮性。它们包括:
在TCP的连接创建状态,两个主机的TCP层间要交换初始序号(ISN:initial sequence number)。这些序号用于标识字节流中的数据,并且还是对应用层的数据字节进行记数。通常在每个TCP报文段中都有一对序号和确认号。TCP报文发送者认为自己的字节编号为序号,而认为接收者的字节编号为确认号。TCP报文的接收者为了确保可靠性,在接收到一定数量的连续字节流后才发送确认。这是对TCP的一种扩展,通常称为选择确认(Selective Acknowledgement)。选择确认使得TCP接收者可以对乱序到达的数据块进行确认。每一个字节传输过后,ISN号都会递增1。
通过使用序号和确认号,TCP层可以把收到的报文段中的字节按正确的顺序交付给应用层。序号是32位的无符号数,在它增大到2^32 - 1时,便会回绕到0。对于ISN的选择是TCP中关键的一个操作,它可以确保强壮性和安全性。
数据传输举例:
建立一个连接需要三次握手,而终止一个连接要经过四次握手,这是由TCP的半关闭(half-close)造成的。具体过程如下图所示。
注意:FIN的接收也作为一个文件结束符(end-of-file)传递给接收端应用进程,放在已排队等候该应用进程接收的任何其他数据之后,因为,FIN的接收意味着接收端应用进程在相应连接上再无额外数据可接收。
既然每个方向都需要一个FIN和一个ACK,因此通常需要4个分节。
注意:
无论是客户还是服务器,任何一端都可以执行主动关闭。通常情况是,客户执行主动关闭,但是某些协议,例如,HTTP/1.0却由服务器执行主动关闭。
TCP的16位校验和(checksum)的计算和检验过程如下:发送者将TCP报文段的头部和数据部分的和计算出来,再对其求反码(一的补数),就得到了校验和,然后将结果装入报文中传输。(这里用反码的原因是这种方法的循环进位使校验和可以在16位、32位、64位等情况下的计算结果再叠加后相同。)接收者在收到报文后再按相同的算法计算一次校验和。这里使用的反码使得接收者不用再将校验和字段保存起来后清零,而可以直接将报文段连同校验加总。如果计算结果是全部为一,那么就表示了报文的完整性和正确性。
注意:TCP校验和也包括了96位的伪头部,其中有源地址、目的地址、协议以及TCP的长度。这可以避免报文被错误地路由。
TCP提供一种面向连接的、可靠的字节流服务。面向连接意味着两个使用TCP的应用(通常是一个客户和一个服务器)在彼此交换数据包之前必须先建立一个TCP连接。这一过程与打电话很相似,先拨号振铃,等待对方摘机说“喂”,然后才说明是谁。在一个TCP连接中,仅有两方进行彼此通信。广播和多播不能用于TCP。
TCP通过下列方式来提供可靠性:
两个应用程序通过TCP连接交换8bit字节构成的字节流。TCP不在字节流中插入记录标识符。我们将这称为字节流服务(bytestreamservice)。如果一方的应用程序先传10字节,又传20字节,再传50字节,连接的另一方将无法了解发送方每次发送了多少字节。只要自己的接收缓存没有塞满,TCP 接收方将有多少就收多少。一端将字节流放到TCP连接上,同样的字节流将出现在TCP连接的另一端。
另外,TCP对字节流的内容不作任何解释。TCP不知道传输的数据字节流是二进制数据,还是ASSⅡ字符或者其他类型数据。对字节流的解释由TCP连接双方的应用层解释。
TCP协议用于控制数据段是否需要重传的依据是设立重发定时器。在发送一个数据段的同时启动一个重传,如果在重传超时前收到确认(Acknowlegement)就关闭该重传,如果重传超时前没有收到确认,则重传该数据段。在选择重发时间的过程中,TCP必须具有自适应性。它需要根据互联网当时的通信情况,给出合适的重发时间。
这种重传策略的关键是对定时器初值的设定。采用较多的算法是Jacobson于1988年提出的一种不断调整超时时间间隔的动态算法。其工作原理是对每条连接TCP都保持一个变量RTT(Round Trip Time),用于存放当前到目的端往返所需要时间最接近的估计值。当发送一个数据段时,同时启动连接的定时器,如果在定时器超时前确认到达,则记录所需要的时间,并修正RTT的值,如果定时器超时前没有收到确认,则将RTT的值增加1倍。通过测量一系列的RTT值,TCP协议可以估算数据包重发前需要等待的时间。在估计该连接所需的当前延迟时通常利用一些统计学的原理和算法(如Karn算法),从而得到TCP重发之前需要等待的时间值。
TCP的一项功能就是确保每个数据段都能到达目的地。位于目的主机的TCP服务对接受到的数据进行确认,并向源应用程序发送确认信息。
使用数据报头序列号以及确认号来确认已收到包含在数据段的相关数据。
TCP在发回源设备的数据段中使用确认号,指示接收设备期待接收的下一字节。这个过程称为期待确认。源主机在收到确认消息之前可以传输的数据大小称为窗口大小,用于管理丢失数据和流量控制。
如下图所示(来自wiki)。
建立TCP连接需要经过三次握手:主动端先发送SYN报文,被动端回应SYN+ACK报文,然后主动端再回应ACK。
在主动端发送SYN后,如果被动端一直不回应SYN+ACK报文,主动端会不断的重传SYN报文直到超过一定的重传次数或超时时间。
在主动端发送SYN后,被动端回应SYN+ACK报文,但主动端不再回复ACK,被动端也会一直重传直到超过一定的重传次数或超时时间。(SYN报文攻击会出现这种情况)
因此,用户可以配置SYN报文的超时时间(发送SYN报文到三次握手成功的最大时间),也就是建立TCP连接的超时时间,来达到更好的连接效果。
TCP的接收缓冲区是用来缓存从对端接收到的数据,这些数据后续会被应用程序读取。一般情况下,TCP报文的窗口值反映接收缓冲区的空闲空间的大小。对于带宽比较大、有大批量数据的连接,增大接收缓冲区的大小可以显著提供TCP传输性能。TCP的发送缓冲区是用来缓存应用程序的数据,发送缓冲区的每个字节都有序列号,被应答确认的序列号对应的数据会从发送缓冲区删除掉。增大发送缓冲区可以提高TCP与应用程序的交互能力。但是增大接收和发送缓冲区会导致TCP占用比较多的内存。
如果把IP地址比作一间房子 ,端口就是出入这间房子的门。真正的房子只有几个门,但是一个IP地址的端口可以有65536(即:2^16)个之多!端口是通过端口号来标记的,端口号只有整数,范围是从0 到65535(2^16-1)。
在Internet上,各主机间通过TCP/IP协议发送和接收数据包,各个数据包根据其目的主机的IP地址来进行互联网络中的路由选择,把数据包顺利地传送到目的主机。大多数操作系统都支持多程序(进程)同时运行,那么目的主机应该把接收到的数据包传送给众多同时运行的进程中的哪一个呢?显然这个问题有待解决,端口机制便由此被引入进来。
按照端口号的大小分类,可分为如下几类:
公认端口是众所周知的端口号,范围从0到1023,其中80端口分配给WWW服务,21端口分配给FTP服务等。我们在IE的地址栏里输入一个网址的时候是不必指定端口号的,因为在默认情况下WWW服务的端口是80。
网络服务是可以使用其他端口号的,如果不是默认的端口号则应该在地址栏上指定端口号,方法是在地址后面加上冒号”:”(半角),再加上端口号。比如使用8080作为WWW服务的端口,则需要在地址栏里输入“网址:8080”。
但是有些系统协议使用固定的端口号,它是不能被改变的,比如139 端口专门用于NetBIOS与TCP/IP之间的通信,不能手动改变。
端口1024到49151,分配给用户进程或应用程序。这些进程主要是用户选择安装的一些应用程序,而不是已经分配好了公认端口的常用程序。这些端口在没有被服务器资源占用的时候,可以被用户端动态选用为源端口。
动态端口的范围是从49152到65535。之所以称为动态端口,是因为它一般不固定分配某种服务,而是动态分配。
具体到端口的实际分配情况,可以看如下两个地址:
我们知道,一台拥有IP地址的主机可以提供许多服务,比如Web服务、FTP服务、SMTP服务等,这些服务完全可以通过1个IP地址来实现。那么,主机是怎样区分不同的网络服务呢?显然不能只靠IP地址,因为IP 地址与网络服务的关系是一对多的关系。实际上是通过“IP地址+端口号”来区分不同的服务的。需要注意的是,端口并不是一 一对应的。比如你的电脑作为客户机访问一台WWW服务器时,WWW服务器使用80端口与你的电脑通信,但你的电脑则可能使用“3457”这样的端口。
本章节就为大家讲解这么多,更多TCP的相关知识需要大家查阅相关书籍进行学习,或者网上搜索相关资料进行学习。
标签:smi mod 滑动窗口 end 不用 另一个 port mission ima
原文地址:https://www.cnblogs.com/armfly/p/13638066.html