前言
TCP:传输控制协议。是面向连接的,可靠的传输层协议。
TCP协议一对一,点对点的协议。
TCP是面向字节流的(把应用层传下来的报文看成字节流,把字节流组织成大小不等的报文段)
TCP具备“可靠性传输”,“流量控制”,“拥塞控制”的功能。
本文主要对上述问题进行较为简单的解释,便于入门。(可以应付部分面试题目)
在这里先引入一个概念:
TCP协议首部格式:
TCP是将信息分为一个一个的报文段完成的,这些报文段都有一套相同的格式。这个格式中保证了了TCP连接的很多功能实现。
首部格式如上图所示:
源端口和目的端口:(4个字节)源端口表示发送方的端口、目的端口表示接收方的端口。
序号:TCP连接中传送的数据流中每个字节都有字节的序号。序号字段的值就是本报文段发送的数据的第一个字符的序号,代表每次发送数据的位置,每发送一次序号就增加一次。
确认号:期望收到对方下一个报文段的数据的第一个字节的序号。这个和序号是收发双方的关系,当发送方发送一个序号为100,长度为100的报文段时候,接收方就要给发送方发送报文,报文段中就写着确认号:200。基本意思就是:本次收到你发送的从100开始100个字节的数据,我已经确定收到,我发送个确认号,200,希望你下次发送序号为200的数据。
数据偏移:数据部分距离报文首部的偏移量,表示TCP传输的数据应该从TCP包哪的哪个位置开始计算,就是数据长度。
保留(站4位)保留为今后使用,一般设置为0;
控制位:用于传输过程中,传递控制标志位。
控制位又分为如下六个:
紧急URG:当URG=1时,表示紧急指针字段有效,他告诉系统此报文中又紧急数据。
确认ACK:ACK是对已接收数据的确认。默认是ACK=0,当ACK=1时,确认号字段才有效。
同步SYN:在建立连接的时候使用,表示这是一个建立请求或者连接接收的报文。
推送PSH:接收TCP收到PSH=1的报文段,就应该尽快的交付接收应用进程,而不需要等整个缓存都填满了后再向上交付。
复位RST:当RST=1时,表面TCP连接中出现严重差错。必须释放连接。重新建立连接。
终止FIN:用来释放一个连接。FIN=1表示此报文段的发送端数据已经发送完毕,并且要求释放传输连接。
窗口:
窗口值作为接收方让发送方设置其发送窗口的依据,这个值是根据接收方的数据缓存空间决定的。
校验和:检验和极端检验的玩味包括首部和数据两部分,在计算检验和的时候,要在TCP报文段的前面加上12字节的伪首部。
紧急指针:指出本报文段中紧急数据一共有多少字节。
建立可靠的连接:
TCP协议的三次握手:建立连接:
第一次握手:客户端向服务器发送一个报文段:报文段里面含有:SYN=1,确认ACK=0。根据TCP的首部格式这是一个请求建立连接的数据报。
第二次握手:服务器收到客户端发送的第一个数据包后,根据SYN=1,ACK=0,判断出是主动 建立连接的数据包。同意连接就发送:同步SYN=1,确认ACK=1的数据包进行回应。
第三次握手:客户端收到确认后,返回给服务器一个数据包:SYN=0,ACK=1。
为什么要有第三次握手:
客户端先发出一个建立连接的请求数据包,由于网络原因,客户端在设定的超时时间内,还未收到服务器的确认数据包。于是发出第二个建立连接的请求数据包,这次网路通畅,数据包很快到达服务器,服务器的确认数据包也很快就到达客户端。于是客户端与服务器开始传输数据。但是客户端第一次发出的建立连接的请求数据包到达服务器,服务器以为是再次建立连接,所以又发出一个确认数据包。由于客户端已经收到了一个确认数据包,所以会忽略服务器发来的第二个确认数据包,但是服务器发出确认数据包之后就要一直等待客户端的回复,而此时的客户端永远也不会回复服务器。由此服务器无效等待,造成资源浪费。如果过于频繁会导致服务器停止响应。
PS:我实在不知道为什么会给这个机制起这样一个名字,握手应该是双方的问题,三次握手应该有三次双方,实际上没有这样的。可能是叫三次挥手会和底下的四次挥手搞乱吧。
四次挥手:
第一次挥手:首先客户端向服务器发送释放连接的请求报文,并且停止发送数据、
连接释放报文(数据包)的TCP首部中:终止FIN=1,确认ACK=0
第二次挥手:(客户端申请释放,服务器发最后的文件发送给客户端)服务器收到连接释放的报文后,给客户端发送确认报文,从客户端到服务器这个方向的连接就释放了。此时客户端没有数据给服务器了,但是服务器还有数据发送给客户端,客户端依然可以接收。 服务器发送给客户端的报文首部:FIN=0,确认ACK=1
第三次挥手如果服务器已经没有向客户端发送数据了,其应用进程就通知TCP释放连接,并向客户端发送确认报文。FIN=1,ACK=1;
第四次挥手 客户端收到服务器的连接释放报文后,向服务器发出确认报文。ACK=1,FIN=0;
确认应答:
在TCP协议中华,当发送端的数据到达接收主机时,接收端主机会返回一个已经收到消息的通知,即就是确认应答,ACK。
重传机制:
重传超时:重传超时是指在重发数据之前,等待确认应答到来的哪个特定时间间隔。如果超过了值隔时间还没收到确认应答,发送端将进行超时重传
超时重传:是TCp协议的重传机制的一种。在重发超时的时间间隔内,没有等到确认应答,发送端就可以认为数据包已经丢失,就会重新发送该数据。
快速重传:当收到三个相同的ACK报文的时候,会在重传超时过期之前,重传丢失的报文段。而重传什么数据,是基于SACK方法实现的
SACK方法:在TCP首部格式的{选项}中添加一个SACK,它可以将缓存区的数据发送给发送方,这样根据缓存区的数据,发送方就知道自己要重传什么。
滑动窗口
TCP首部格式有个窗口字段代表滑动窗口的大小,用于接收方通知发发送方自己有多少缓冲区可以接收数据,发送方可以根据接收方的处理能力来发送数据,不会导致接收方处理不过来。
TCP
在传输数据的时候,如果数据比较大,通常会拆分成一段一段的进行发送。每发送一个数据,都要进行一次确认应答。当上一个数据包收到了应答了, 再发送下一个。但是,为了能够提高传输的效率,不可能一段一段的进行发送,等一段收到确认了在去发送下一段,这样效率是比较低的。这样的传输方式有一个缺点:数据包的往返时间越长,通信的效率就越低。
为解决这个问题,TCP 引入了窗口这个概念。可以指定窗口大小,窗口大小就是指无需等待确认应答,而可以继续发送数据的最大值。窗口的实现实际上是操作系统开辟的一个缓存空间,发送方主机在等到确认应答返回之前,必须在缓冲区中保留已发送的数据。如果按期收到确认应答,此时数据就可以从缓存区清除。即使在往返时间较长的情况下,它也不会降低网络通信的效率。
TCP
协议通过滑动窗口的机制解决了流量控制和乱序重排。
拥塞控制:
慢开始:
由小到大逐渐增大发送窗口,令cwnd=1,每次将cwnd加倍。
拥塞避免:
即就是设置一个慢开始门限ssthresh,因为cwnd的增长速度非常快。如果超过这个门限就进入拥塞避免,每次将cwnd加1。如果出现超时则令ssthresh=cwnd/2,然后执行快恢复
快重传
发送方只要一连收到三个重复确认就应当立即重传对方尚未收到的报文段
快恢复
当发送端收到连续三个重复的确认时,就执行将cwnd当前的值减半作为新的门限值,冰然cwnd的值等于这个新的满开始门限。随后执行拥塞避免。