TCP(传输控制协议)
传输控制协议[TCP,Transmission Control Protocol]
是一种面向连接的、可靠的、基于字节流的传输层通信协议。
三次握手
“三次握手” 的目的是 “为了防止已失效的连接请求报文段突然又传送到了服务端,因而产生错误。
三次握手的目的
“已失效的连接请求报文段” 的产生在这样一种情况下:client 发出的第一个连接请求报文段并没有丢失,而是在某个网络结点长时间的滞留了,以致延误到连接释放以后的某个时间才到达 server。本来这是一个早已失效的报文段。但 server 收到此失效的连接请求报文段后,就误认为是 client 再次发出的一个新的连接请求。于是就向 client 发出确认报文段,同意建立连接。假设不采用 “三次握手”,那么只要 server 发出确认,新的连接就建立了。由于现在 client 并没有发出建立连接的请求,因此不会理睬 server 的确认,也不会向 server 发送数据。但 server 却以为新的运输连接已经建立,并一直等待 client 发来数据。这样,server 的很多资源就白白浪费掉了。采用 “三次握手” 的办法可以防止上述现象发生。例如刚才那种情况,client 不会向 server 的确认发出确认。server 由于收不到确认,就知道 client 并没有要求建立连接。”
- 客户端发送一包连接请求数据(SYN包),能否与你建立连接
- 如果对端同意建立连接,回复一包(SYN+ACK包)
- 客户端收到之后,回复一包ACK包,连接建立
为什么不是两次握手(如果客户端收到 SYN+ACK包就建立连接)?
为了防止因为已失效的请求报文,突然又传到服务器引起错误。
三次握手,如果服务端收不到最后的ACK包,就不会建立连接。
三次握手本质就是把为例解决网络信道不可靠的问题。
四次挥手
- 客户端主动发起连接关闭请求,它向服务器发送一包FIN包,表示要关闭连接,自己进入终止等待1状态。
- 服务端收到FIN包,发送一包ACK包,表示自己进入了关闭等待状态,客户端进入终止等待2状态。(服务端此时还可以发送未发送的数据,客户端还可以接收数据)
- 待服务端发送数据之后,发送一包FIN包,进入最后确认状态。
- 客户端收到之后回复 ACK 包,进入超时等待状态,经过超时时间后关闭连接。而服务端收到ACK包之后,立即关闭连接。
为什么客户端需要等待超时时间?
这是为了保证对方已收到ACK包,因为假设客户端发送完最后一包ACK包后就释放了连接,一旦ACK包在网络中丢失,服务端将一直停留在最后确认状态。
如果客户端发送最后一包ACK包之后,等待一段时间,这时服务端因为没有收到ACK包,会重发FIN包,客户端会响应这个FIN包,重发ACK包并刷新超时时间。
这个机制跟三次握手一样,也是为了保证在不可靠的网络链路中进行可靠的连接断开。
网友评论