20170330_请说出TCP连接的三次握手和TCP关闭的四次握手
SYN 包:建立连接请求的包
FIN 包:切断TCP 连接的包
ACK 包:针对SYN 包和FIN 包的确认应答包
1、TCP 的特点及其目的:
(1)TCP 通过校验和、序列号、确认应答信号、重发机制、连接管理以及窗口管理等许多机制来实现数据的可靠性传输。
(2)在TCP 中,当发送端的数据达到接收端主机的时候,接收端主机会返回一个已收到消息的通知,这个通知被称之为
“确认应答信号”ACK 。
(3)TCP 通过肯定的确认应答信号ACK 实现可靠的数据传输。当发送端将数据发出之后便会等待接收端主机的确认应答信号。如果有确认应答,这说明数据已经成功到达了接收端,否则的话,数据包丢失的可能性很大。
2、TCP 连接的三次握手:
(1)第一次握手:建立连接时,客户端会发送一个SYN 包(SYN = j )作为建立连接的请求到服务器,并等待服务器的确认应答,此时,客户端进入SYN_SENT 状态。
(2)第二次握手:服务器接收到这个SYN 包之后,必须确认客户端的SYN 包,发送一个ACK 包(ACK = j + 1),与此同时,自己也发送一个SYN 包(SYN = k)也作为建立连接的请求给客户端。
因此,这个阶段,服务器给客户端发送到消息是“ACK 包 + SYN 包”。此时,服务器进入SYN_RECV 状态。
(3)第三次握手:客户端收到服务器的“ACK 包 + SYN 包”,向服务器发送确认应答信号ACK 包(ACK = k + 1)。当这个包发送完毕后,客户端和服务器就连接成功了,共同进入ESTABLELISHED 状态(TCP了 连接成功),完成三次握手。
3、TCP 断开连接的四次握手:
对于一个已经建立好的TCP 连接,TCP 需要使用改进的三次握手来释放这个连接,也即增加了一个带有FIN 包的报文段。
(1)第一次握手:当主机A 的应用程序通知TCP 数据已经发送完毕时,TCP 向主机B 发送一个FIN 包主动请求断开连接。
(2)第二次握手:当主机B 收到这个FIN 包之后,并不会立即用FIN 包回复主机A,而是先向主机A 发送一个确认的 ACK 包,同时通知自己端相应的应用程序:对方要求关闭TCP 连接。(先发送ACK 的目的 是为了防止在这段时间内,对方重传FIN 包)。
(3)第三次握手:与第二步同时进行的是,主机B 的应用程序告诉TCP:我要彻底的关闭连接,于是TCP 再向主机A 发送一个关闭连接请求的FIN 包。
(4)第四次握手:当主机A 收到这个FIN 包之后,向主机B 发送一个确认的ACK 包表示连接被彻底释放。完成了四次握手。PS:
FIN 包:
当收到对方发送给自己的FIN 包时,仅仅表示对方不再发送数据了,但是对方还能接收数据,自己也未必把全部数据都发送完了,所以自己视情况而定,既可以立即close 这个TCP 连接、也可以在发送一些数据给对方后再发送FIN 包给对方表示自己现在同意close 这个连接了。因此,TCP 断开连接时,服务器端的ACK 包和FIN 包一般都会分开发送!