TCP发送的报文段是交给IP层传送的,但IP层只能提供尽最大努力交付的服务,也就是说TCP下面的网络所提供的是不可靠的传输。因此TCP采用了一些适当的措施来提供可靠的传输,使得两个传输层直接的通信变得可靠。
所谓可靠传输,就是要满足一下两个要求:
1.传输的信道不产生差错(MAC+IP定位唯一地址)
2.保证传输数据的正确性,即:无差错,不丢包,不重复,且按次序到达。
为了满足上述需求,解决实际使用中出现的问题,TCP采取了以下三种措施:
1.首先,采用 三次握手 来建立TCP链接, 四次握手 来释放TCP链接,从而保证建立的传输信道是可靠的。
2.其次,tcp采用了连续ARQ协议(回退N,Go-Back-N;超时自动重传)来保证数据传输的正确性,使用滑动窗口协议(window)来保证接收方能够及时处理所接收到的数据,进行 流量控制 。
3.最后,TPC使用 慢开始、拥塞避免、快重传和快恢复来进行 拥塞控制,从而避免网络拥塞。
上图画出了TCP建立连接的过程。假定主机A运行的是TCP客户程序,B运行的是TCP服务器程序。最初两端的TCP进程都处于CLOSED状态。图中在主机下面的是TCP进程所处的状态。A是主动打开连接,B是被动打开连接。
B的TCP服务器进程先创建传输控制模块TCB,准备接受客户进程的连接请求,然后服务器进程就处于LISTEN(监听)状态,等待客户的连接请求
1.首先A的TCP客户进程向B发出连接请求报文段,这时首部中的同步位SYN=1,同时选择一个初始序号seq=x。TCP规定,SYN报文段(即SYN=1的报文段)不能携带数据,但要消耗掉一个序号。这时,A的客户进程就进入SYN-SENT(同步已发送)状态。
2.B收到连接请求报文段后,向A发送确认。在确认报文段中把SYN和ACK位都置为1,确认号是ack=x+1,同时也为自己选择一个初始序号seq=y。请注意,这个报文段也不能携带数据,但同样要消耗掉一个序号。这时B的TCP服务器进程就进入SYN-RCVD(同步已收到)状态。
3.A的TCP客户进程收到B的确认后,还要向B给出确认。确认报文段的ACK置为1,确认号ack=y+1,而自己的序号seq=x+1。这时,TCP连接已经建立,A进入ESTABLISHED(已建立连接)状态,
当B收到A的确认后,也会进入ESTABLISHED状态。以上给出的连接建立过程就是常说的TCP三次握手。
接下来通过 wireshark 的实际监测图来印证上述结论。
1.客户端发出第一次握手
SYN=1,seq=0
2.服务端接收到请求,向客户端发送第二次握手
SYN=1,ACK=1 seq=0,ack=1
3.客户端接收到信息后,向服务器端发送第三次握手
ACK=1 seq=1,ack=1
1.客户端发出链接释放报文,并且停止发送数据。释放数据报首部 FIN=1,序列号 seq=u
2.服务器收到链接释放报文,发出确认报文,ACK=1 , ack=u+1,并带上自己的序列号 seq = v
3.客户端收到服务器的确认请求后,等待服务器发送链接释放报文。
4.服务器向客户端发送链接释放报文,FIN=1,ACK=U+1
5.客户端收到服务器的链接释放报文后,发出确认,ACK=1,ack=w+1,seq=u+1
接下来通过 wireshark 的实际监测图来印证上述结论。
1.FIN=1 seq=12
2.FIN=1 ACK=1 ack=13 seq=14
3.ACK=1 ack=15 seq=13