TCP的三次握手协议(建立链路连接)
- 客户端向服务端发送syn包,请求服务端是否能建立连接
- 服务端如果同意建立连接,回复syn+ack包
- 客户端回复ack包,建立连接
防止已失效的请求报文又回到服务端,引起请求错误,所以要使用三次握手而不是两次握手(防止客户端发送syn包数据阻塞,客户端等待超时后再次向服务器端发送syn包,新的syn包被服务器端接收并响应,一个连接完成建立。但此时若第一个阻塞的syn包又被服务器端接收,服务器端会再次建立连接进入等待状态,导致客户端和服务器端认为连接建立的数量不一致)
TCP的四次挥手协议(断开链路连接)
处于连接状态的客户端与服务器端都可以发起关闭连接请求
- 初始状态,服务器端与客户端均为建立连接状态。假如客户端发送fin包,请求关闭连接,自己进入终止等待1状态
- 服务器端发送ack包,服务器端进入关闭等待状态,客户端进入终止等待2状态。此时客户端还可以发送未发送完的数据,服务器端还可以接收数据
- 服务端发送完数据后,发送fin包,服务端进入最终确认状态
- 客户端接收到fin包后回复ack包,进入超时等待状态。服务端此时如果收到了ack包,直接进入关闭连接状态;如果因信道等原因导致没有接收到ack包,则因服务器端的fin包没有得到回复而再次发送fin包。客户端
TCP连接如何处理丢包和乱序问题
TCP协议会给发送方要发送的数据放入发送缓存中,发送缓存会被分割成多个单元(e.按照字节),每次发送方发送的报文会包含序列号(发送的数据在发送缓存中的地址)-数据长度-数据内容,服务器端接收到后会回复ack包(包含序列号和长度),客户端接收到后会知道下次要发送的数据包的开始位置。数据包可以一次性发送,也可以切割发送。如果一次性发送中出现丢包,接收方发送包含丢包信息的ack(丢包的数据包位于发送缓存的位置与长度),要求发送方再次发送丢包部分的数据。所有数据完成数据重组,所有数据完成发送。