TCP的三次握手和四次挥手

2019-12-06  本文已影响0人  Cubery

为什么需要建立TCP连接

  1. IP协议是无连接的:IP并不维护任何关于后续数据报的状态信息,每个数据报的处理是相互独立的。这种无连接的优点是不占用线路,降低了对网络线路的要求;
  2. IP协议是不可靠的:不能保证IP数据报能成功到达目的地,是一种尽力而为的传输服务,路由器对IP报错误处理方式是丢包,并发送ICMP给源地址。
     正是因为IP协议是无连接、不可靠的,所有需要上层的TCP来建立连接和差错重传。

TCP的特点

  1. TCP是面向连接的、可靠的、基于字节流的传输层通信协议;
  2. 经应用层的数据流分割成报文段(MTU)并发送给目标节点的TCP层;
  3. 数据包都有序号,对方收到则发送ACK确认,未收到则重传;
  4. 使用校验和来检验数据在传输过程中是否有误。

TCP的三次握手

 三次握手是TCP建立连接的过程,一旦建立连接,两台主机就可以进行全双工的通信。


TCP三次握手.jpeg

 SYN报文和SYN+ACK报文都会消耗1个序号,但不能携带数据,ACK报文可以携带数据,不携带数据则不消耗序号。
 为什么TCP建立连接需要三次握手而不是两次:因为需要接收并确认对方的序号。
 利用TCP的三次握手机制(SYN超时),可以进行泛洪(SYN Flood)攻击。
 Linux针对SYN Flood的防护措施:特别的序号tcp_syscookies
 TCP的保活机制(心跳)

TCP的四次挥手

 四次挥手是TCP断开连接的过程。


TCP四次挥手.png

 FIN报文可以携带数据,但是即使不携带数据,也必须消耗1个序号,ACK报文不消耗序号。
 MSL是最大报文生存期,设置TIME_WAIT的原因为:
 1. 为了保证客户端发送的最后一个ACK报文段能够到达服务器端,确保服务端能正常进入CLOSED状态;
 2. 避免新旧连接混淆。由于网络滞留,客户端可能发送了多次请求建立连接的请求,经过时间2MSL,就可以使本链接持续时间内所产生的所有报文段都从网络中消失,这样就可以使下一个新的连接中不会出现这种旧的连接请求报文段。
 在2MSL时间内,该地址上的连接(客户端地址,端口和服务器的端口地址)不能被使用,比如我们在建立一个连接后关闭连接然后迅速重启连接,那么就会出现端口不可用的情况。
 为什么TCP断开连接需要四次握手:全双工。
 某段时间内,服务器出现大量CLOSE_WAIT状态的原因:客户端发送了FIN,服务器忙于读写,没有及时关闭连接,考虑检查释放资源的代码或线程配置等。

上一篇下一篇

猜你喜欢

热点阅读