《数据通信与网络》笔记--TCP
《数据通信与网络》笔记--TCP
TCP是面向连接,可靠的协议,为发送数据它在2个TCP之间建立一个虚拟连接(其实这个连接是不存在的,是通过重传和确认来实现的)。
TCP特点
流传递服务
TCP允许发送进程以字节流形式传递数据,并且接收进程以字节流的形式接收数据,TCP建立了一种环境,在这种环境中,两个进程好像由
一个假想的管道连接,这个管道通过网络传送这些进程的数据,在这个假想的环境中,发送进程顺序写入字节流,而接收进程顺序读取字节流。
段
尽管发送进程是以自己流的形式发送数据的,但是IP层作为TCP服务的提供者,需要以分组的方式而不是字节流的方式发送数据,在传输层,
TCP将多个字节分组何在一起成为一个分组(由于这个原因造成了网络粘包问题),这个分组称为段(segment),TCP给每个段添加头部(为了
控制的目的),并将该段传递给IP层。段被封装到IP数据报中,然后再进行传输。整个操作度i接收进程是透明的。这些段可能被无序接收,丢失,
或者损坏和重发,所有这些均由TCP处理,接收进程不会觉察到任何操作。
段格式
源端口:16位,主机发送该段的应用程序端口号。
目的端口:16位,主机接收该段的应用程序的端口号。
序号:32位,这个字段定义了一个数,他分配给段中数据的第一个字节。在建立连接时,每一方都使用随机数生成器产生一个初始序列号
(initial sequence number,ISN),通常每个方向的ISN都不一样。
比如一个TCP连接正在传送一个5000字节的文件,随机生成一个字节序号是1001,每个数据段携带1000个字节,每个段的序号如下:
段1:序号:10001 (范围:10001~11000)
段2:序号:11001 (范围:11001~12000)
段3:序号:12001 (范围:12001~13000)
段4:序号:13001 (范围:13001~14000)
段5:序号:14001 (范围:14001~15000)
确认序号:32位,这个字段定义了段的接收方期待的字节号,如果段的接收方成功地接收了对方发来的最后一个字节号x,它的确认号定义为x+1。
确认号和数据可以捎带在一起进行发送。
头部长度:4位,指定了TCP头部*有多少个字节的长度,头部的长度在20~60字节之间,字段如果为5(5*4=20字节)到15(15*4=60)之间。
保留:6位
控制字段:在TCP流量控制,连接建立和终止,连接失败和数据传输时使用。
URG:紧急指针有效
ACK:确认有效
PSH:请求急迫
RST:连接复位
SYN:同步序列号
FIN:终止连接
窗口:16位,定义对方必须维持的窗口大小,这个值通常称为接收窗口(rwnd),它由接收方确定。此时发送方必须服从接收方的支配。
校验和:16位,校验过程和UDP的一样(也包含伪头部),但是UDP中校验和是可选的,TCP中校验和是强制的。
紧急指针:16位,只有紧急标志位置位时才有效,这个段包含了紧急数据。它定义了一个数,将此数加到序列号上就得出该段数据部分中最后一个紧急字节。
选项:最多有40个字节,本文不做讨论。
TCP连接
连接建立
在TCP中,连接建立称为三次握手(three-wat handsharking)。步骤如下:
1.客户发送个一个段是SYN,这个段只有SYN标志位置位,它用于序列号的同步,他占用一个序列号。
2.服务器接收到段后,发送一个段,其中ACK和SYN标志位置位,这个段有2个目的,它是另一个方向通信的SYN段,并用ACK标志作为对
第一个SYN段的确认。它占用一个序列。
3.客户机发送第三个段。这个段只有一个ACK段,它使用ACK标志位和确认序号字段来确认收到的第二个段。注意:这个段的序列号与SYN
段中的序列号相同,ACK段没有占用任何序列号。
SYN泛洪攻击
在TCP中,连接建立过程容易遭受到称为SYN洪泛攻击(SYN flooding attack)的严重安全问题。当一个恶意攻击者将大量的SYN段
发送到一个服务器,在数据报中通过伪装源地址假装这些段来自不同的客户端时就发生了这种情况。假定客户机发出主动打开,服务器分
配必要的资源,如生成通信表和设置计时器等。然后服务器发送SYN和ACK段给假客户端,但是这些段都丢失了。然而这段时间内,很多
资源都被占用但是没有用,如果短时间内,SYN数量很大,服务器最终会耗尽它的资源而崩溃。这种SYN洪泛攻击属于一种称为拒绝服务
攻击(denial of service attack)的安全攻击类型。
数据传输
上图中,客户端用2个段发送了2000个字节的数据,服务器发送了另外一个段,前面3个段携带数据与确认,但是最后一个段仅携带确认,
这时因为已经没有数据发送了,注意序列号与确认号的数值,客户端发送的数据段有PSH标记,所以服务器TCP知道当收到数据后立刻传递
给服务器进程,另一方面,来自服务器的段没有设置急迫标识。
请求急迫
发送方的TCP使用缓冲区存储来自发送方应用程序的数据流,接收方的TCP在数据到达时也将数据进行缓存,并当应用程序准备就绪时
或当接收端TCP认为方便时将这些数据传递给应用程序,这种灵活性增加了TCP的效率。但是,在有些情况下,我们并不需要这种灵活性,
比如,应用程序与另一个应用程序进行交互,一方的应用程序将其击键发送给对方的应用程序,并希望接受到立即响应。数据的延迟传输
对这个应用程序来说是不可接受的。
TCP可以处理这种情况,在发送段的应用可以请求急迫操作,这表示发送端的TCP不必等待窗口被填满,它创造了一个段就立即被发送,
发送端的TCP还必须设置急迫位(PSH)以告诉接收端,这个段包含的数据必须尽快地传递给接收应用程序。
紧急指针有效
TCP是面向字节流的协议,这就是说,从应用程序到TCP的数据被表示成一串字节流,数据的每一个字节在流中占用一个位置。但是在某些
情况下,应用程序需要发送紧急字节。这表示发送应用程序希望某一块数据由接收应用程序不按照顺序读取,比如:发送应用程序正在发送数据,
当处理结果返回时,发送应用程序出现了差错,他希望终止过程,但是他已经发送了大量的数据,如果发出异常终止命令,这个命令会被添加到
接收端TCP缓冲区的末尾,当所有的数据被处理完成后,才能处理这个终止命令。
解决这个问题的方法是发送将URG位置1的段,发送应用的TCP创建段,并将紧急数据放在段的开始,段的其余部分可以包括来自缓冲区的
普通数据,头部中的紧急指针字段定义了紧急数据的结束和普通数据的开始。
当接受段TCP接受到URG位置1的段,他就利用紧急指针的值从段中读取紧急数据。并将其传递给接收应用程序。
连接终止
1.客户的TCP发送一个段,FIN段,FIN可能包含客户机要发送的最后数据块。上图只是控制段,如果它只是控制段,它仅占用一个序列号。
2.服务器TCP接收到FIN后,发送第二个段:FIN+ACK段,证实它接收到来自客户端的FIN段,同事通道另一端连接关闭,这个段也可以包含
服务器发送给客户端的最后数据块。如果不携带数据,则这个段仅占用一个序列号。
3.客户端TCP发送最后一个段,ACK段,证实它接收到来自服务器的FIN段,这个段包含确认号,他是接收到来自服务器FIN段的序号+1,这个段
不携带数据也不占用序列号。
半关闭
TCP中,通信是全双工的,同一时间数据是双向传输的,所以一端可以停止发送数据后,还可以继续接受数据。这就是所谓的半关闭
(half—close),任何一段都可以发起半关闭。
客户端发送了FIN段半关闭连接,服务器通过发送ACK段确认半关闭。从客户端到服务器的数据传输结束,但是服务器还是可以发送数据。
当服务器已经发送完被处理的数据后,它发送一个FIN段。该FIN由客户端的ACK来确认。
连接半关闭后,数据可以从服务器传送给客户端,而确认可从客户端传送给服务器。这边半关闭是值应用层无法再发送数据,但是在系统
层面的TCP/IP实现上还是可以有通信的。
流量控制
TCP使用滑动窗口来进行流量的控制,实现上类似于数据链路层的滑动窗口,
但是这里的滑动窗口与数据链路层所使用的有两点不同:1.TCP的滑动窗口时面向字节的,而数据链路层的滑动窗口时面向帧的;第二点,TCP
的滑动窗口是大小可变的,而数据链路层的滑动窗口时大小固定的。
TCP的窗口大小取决于2个值中比较小的一个:接收方窗口(rwnd),拥塞窗口(cwnd),接收方窗口值是在另一端的确认段中宣布的,
他就是另一端在它的缓存溢出和数据被丢弃之前能够接收的字节个数。拥塞窗口是网络防止拥塞所确定的值,关于拥塞窗口会在以后进行说明。
差错控制
TCP是可靠的传输协议,TCP传递给应用程序的数据流必须是按序的,无差错的,没有任何一部分丢失或重复。TCP使用差错控制提供可靠性。
主要通过以下3种简单的工具完成:校验和,确认和超时。
校验和
每个段都包含校验和字段,用来检查收到损坏的段。
确认
TCP使用确认方法来证实收到了数据段,不携带数据单占用序列号的一些控制段也要确认,但是ACK是不需要确认的。
重传
差错控制的核心是段的重传,当一个段损坏,丢失或者延迟时,就重传这个段,在当前实现中,有2种情况要重传段:重传计时器(retransmission timer)
到时或当发送方收到3个重复的ACK。
RTO后重传 TCP对所有的段的最新实现使用了一个重传超时(retransmisson time-out,RTO)计时器,当计时器到达时,及时可能是由于段被延迟,ACK
被延迟或丢失确认等未接收到ACK时,重发一个最早的重要的段。注意,对仅携带确认的段没有设置超时计时器,这说明这样的段不需要重发。在TCP中,RTO
的值是动态的,根据段的往返时间(round trip time,RTT)进行更新。RTT是一个段到达目的端并接收到一个确认所需要的时间。
三个重复ACK之后的重发如果RTT的值不是很大,段重发钱的规则是可用的,但有时某一段丢失了,而接收端收到了很多失序的段,他们是不可能被存储的
(有限的存储空间)。为了缓解这种情况,当今大多数实现遵循三次重复ACK规则,立即重发缺少的段。这一特点称为快速重发(fast transmission)。
上图中,当接收方接收到第四个,第五个和第六个段时,它触发一个确认,发送方接收到4个具有相同值的确认。虽然段3的计时器还没有到时,
但是快速重传要求立即重发段3.
上一篇: Android 线程的控制及原理 并发
下一篇: 推荐阅读那年在深圳找工作的日子