TCP连接的建立和终止协议

来源:互联网 发布:短域名算法 编辑:程序博客网 时间:2024/05/29 19:50

建立连接——三次握手过程

在James F.Kurose和Keith W.Ross写的《计算机网络 自顶向下方法》中:
TCP
TCP/IP协议是一个协议簇。里面包括很多协议的。UDP只是其中的一个。之所以命名为TCP/IP协议,因为TCP,IP协议是两个很重要的协议,就用他两命名了。TCP和UDP协议属于传输层协议,而IP协议属于网络层协议。
TCP(Transmission Control Protocol,传输控制协议)是面向连接的协议,也就是说,在收发数据前,必须和对方建立可靠的连接。一个TCP连接必须要经过三次“对话”才能建立起来,其中的过程非常复杂,只简单的描述下这三次对话的简单过程:
(1)第一次握手:建立连接时,客户端发送syn包(syn=j)到服务器,并进入SYN_SENT状态,等待服务器确认;SYN:同步序列编号(Synchronize Sequence Numbers)。
(2)第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态;
(3)第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。

关于需要握手三次的理解:TCP是一种可靠的传输,所以建立连接的时候也是需要保证可靠的,应答机制是必不可少的。
下面是详细说明:
1 客户端应用进程发起TCP连接(调用TCP相关的API)(应用层),客户端的TCP向服务器端的TCP发送一个特殊的不包含应用层数据的TCP报文段(SYN报文段),该报文段的SYN标志位被置为1,并为序号字段设置一个随机的初始序号传输层),然后该报文段被封装在一个IP数据报中(添加源和目的IP地址)(网际层),并发给服务器。

2 服务器主机收到该TCP报文段,从数据报中提取TCP SYN数据(相反,从网际接口层到传输层一层层提取),用一个带有确认应答(ACK)同步序列号(SYN)标志位的报文段响应客户端(序号字段被设置为一个随机的初始序号,确认序号字段被设置为提取出来的SYN+1)。

3 客户端TCP受到SYNACK报文段后,再向服务器发送一个带有ACK标志位的报文段,对服务器允许连接的报文段进行确认。(同时确认序号字段被为提取出来的SYN+1,SYN标志位被置为0,因为连接已经建立)

断开连接——四次挥手过程

1 客户端应用进程发出关闭连接命令(调用TCP相关的API),引起客户端TCP向服务器发送一个TCP FIN报文段(FIN标志位被置为1)
2 服务器收到该报文段,向客户端发送一个确认报文段。
3 服务器发送它自己的终止报文段(FIN标志位被置为1)
4 客户端TCP对服务器的终止报文段进行确认,至此,双方向的连接才关闭。

为什么TCP建立连接要进行3次握手,而断开连接要进行4次

简单来说:
这是由于TCP的半关闭造成的,因为TCP连接是全双工的(即数据可在两个方向上同时传递)
所以进行关闭时每个方向上都要单独进行关闭,这个单方向的关闭就叫半关闭。

详细来说:
1. 建立连接时:当服务端收到SYN报文的连接请求后,它可以把ACK和SYN(ACK起应答作用,而SYN起同步作用)放在一个报文里来发送。
2. 但关闭连接时:当收到对方的FIN报文通知时,它仅仅表示对方没有数据发送给你了;但未必你所有的数据都全部发送给对方了,所以你未必会马上会关闭SOCKET,也即你可能还需要发送一些数据给对方之后,再发送FIN报文给对方来表示你同意现在可以关闭连接了,所以它这里的ACK报文和FIN报文多数情况下都是分开发送的。这就是TCP的半关闭。

TCP 建立连接为什么是三次握手,可以采用两次吗

这是因为防止失效的连接请求报文段突然又传送到目的主机,而造成错误

谢希仁版《计算机网络》中的例子是这样的,已失效的连接请求报文段的产生在这样一种情况下:client发出的第一个连接请求报文段并没有丢失,而是在某个网络结点长时间的滞留了,以致延误到连接释放以后的某个时间才到达server。本来这是一个早已失效的报文段。但server收到此失效的连接请求报文段后,就误认为是client再次发出的一个新的连接请求。于是就向client发出确认报文段,同意建立连接。假设不采用三次握手,那么只要server发出确认,新的连接就建立了。由于现在client并没有发出建立连接的请求,因此不会理睬server的确认,也不会向server发送数据。但server却以为新的运输连接已经建立,并一直等待client发来数据。这样,server的很多资源就白白浪费掉了。采用三次握手的办法可以防止上述现象发生。例如刚才那种情况,client不会向server的确认发出确认。server由于收不到确认,就知道client并没有要求建立连接。

0 0