TCP协议
TCP协议是建立在不可靠的ip层之上实现的可靠的数据传输协议,它主要解决传输的可靠、有序、无丢失和不重复的问题。TCP是TCP/ip体系中非常复杂的一个协议,主要特点是:
1、TCP是面向连接的传输层协议。
2、每一条TCP连接只能有两个端口,每一个TCP连接只能是点对点的。
3、TCP提供可靠的交付服务,保证传输的数据无差错,不丢失不重复且有序。
4、TCP提供全双工通信。
5、TCP是面向字节流的,虽然应用程序和TCP的交互是一次一个数据块,但TCP把应用程序交下来的数据看成是一连串的物结构的字节流。
TCP报文段
TCP传送的数据单元称为报文段。一个TCP报文段分为TCP受不和TCp数据两部分,整个TCP段作为IP数据报的数据部分封装在IP数据报中,其首部的前20个字节是固定的。TCP报文段的首段最短为20字节,后面有4N字节是根据而增加的选项,通常长度为4字节的整数倍。
TCP报文段既可以用来运载数据,也可以用来建立连接、释放连接和应答。
TCP首部各字段主要意义如下:
源端口和目的端口字段,各占两个字节。
序号字段(seq):4字节,指的是本TCP字段所发送的数据的第一个字节的序号。
确认号字段(ack):4字节,期望收到对方的下一个报文段的数据的第一个字节的序号。若确认为N,则表明序号N-1位置的所有数据均以正确收到。
数据偏移:4位,首部长度。
保留字段:6位,保留为今后使用。
紧急位URG:当URG=1时,表示紧急指针字段有效。它告诉系统此报文段中有紧急数据,应尽快传送。
确认位ACK:只有当ACK=1时,确认号字段才有效。当ACK=0时,确认号无效。TCP规定,在连接建立后的所有传输的报文段都必须把ACK置1,。
推送位PSH:接收TCP收到PSH=1的报文段,就尽快交付接受应用进程,而不用再等到整个缓存都填满了后再向上交付。
复位位RST:当RST=1表示TCP连接中出现严重差错,必须释放连接,然后再重新建立运输连接。
同步位SYN:SYN=1表示这是一个连接请求或连接接受报文。
当SYN=1,ACK=0,表明这是一个连接请求报文,对方若同意建立连接,则在响应报文中使用SYN=1,ACK=1.
终止位FIN:释放一个连接,FIN=1表示报文段的发送方的数据已发送完毕,并要求释放传输连接。
窗口字段:2字节。指出了现在允许对方发送的数据量。
校验和:2字节。
紧急指针字段:16位指出紧急数据共多少字节。
选项字段:长度可变。
填充字段:为了使整个首部长度是4个字节的整数倍。
“三次握手”
TCP是面向连接的协议。因此每一个TCP连接都有三个阶段:连接建立、数据传输和连接释放。TCP连接的管理就是是的运输连接的建立与释放都可以正常进行。
在建立连接的过程中有三个要解决的问题:
1、要使每一方都能确知对方的存在。
2、要允许双方协商一些参数。
3、能够对运输实体资源进行分配。
TCP连接的端点不是主机不是ip地址也不是进程,而是套接字;
每一个TCP连接唯一地被通信两段的两个端点(即两个套接字)所确定。TCP连接采取的方式是客户/服务器方式。
“三次握手”即发生在TCP连接建立的过程。
第一步:客户机TCP首先向服务器的TCP发送一个连接请求报文段,这个特殊的报文段不包含应用层数据,其首部的SYN字段被置为1,表示这是一个请求连接的报文,另外客户机会随机选择一个起始序号seq = x;
第二步:服务器的TCP接收到连接请求报文段后,如同意建立连接,就像客户机发回确认,并为该TCP连接分配TCP缓存和变量。在确认报文段中,SYN、ACK被置为1表示同意建立连接。并且确认号字段的值为x+1,并且服务器随机产生起始序号seq=y,确认报文段同样不包含应用层数据。
第三部:当客户机收到确认报文段后,还要想服务器给出确认,并且也要给该连接分配缓存和变量。这个报文段的ACK置为1,序号字段为x+1,确认号字段ack = y+1,该报文段可以携带数据,如果不携带数据则不消耗序号。
值得注意的是服务器端的资源是在完成第二次握手时分配的,而客户端的资源是在完成第三次握手时分配的。这就使得服务器容易受到SYN洪泛攻击。
“四次挥手”
参与TCP连接的两个进程中的任意一个都能终结该连接。
第一步:客户机打算关闭连接,就向其TCP发送一个连接释放报文段,并停止再发送数据,主动关闭TCP连接,该报文段的FIN标志位被置为1,seq=u,它等于前面已传送过的数据的最后一个字节的序号加1(FIN报文段即便不携带数据,也要消耗一个序号)。TCP是全双工的,即可以想象成一条TCp连接上有两条数据通路。
步骤一执行后,服务器还可以向客户机传输数据,但客户机不可。
第二步:服务器接收到连接释放报文段后即发出确认,确认号是ack = u+1,而这个报文段自己的序号是v,等于它前面已传送过的数据的最后一个字节的序号+1。此时,从客户机到服务器这个方向的连接就I释放了,TCp处于半关闭状态。但服务器若发送数据,客户机要接收,即从服务器到客户机这个方向的连接并未关闭。
第三步:若服务器已经没有要向客户机发送的数据,就通知TCP释放连接,此时其发出FIN=1的连接释放报文段。
第四步:客户机收到连接释放报文段后,必须发出确认。在确认报文段中,ACK字段被置为1,确认号ack=w+1,seq=u+1.此时TCP连接还没有释放掉,必须经过时间等待计时器设置的时间2MSL后,A才进入到连接关闭状态。
上述挥手握手过程可简化如下:
握手:
1、SYN=1,seq = x;
2、SYN=1,ACK=1,seq=y,ack=x+1;
3、ACK=1,seq = x+1,ack = y+1;
挥手:
1、FIN = 1,seq = u;
2、ACK=1,seq = v,ack=u+1;
3、FIN=1,ACK =1,seq=w,ack = u+1;
4、ACK = 1,seq = u+1,ack=w+1;