TCP讲解

TCP是一个面向连接的、可靠的、流协议。在OSI模型中属于传输层协议。

序列号

序列号是按顺序给发送数据的每个字节都标上的编号。接收端查询接收数据TCP首部的序列号和数据的长度,计算出自己下一步应该接收的序列号,将其作为确认应答返回给发送端。

确认应答

当发送端的数据到达接收端主机时,接收端主机会返回一个已经收到消息的通知,这个消息叫做确认应答(ACK)。如果在一定时间内没有收到ACK,发送端认为可能丢包,则进行重发。接收端主机如果收到相同数据会放弃接收该数据,不会造成重复接收相同数据的情况。

超时重发

TCP每次发包都会计算往返时间及其偏差,并将这个时间作为重发超时的时间,如果超过该时间仍然没有收到接收端的确认应答,则认为发送超时,准备重发。如果重发一定次数仍然失败,则判断网络异常,强制关闭连接。
因为有重发机制,所以数据并不是一发送就从缓冲区中删除,而是等到接收端的确认应答返回,确认该数据已经被接收,才会从缓冲区删除。

连接管理

三次握手

TCP在数据通信之前,通过TCP首部发送一个SYN包作为建立连接的请求并等待确认应答,如果接收端发来确认应答,则认为可以进行数据通信,并向接收端返回确认应答。因此连接的建立需要来回发送三个包才能完成。

  1. 客户端发送SYN(向服务端请求建立连接)
  2. 服务端发送SYN/ACK(通知客户端服务端已经准备好了)
  3. 客户端回应ACK(通知服务端客户端已经准备好了)

三次握手后,双方都知道对方已经准备好了,连接建立。
TCP三次握手

四次挥手

在通信结束后也会进行断开连接的处理,发送FIN包给接收端。由于TCP是全双工模式,可以单端发送数据,所以需要4次挥手。
2、3步不能合并,是因为此时服务端可能还有数据没有发送,不能立刻就关闭,所以先发送ACK回应,等数据处理完再发送FIN请求客户端关闭。

  1. 客户端发送FIN/ACK(向服务端请求断开连接,标明客户端没有数据需要发送,可以关闭,但是还可以接收服务端数据)
  2. 服务端回应ACK(通知客户端可以关闭连接)
  3. 服务端发送FIN/ACK(向客户端请求断开连接,标明服务端没有数据需要发送,可以关闭)
  4. 客户端回应ACK(通知服务端可以关闭连接,服务端关闭连接,客户端等待一段时间后也关闭连接)

TCP四次挥手

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×