TCP提供可靠传输,在建立连接时,使用三次握手建立可靠连接。
在socket编程中,客户端执行connect()时。将触发三次握手。
例:主机A运行客户程序,B运行服务器程序,最初两端的TCP进程都属于CLOSED(关闭)状态,A主动打开连接,B被动打开连接
如图:
第一次连接:客户端A向服务器端B发出连接请求报文段,此时同步位SYN设为1(不携带数据,只占一个序列号),同时设一个初始序列号,保存在包头的序列号字段中
第二次连接:服务器端接受到连接请求报文段后,若同意连接,则向客户端发送确认,在确认报文段中将SYN和ACK位都置为1,确认号为x+1,表示在它之前所有数据已经全部收到,同时设一个自己的初始序列号
第三次连接:客户端收到服务器端发来的确认后,再次向服务器端确认,确认报文段的ACK为1,A进入已连接状态,服务器收到客户端的确认后,也进入已建立连接状态
为什么要进行三次连接:防止已经失效的连接请求报文段突然又传到了服务器端
例:若A发出的第一个连接请求报文段在某些网络结点滞留时间较长,导致到连接释放后的某个时间才到达服务器端,此时这个报文段已经失效,但服务器端收到该失效的连接请求报文段后,误认为是客户端又发出一次新的连接请求。于是向客户端发送确认报文段,同意建立连接。但由于客户端并未发出连接请求,但是服务器端却认为新的连接已经建立好了并一直等待客户端发数据,致使服务器端的资源就浪费了
TCP的连接释放:四次挥手机制
第一次:客户向其TCP发出连接释放报文段,停止数据发送,主动关闭链接,客户端将连接释放报文段首部终止控制位FIN设1
第二次:服务器收到这个FIN,它发回一个ACK确认,确认序号为收到的序号加1,一个FIN占用一个序号,此时服务器端进入关闭等待状态,TCP服务器通知应用进程,此时从客户到服务器这个方向的连接就释放了,此时TCP处于半关闭状态(客户端此时已不发送数据,如果服务器要发数据,客户仍接收)
第三次:服务器无数据发送释放与客户端的连接,发送一个FIN给客户端。
第四次:客户端发送ACK报文确认,并将确认序号设置为收到序号加1。此时的TCP连接还未释放掉,必须经过时间等待计时器设定时间后,客户端才进入关闭状态
原文:http://10541559.blog.51cto.com/10531559/1774472