TCP是一个巨复杂的协议,在网络通信中他需要解决很多问题,所以这里是带着大家来了解TCP协议的魅力,关于协议的细节,推荐去看W.Richard Stevens的《TCP/IP 详解 卷1:协议》。
一. tcp概念
TCP四元组:[源ip,源端口号,目的ip,目的端口号]
TCP(Transmission Control Protocol 传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议。
三个概念:
面向连接:必须在建立连接前确认对方链路可达并准备好才开始通信,建立后对状态的保持。(udp直接通信,不会询问接收端是否可达并准备接收数据)
字节流:tcp传输的是byte类型数据。
可靠:保证数据报能够到达接收端(超时重传机制、丢包重传及数据顺序一致)(真的一定可靠吗?)
二. tcp如何建立连接
2.1 两军问题
本质:在不可靠的通信链路上试图通过通信达成一致。
问题描述:一支白军被围困在一个山谷中,山谷的两侧是蓝军。困在山谷中的白军人数多余山谷两侧的任意一支蓝军,而少于两支蓝军的中和。若一支蓝军对白军单独发起进攻,则必败无疑;但若两支蓝军同时发起进攻,则可取胜。两只蓝军希望同时发起进攻,这样他们就要传递消息,以便确定发起进攻的具体时间。假设他们只能派遣士兵穿越白军所在的山谷(唯一的通信信道)来传递消息,那么在穿越山谷是,士兵有可能被俘虏,从而造成消息的丢失。现在的问题是:如何通信,以便蓝军必胜。
通信策略:
最后发出消息的一方永远不知道对方是否收到这个消息,因此不存在使蓝队必胜的通信协议。
结论:在不可靠的通信中,不管几次握手都是有风险的。因为永远无法确定最后一次通信送达。通信次数大于3后并不能提升通信的可靠性。这是tcp采用三次握手的原因。
2.2 tcp的报文格式
tcp标志位
ACK:确认标志位,确认可以发送数据,建立连接后act为1。
SYN:建立连接标志位,在连接建立时用来同步序号,syn为1表示这是一个连接请求或连接接收报文。
FIN:结束一个连接的标志位,FIN=1表示释放连接。
URG:当URG=1时,表示报文段中有紧急数据,应尽快传送。
PSH:当发送端PSH=1时,接收端尽快的交付给应用进程。
RST:当RST=1时,表明TCP连接中出现严重差错,必须释放连接,再重新建立连接。
其他数据
序 号seq:tcp建立连接是会随机生成一个序号,建立连接后tcp进行通信全部是基于这个序号(也是tcp传输数据顺序一致的保证)。
确认号ack:接受端确认收到数据对seq加一。
窗口:用来控制对方发送的数据量,通知发放已确定的发送窗口上限。
2.3 tcp三次握手
三次握手的过程:
客户端主动打开连接,发送ACT=0,SYN=1表示请求建立连接,产生随机数x为序号seq,给服务器发起第一次握手;
服务器接收到客户端的请求后,发送SYN=1,ACK=1表示连接到接收报文,确认号act=x+1表示知道了客户端的seq,同时产生服务器的随机数y作为序号seq,发送给客户端,即为第二次握手;
最后客户端设置AC=1表示建立请求,设置act=y+1,seq=x+1表示发送的确认消息。即为第三次握手。