天天看点

TCP原理

TCP是面向连接的通信协议,通过三次握手建立连接,通讯完成时通过四次挥手拆除连接。 TCP提供的是一种可靠的数据流服务,采用“带重传的肯定确认”技术来实现传输的可靠性。TCP还采用一种称为“滑动窗口”的方式进行流量控制,所谓窗口实际表示接收能力,用以限制发送方的发送速度。 TCP数据包中包括序号和确认,所以未按照顺序收到的包可以被排序,而损坏的包可以被重传。 一、三次握手建立连接:

            过程入下图:

TCP原理

        假设A运行的是TCP客户端进程,而B运行的是TCP服务端进程。最开始的时候两端的TCP进程都处于ClOSED(关闭)状态。

这时候,A主动打开连接,而B被动打开连接,B在打开连接之后进入LISTEN(收听)状态。

(1)第一次握手

A的TCP客户进程向B发出建立连接请求报文段,其中SYN(同步位)=1,ACK(确认位)=0,seq(序号)=x。
TCP规定,当报文段的SYN=1且ACK=0时,表明这是一个请求建立连接的;SYN报文段(SYN=1的报文段)不能携带数据,但是要消耗掉一个序号。
在A发送完毕之后,A的TCP客户端进程进入SYN-SENT(同步已发送)状态。

(2)第二次握手

B在收到连接请求报文段之后,如果同意建立连接,则向A发送确认报文段。其中SYN=1,ACK=1,ack(确认号)=x+1,同时设置自己的初始序号seq=y。

TCP规定,当报文段的SYN=1且ACK=1时,表明这是一个同一建立连接响应报文段;这个报文段也不能携带数据,同样需要消耗掉一个序号。

在B发送完毕之后,B的TCP服务端进程进入SYN-RCVD(同步收到)状态。

(3)第三次握手

A在收到B的确认报文段之后,还需要向B给出确认报文段。其中ACK=1,seq=x+1,ack=y+1。

TCP规定,这个ACK报文段可以携带数据;如果不携带数据则不消耗序号,即A下一个数据报文段的序号仍然是seq=x+1。

在A发送完毕之后,A的TCP客户端进程进入ESTABLISHED(已建立连接)状态;B在接收到A的确认报文段之后,B的服务端进程也进入ESTABLISHED(已建立连接)状态。

         为什么要有三次握手:

         1、如果只一次握手就建立连接,A发送连接请求报文到B,此时A无法知道是否有成功发送建立连接。

         2、如果经过两次握手就建立连接,A发送连接请求报文到B,发送SYN。然后等待B发送同意建立连接ACK,此时由于网络问题A没有及时接收到B的同意建立连接ACK,A会重新发送连接请求报文到B,B接收到A重新发送的请求后,会认为这是一次新的连接,B会占用新的连接资源,然后返回ACK,A收到两次ACK,后面接收到SYN的ACK是无效的,A会抛弃这个SYN的ACK,但是B并不知道,要一直占用连接资源。

         3、三次握手:两次握手的问题在于B不知道一个SYN是否是无效的,而三次握手机制因为A会给B回复第二次握手,也意味着B会等待A的第三次握手,如果第三次握手迟迟不来,B便会认为这个SYN是无效的,释放相关资源。但如果在第三次握手传输中丢失,B会认为连接是无效的,释放所有连接资源,但A已经建立了连接,这时如果A向B写数据,B端将以RST包响应,这时便感知到B的错误。

         所以,采用三次握手可以保证任何一次握手的失败都是可感知的,不会浪费资源。

         二、滑动窗口协议: