您的位置:首页 > 理论基础 > 计算机网络

TCP三次握手四次挥手理论加实例详解

2011-09-15 15:38 330 查看
 

TCP(Transmission Control Protocol) 传输控制协议

TCP 是主机对主机层的传输控制协议, 提供可靠的连接服务, 采用三次握手确认建立一个连接:

在socket编程中,客户端执行connect()时。将触发三次握手。

位码即 tcp 标志位, 有 6 种标示:SYN(synchronous 建立联机) ACK(acknowledgement 确认)

PSH(push 传送) FIN(finish 结束) RST(reset 重置) URG(urgent 紧急)

Sequence number(顺序号码) Acknowledge number(确认号码)

第一次握手:主机 A 发送位码为 syn=1, 随机产生 seq number=1234567 的数据包到服务器, 主

机 B 由 SYN=1 知道, A 要求建立联机;

第二次握手:主机 B 收到请求后要确认联机信息,向 A 发送 ack number=(主机 A 的

seq+1),syn=1,ack=1, 随机产生 seq=7654321 的包

第三次握手:主机 A 收到后检查 ack number 是否正确,即第一次发送的 seq number+1, 以及位

码 ack 是否为 1,若正确,主机 A 会再发送 ack number=(主机 B 的 seq+1),ack=1,主机 B 收到

后确认 seq 值与 ack=1 则连接建立成功。

完成三次握手,主机 A 与主机 B 开始传送数据。

在 TCP/IP 协议中, TCP 协议提供可靠的连接服务,采用三次握手建立一个连接。

第一次握手:建立连接时,客户端发送 syn 包(syn=j) 到服务器,并进入 SYN_SEND 状态,等待

服务器确认;

第二次握手:服务器收到 syn 包,必须确认客户的 SYN(ack=j+1),同时自己也发送一个 SYN

包(syn=k),即 SYN+ACK 包,此时服务器 进入 SYN_RECV 状态; 第三次握手:客户端收到服

务器的 SYN+ACK 包,向服务器发送确认包 ACK(ack=k+1),此包发送完毕,客户端和服务器进

入 ESTABLISHED 状态,完成三次握手。 完成三次握手,客户端与服务器开始传送数据.

实例:

IP 192.168.1.116.3337 > 192.168.1.123.7788: S 3626544836:3626544836

IP 192.168.1.123.7788 > 192.168.1.116.3337: S 1739326486:1739326486 ack 3626544837

IP 192.168.1.116.3337 > 192.168.1.123.7788: ack 1739326487,ack 1

第一次握手:192.168.1.116 发送位码 syn=1, 随机产生 seq number=3626544836 的数据包到

192.168.1.123,192.168.1.123 由 SYN=1 知道 192.168.1.116 要求建立联机;

第二次握手:192.168.1.123 收到请求后要确认联机信息,向 192.168.1.116 发送 ack

number=3626544837,syn=1,ack=1, 随机产生 seq=1739326486 的包;

第 三次握手:192.168.1.116 收到后检查 acknumber 是否正确, 即第一次发送的 seqnumber+1,

以及位码 ack 是否为 1,若正确,192.168.1.116 会再发送 ack number=1739326487,ack=1,

192.168.1.123 收到后确认 seq=seq+1,ack=1 则连接建立成功。

图解:

一个三次握手的过程(图 1,图 2)



(图 1)



(图 2)

第一次握手的标志位(图 3)

我们可以看到标志位里面只有个同步位,也就是在做请求(SYN)



(图 3)

第二次握手的标志位(图 4)

我们可以看到标志位里面有个确认位和同步位,也就是在做应答(SYN + ACK)



(图 4)

第三次握手的标志位(图 5)

我们可以看到标志位里面只有个确认位,也就是再做再次确认(ACK)



(图 5)

一个完整的三次握手也就是 请求---应答---再次确认

四次分手:

在socket编程中,任何一方执行close()操作即可产生挥手操作。

由于 TCP 连接是全双工的, 因此每个方向都必须单独进行关闭。 这个原则是当一方完成它的

数据发送任务后就能发送一个 FIN 来终止这个方向的连接。 收到一个 FIN 只意味着这一方向上

没有数据流动,一个 TCP 连接在收到一个 FIN 后仍能发送数据。首先进行关闭的一方将执行主

动关闭,而另一方执行被动关闭。

(1)客户端 A 发送一个 FIN,用来关闭客户 A 到服务器 B 的数据传送(报文段 4)。

(2)服务器 B 收到这个 FIN,它发回一个 ACK,确认序号为收到的序号加 1(报文段 5)。

和 SYN 一样,一个 FIN 将占用一个序号。

(3)服务器 B 关闭与客户端 A 的连接,发送一个 FIN 给客户端 A(报文段 6)。

(4)客户端 A 发回 ACK 报文确认,并将确认序号设置为收到序号加 1(报文段 7)。

1.为什么建立连接协议是三次握手,而关闭连接却是四次握手呢?

这是因为服务端的 LISTEN 状态下的 SOCKET 当收到 SYN 报文的建连请求后,它可以把 ACK

和 SYN(ACK 起应答作用, 而 SYN 起同步作用) 放在一个报文里来发送。 但关闭连接时, 当收到

对方的 FIN 报文通知时,它仅仅表示对方没有数据发送给你了;但未必你所有的数据都全部发

送给对方了,所以你可以未必会马上会关闭 SOCKET, 也即你可能还需要发送一些数据给对方之

后,再发送 FIN 报文给对方来表示你同意现在可以关闭连接了,所以它这里的 ACK 报文和 FIN

报文多数情况下都是分开发送的。

2.为什么 TIME_WAIT 状态还需要等 2MSL 后才能返回到 CLOSED 状态?

这是因为虽然双方都同意关闭连接了, 而且握手的 4 个报文也都协调和发送完毕, 按理可以

直接回到 CLOSED 状态(就好比从 SYN_SEND 状态到 ESTABLISH 状态那样);但是因为我们必须

要假想网络是不可靠的,你无法保证你最后发送的 ACK 报文会一定被对方收到,因此对方处于

LAST_ACK 状态下的 SOCKET 可能会因为超时未收到 ACK 报文,而重发 FIN 报文,所以这个

TIME_WAIT 状态的作用就是用来重发可能丢失的 ACK 报文。

【转自】http://hi.baidu.com/jiang_yy_jiang/blog/item/4045af380c808e3596ddd857.html

http://blog.csdn.net/huichengongzi/article/details/6298939(图形化解释更好一点)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息