TCP协议详解(三次握手,传输数据,四次挥手)
首先来了解一下什么是TCP(传输控制协议):简单点来讲TCP它是一种网络通信协议,旨在通过internet发送数据包。TCP是OSI层中的传输层协议(第四层),用于通过传输和确保通过支持网络和internet传递消息来在远程计算机之间创建连接。
TCP协议的特点:
(1)TCP协议是面向连接的传输层协议,在数据传输前必须建立连接,数据传输之后释放连接。
(2)TCP提供可靠交付的服务,所谓可靠是指在传输过程中无重复,无丢失,无错误。但是同时会增加开销。
(3)每一条连接都是点对点连接(一对一)
(4)面向字节流,所谓字节流指的是以传输过程中流入进程和流出进程的字节序列,虽然传输过程中是一个一个数据报,但这只是为了方便传输,之后在目的端重新装配。
(5)TCP提供全双工通信,所谓全双工是指一端既可以是客户端,也可以是服务器端。
tcp通信过程包括三个步骤:
1):建立TCP连接通道(三次握手)
2):传输数据(超时重传,快速重传,流量控制,拥塞控制等等。)
3):断开连接(四次挥手)
三次握手过程:
第一次握手: 客户端发送syn包到服务器,并进入syn_sedn状态,等待服务器确认;
SYN=1,ACK=0表示请求连接。
X表示本次字节流的初始序号。
TCP规定:此时没有数据传输,但是消耗一个序号。
第二次握手: 服务器接受syn包,必须确认客户的syn(ack=x+1),同时自己也发送一个 syn包(seq=y),即syn+ack包,此时服务器进入syn_recv状态;
SYN=1,ACK=1表示同意连接的应答响应。
Y表示本次字节流的初始序号。
X+1表示希望收到的字节起始序号。
第三次握手: 客户端收到服务器的syn+ack包,向服务器发送确认ack(ack=y+1),此包发送完毕,客户端和服务器进入established状态,完成三次握手。
注意: 握手过程中传送的包里不包含数据,三次握手完毕后 客户端与服务器端才正式开始传送数据。理想状态下,TCP连接一旦建立,在通信双方的任意一方没有主动关闭连接之前,TCP连接将一直保持下去。
传输数据过程:
a.超时重传: 超时重传机制用来保证TCP传输的可靠性。每次发送数据包时,发送的数据报都有seq号,接收端收到数据后,会回复ack进行确认,表示某一seq号数据已经收到。发送方在发送了某个seq包后,等待一段时间,如果没有收到对应的ack回复,就会认为报文丢失,会重传这个数据包。
b.快速重传: 接收数据一方发现有数据包丢失了,就会发送ack报文告诉发送端重传丢失的报文。如果发送端连续收到标号相同的ack包,则会触发客户端的快速重传。比较超时重传和快速重传,可以发现超时重传是发送端在等超时,然后触发重传;而快速重传则是接收端主动告诉发送端数据没收到,然后触发发送端重传。
C.流量控制: 这里主要说TCP滑动窗流量控制,与网络无关。TCP头里有一个字段叫window,也就是advertised-window,这个字段是接收端告诉发送端自己还有多少缓冲区可以接收数据。于是发送端就可以根据这个接收端的处理能力来发送数据,而不会到时接收端处理不过来。滑动窗可以是提高TCP传输效率的一种机制。
d.拥塞控制: 滑动窗用来做流量控制。流量控制只关注发送端和接收端自身的状况,而没有考虑整个网络的通信状况。拥塞控制则是基于整个网络来考虑的。如果某一时刻网络上的延时突然增加,那么 TCP对这个事做出的应对只有重传数据,但是 重传会加重网络负担,所以会导致更大的延迟以及更多的包丢失,于是这个情况就会进入一个恶性循环,试想一下,如果一个网络内有成千上万的TCP连接都这样,那么TCP这个协议就会拖垮整个网络。所以 TCP引入了拥塞控制策略。拥塞控制策略算法主要包括:慢启动,拥塞避免,拥塞发生,快速恢复。
四次挥手过程:
第一次挥手: A发送一个FIN(连接释放请求),用来关闭A方到B方的数据传送,也就是A告诉B我不会再给你发送数据了,但此时B还可以接受数据。此时A进入FIN_WAIT状态。
FIN=1,表示释放连接。
seq=u,u-1表示确认的最后一个数据序号。
第二次挥手: B收到FIN(连接释放请求)后,发送一个ACK(应答响应)给对方,确认序号为收到序号+1;此时B进入CLOSE_WAIT状态。
ACK=1:除TCP连接请求报文段以外,TCP通信过程中所有数据报的ACK都为1,表示应答。
seq= v:v-1是B向A发送的最后一个字节的序号。
ack=u+1表示希望收到从第u+1个字节开始的报文段,并且已经成功接收了前u个字节。
第三次挥手: B发送一个FIN(连接释放请求),用来关闭B到A的数据传送, B便进入LAST-ACK状态。
第四次挥手: A收到FIN(连接释放请求)后,向B发送ACK确认应答,此时A进入TIME-WAIT状态。完成第四次挥手。