TCP协议及三次握手、四次挥手

史上最详细最容易理解的TCP和它家的三次握手、四次挥手

Posted by wang chong on March 17, 2019

网络协议模型

网络中的网络协议模型共有两种:一种是网络标准OSI/ISO七层协议模型,一种是使用广泛TCP/IP五层协议模型。上图就是OSI/IOS七层协议模型。其实这两种都差不多,TCP/IP五层协议模型是把OSI/IOS七层模型的上三层合并成为了应用层。

数据在网络上的传输过程

在网络传输上共有两个角色:客户端和服务端。客户端发送请求,服务端响应请求。网络请求在网络协议模型上是一个拆包和封包的过程。

过程如下

  1. 数据发送端每经过一层都会封装上这层协议的协议头部向下传输。例如:对于网络请求来说,在应用层封装上HTTP的头部转换成报文,在传输层封装上TCP头部转换成数据包,在网络层封装上IP的头部转化成IP数据报,在数据链路层加上MAC地址封装成帧,然后在物理层转换成比特流进行传输。
  2. 在物理层传输过程中如果遇到交换机和路由器。遇到交换机把比特流转换成帧,根据交换机所指MAC地址重新封装成帧再向下转换进行传输;遇到路由器拆包到网络层,根据路由策略决定向下传的IP地址再进行向下封装传输。
  3. 经过万里长征终于到达服务器,会在网络协议模型中把第一步骤一一拆解开,最终拿到数据。响应过程中还是这么一套过程。

数据通信的三种基本方式

写到这心里一凉,慌的拿起我的计算机网络书看了看….

单向通信

单向通信又称单工通信,即只能有一个方向的通信而没有反方向的交互。比如:无线电广播、电视广播这种。

双向交替通信

双向交替通信又称半双工通信,即通信的双方都可以发送信息,但不能同时发送(当然也不能同时接收)。这种通信方式是一方发送另一方只能接受,等发送的一方不发了,接收的一方才可以发送。比如:对讲机等。

双向同时通信

双向同时通信又称全双工通信,即通信的双方都可以同时发送和接受信息。显然,双向通信的传输效率最高。TCP就是全双工通信。

说了这么多(其实也不多),主要还是要聊聊传输层TCP协议。

TCP

TCP协议的特点

  1. TCP是面向连接的传输层协议
  2. 每一条TCP协议只能有两个端口
  3. TCP提供数据的可靠交付服务
  4. TCP是全双工通信
  5. 面向字节流

    TCP头部

    TCP头部共有20字节的数据,如下图:

  • 0-4:我们都知道TCP协议是保证端到端可靠传输,首先是4个字节的目的端口和源端口
  • 4-8:Sequence Number (发包的顺序号)
  • 8-12:Acknowledgment Number (应答号,不同的应答号代表者不同的指令,标记此次动作)
  • 12-16:标记位,偏移量,时间窗口等等
  • 16-20:Checksum(校验码)、Urgent Pointer(偏移指针)
  • TCP Options TCP内置的命令(FIN,SYN就在这里)。
  • 上层数据

socket套接字

上面说到TCP的特点的时候说道每一条TCP只能有两个端口,这端口不是别的,就是套接字端口。

套接字接口的格式:

socket = {IP地址 : 端口号}

三次握手、四次挥手

为什么三次握手、四次挥手?

TCP保证的是应用程序之间端到端的可靠传输。要想可靠就必须要有这个机制。

三次握手

先来张好玩的图 三次握手总结如下:

  1. 客户端对服务端说:Hi,你能收到我发的信息吗?
  2. 服务器对客户端说:我能收到,你能收到我发的吗?
  3. 客户端对服务器说:我也能收到。

是不是非常好理解,再来个详细。

  • 开始的时候客户端和服务器的TCP连接都处于CLOSE状态。当要连接的时候,客户端为主动打开,服务端为被动打开。
  • 一开始服务端服务器进程首先创建传输控制模块TCB(这其中保存了连接重要的信息),然后服务端就处于LISTEN状态。
  • 客户端向服务器发送一个SYN=1,seq=n(SYN=1,建立连接的标志,seq为头部的序号位)的数据包,此时客户端进入SYN_SENT状态(连接请求已发送)。
  • 服务端接收到客户端发来的请求时,会向客户端发送确认并且请求客户端建立连接(SYN=1、ACK=1、seq=k,ack=n+1),此时服务端进入SYN_RCVD状态(连接请求收到)
  • 客户端接收到服务器的确认后,并且还要向服务器发送确认,(ACK=1,seq=n+1,ack=k+1),此时TCP建立连接,客户端状态变为EXTABLISHED(已连接状态)
  • 服务端接受到客户端的确认之后,同样也进入EXTABLISHED(已连接状态)。三次握手完毕
四次挥手

在此次聊天过程中,突然双方起了争执。

四次挥手总结如下:

  1. 客户端对服务端说:我不想听你说话了,不和你聊了(此时客户端已经把手机扔一边了)。
  2. 服务端对客户端说:你不想听,我也要说(服务端直男癌犯了,服务端说啥客户端都看不到)。
  3. 服务端对客户端说:我也不想和你说话了,冷战吧。
  4. 客户端对服务端说:好,冷战就冷战,然后双方删了微信。

  • 开始处于数据传输过程中,双方状态为ESTABLISHED。
  • 首先客户端向服务端发送FIN=1,seq=x(FIN=1是断开连接的标志)的数据包,进入FIN_WAIT1状态(终止等待1)。
  • 服务端接受到客户端的请求,因为服务端这边还要收场,所以先应答客户端,进入CLOSE_WAIT状态(关闭等待)。此时TCP通信就进入到了半关闭状态。
  • 客户端接收到服务端返回的确定进入FIN_WAIT2状态(终止等待2).
  • 服务端处理好自己的事情之后,向客户端发送一个FIN=1的包,进入LAST_ACK(最后确认)状态。
  • 客户端接收到服务端发送的关闭连接的包,并返回个服务端确认。进入TIME_WAIT(时间等待)状态,此时TCP连接还没有释放点,必须要经过时间等待计数器设置的时间之后(2MSL),才会进入CLOSED(关闭)状态。
  • 服务端接受到客户端的确认之后,进入CLOSED(关闭)状态。
  • 客户端时间等待计数器结束之后进入CLOSED(关闭)状态。TCP连接释放。

Over!