对于TCP简单的理解
TCP作为一种面向连接的,可靠的协议,它属于传输层的协议。只有在确认通信对端存在时才会发送数据,从而可以控制通信流量的浪费。TCP通过检验和、***、确认应答、重发控制、连接管理以及窗口控制等机制实现可靠性传输。
--------------------------------------------------------------------
TCP首部格式
源端口、目标端口:发送端和接收端的端口号
***:表示数据发送的位置,每发送一次数据,就累加一次该数据字节数的大小,不会从0、1开始,而是在建立连接时由计算机生成的随机数作为其初始值,通过SYN包传给接收端主机。SYN包和FIN包也会作为一个字节增加对应的***。
确认应答号:由接收端发送,指下一次应该收到的数据的***。 实际上,它是指已收到确认应答号减一为止的数据。发送端收到这个确认应答以后可以认为在这个序号以前的数据都已经被正常接收。因此当前报文段最后一个字节的编号+1即为确认应答号。
数据偏移:该字段表示TCP所传输的数据部分应该从TCP包的哪个位开始计算,当然也可以把它看作TCP首部的长度,单位为4字节。
窗口大小:用于通知从相同TCP首部的确认应答号所指位置开始能够接收的数据大小,TCP不允许发送超过此处所示大小的数据。
控制位:
字段 |
含义 |
URG |
紧急指针是否有效。为1,表示某一位需要被优先处理 |
ACK |
确认应答号是否有效,1为有效。TCP规定除了最初建立连接时的SYN包之外该位必须设置为1 |
PSH |
为1时,表示需要将收到的数据立刻传给上层应用协议;为0时,则不需要立即传而是先进行缓存。 |
RST |
为1时表示TCP连接中出现异常必须强制断开连接。 |
SYN |
用于建立连接。SYN为1表示希望建立连接,并在其***的字段进行***初始值的设定。 |
FIN |
为1时,表示今后不会再有数据发送,希望断开连接。 |
--------------------------------------------------------------
三次握手
任意次的握手都是“不可靠”的,握手成功只能说明握手时的通信是正常的,并不能保证握手后的通信是正常的。握手只能保证尽可能的可靠,而不可能保证绝对可靠。
四次挥手
TCP连接是双向的,在四次挥手中,前两次挥手用于断开一个方向的连接,后两次挥手用于断开另一方向的连接。
--------------------------------------------------------------
相关机制
确认应答机制:当发送端的数据到达接收主机时,接收端主机会返回一 个已收到消息的通知。这个消息叫做确认应答(ACK)。当发送端将数据发出之后会等待对端的确认应答。如果有确认应答,说明数据已经成功到达对端。反之,则数据丢失的可能性很大。在一定时间内没有等到确认应答,发送端就可以认为数据已经丢失,并进行重发。当然没有收到确认应答,不代表数据没有被接受,可能是应答信号丢失了。发送端没有收到确认应答信号会重发。
重发超时:指在重发数据之前,等待确认应答到来的那个特定时间间隔。如果超过了这个时间仍未收到确认应答,发送端将进行数据重发。这个时间需要确保“确认应答”可以在这个事件内返回,这个事件会受到数据包途径的网络环境的不同而变化。数据也不会被无限、反复地重发。达到一定重发次数之后,如果仍没有任何确认应答返回,就会判断为网络或对端主机发生了异常,强制关闭连接。并且通知应用通信异常强行终止。
TCP要求不论处在何种网络环境下都要提供高性能通信,并且无论网络拥堵情况发生何种变化,都必须保持这一特性。为此,它在每次发包时都会计算往返时间(RTT)和偏差(RTT时间波动的值、方差。也叫抖动。) 。将这个往返时间和偏差相加。
MSS(最大消息长度):在建立TCP连接的同时,也可以确定发送数据包的单位。理想的情况是,最大消息长度正好是IP中不会被分片处理的最大数据长度。TCP在传送大量数据时,是以MSS的大小将数据进行分割发送。进行重发时也是以MSS为单位。 MSS是在三次握手的时候,在两端主机之间被计算得出。两端的主机在发出建立连接的请求时,会在TCP首部中写入MSS选项,告诉对方自己的接口能够适应的MSS的大小。
窗口控制:TCP以1个段为单位,每发一个段进行一次确认应答的处理这样的传输方式有一个缺点。那就是包的往返时间越长通信性能就越低。TCP引入了窗口这个概念,确认应答不再是以每个分段,而是以更大的单位进行确认,转发时间将会被大幅度的缩短。也就是说,发送端主机,在发送了一个段以后不必要一直等待确认应答,而是继续发送。窗口大小就是指无需等待确认应答而可以继续发送数据的最大值。这个机制实现使用大量的缓冲区。收到确认应答的情况下,将窗口滑动到确认应答中的***的位置。这样可以顺序地将多个段同时发送提高通信性能。这种机制也被称为滑动窗口控制。
TCP提供一种机制可以让发送端根据接收端的实际接收能力控制发送的数据量。这就是所谓的流控制。它的具体操作是,接收端主机向发送端主机通知自己可以接收数据的大小,于是发送端会发送不超过这个限度的数据。该大小限度就被称作窗口大小。窗口大小的值就是由接收端主机决定的。 TCP首部中,专门有一个字段用来通知窗口大小。接收主机将自己可以接收的缓冲区大小放入这个字段中通知给发送端。这个字段的值越大,说明网络的吞吐量越高。
存在窗口控制时,考虑重发机制。先考虑确认应答未能返回的情况。在这种情况下,数据已经到达对端,是不需要再进行重发的,可通过下一次确认应答确认。然而,在没有使用窗口控制的时候,没有收到确认应答的数据都会被重发。当报文丢失时,接收端会发送缺失块的确认应答,即想要接受的序号数据块。发送端连续三次接受后会进行重发。
--------------------------------------
拥塞控制
有了TCP的窗口控制,收发主机之间即使不再以一个数据段为单位发送确认应答,也能够连续发送大量数据包。然而,如果在通信刚开始时就发送大量数据,也可能会引发其他问题。 一般来说,计算机网络都处在一个共享的环境。因此也有可能会因为其他主机之间的通信使得网络拥堵。在网络出现拥堵时,如果突然发送一个较大量的数据,极有可能会导致整个网络的瘫痪。 TCP为了防止该问题的出现,在通信一开始时就会通过一个叫做慢启动的算法得出的数值,对发送数据量进行控制。