TCP是面向链接的传输层协议,它提供可靠交付的、全双工的、面向字节流的点对点服务。HTTP协议即是基于TCP协议实现的。(虽然做为应用层协议,HTTP协议并无明确要求必须使用TCP协议做为运输层协议,可是由于HTTP协议对可靠性的的要求,默认HTTP是基于TCP协议的。如果使用UDP这种不可靠的、尽最大努力交付的运传输层协议来实现HTTP的话,那么TCP协议的流量控制、可靠性保障机制等等功能就必须所有放到应用层来实现)而相比网络层更进一步,传输层着眼于应用进程间的通讯,而不是网络层的主机间的通信。咱们常见的端口、套接字等概念就是由此而生。(端口表明主机上的一个应用进程、而套接字则是ip地址与端口号的合体,能够在网络范围内惟一肯定一个应用进程)TCP协议的可靠传输是经过滑动窗口的方法实现的;拥塞控制则有着慢开始和拥塞避免、快重传和快恢复、RED随机早期检测几种办法。缓存
TCP协议的报文服务器
TCP报文段的首部分为固定部分和选项部分,固定部分长20byte,而选项部分长度可变。(若整个首部长度不是4byte的整数倍的话,则须要用填充位来填充)在固定首部中,与本文密切相关的是如下几项:网络
seq(序号):TCP链接字节流中每个字节都会有一个编号,而本字段的值指的是本报文段所发送数据部分第一个字节的序号。spa
ack(确认号):表示指望收到的下一个报文段数据部分的第一个字节的编号,编号为ack-1及之前的字节已经收到。blog
SYN:当本字段为1时,表示这是一个链接请求或者链接接受报文。进程
ACK:仅当本字段为1时,确认号才有效。ip
FIN:用来释放一个链接。当本字段为1时,表示此报文段的发送端数据已发送完毕,要求释放运输链接。资源
TCP三次握手过程同步
传输链接具备三个阶段:链接创建、数据传送以及链接释放。传输链接管理就是对链接创建以及链接释放过程的管控,使得其能正常运行,达到这些目的:使通讯双方可以确知对方的存在、能够容许通讯双方协商一些参数(最大报文段长度、最大窗口大小等等)、可以对运输实体资源进行分配(缓存大小等)。TCP链接的创建采用客户-服务器模式:主动发起链接创建的应用进程叫作客户,被动等待链接创建的应用进程叫作服务器。服务器端
链接创建阶段:
第一次握手:客户端的应用进程主动打开,并向客户端发出请求报文段。其首部中:SYN=1,seq=x。
第二次握手:服务器应用进程被动打开。若赞成客户端的请求,则发回确认报文,其首部中:SYN=1,ACK=1,ack=x+1,seq=y。
第三次握手:客户端收到确认报文以后,通知上层应用进程链接已创建,并向服务器发出确认报文,其首部:ACK=1,ack=y+1。当服务器收到客户端的确认报文以后,也通知其上层应用进程链接已创建。
在这个过程当中,通讯双方的状态以下图,其中CLOSED:关闭状态、LISTEN:收听状态、SYN-SENT:同步已发送、SYN-RCVD:同步收到、ESTAB-LISHED:链接已创建
至此,TCP链接就创建了,客户端和服务器能够愉快地玩耍了。只要通讯双方没有一方发出链接释放的请求,链接就将一直保持。
链接释放过程
第一次挥手:数据传输结束之后,客户端的应用进程发出链接释放报文段,并中止发送数据,其首部:FIN=1,seq=u。
第二次挥手:服务器端收到链接释放报文段以后,发出确认报文,其首部:ack=u+1,seq=v。此时本次链接就进入了半关闭状态,客户端再也不向服务器发送数据。而服务器端仍会继续发送。
第三次挥手:若服务器已经没有要向客户端发送的数据,其应用进程就通知服务器释放TCP链接。这个阶段服务器所发出的最后一个报文的首部应为:FIN=1,ACK=1,seq=w,ack=u+1。
第四次挥手:客户端收到链接释放报文段以后,必须发出确认:ACK=1,seq=u+1,ack=w+1。 再通过2MSL(最长报文端寿命)后,本次TCP链接真正结束,通讯双方完成了他们的告别。
在这个过程当中,通讯双方的状态以下图,其中:ESTAB-LISHED:链接创建状态、FIN-WAIT-1:终止等待1状态、FIN-WAIT-2:终止等待2状态、CLOSE-WAIT:关闭等待状态、LAST-ACK:最后确认状态、TIME-WAIT:时间等待状态、CLOSED:关闭状态