TCP:传输控制协议
TCP与UDP都工作在传输层,但与UDP不同的是TCP必须先建立连接,才可以进行传输。
在不可靠的基础上建立可靠的传输。
建立通信过程:
三次握手:
通俗来说,三次握手就是三次通信的过程,可以把这个通信过程看成是一次网购。
在挑选完商品后,第一次握手就是付款,只有付款后,商家才会发货;第二次握手就是商家发货,当快递收到后;第三次握手是签收快递,对所收到的快递进行检查并确认收货。
付款 –> 发货 –> 签收
- 只有商家收到你付款的消息之后,商家才会向你所填写的收货地址发送快递;快递收到后,若未进行收货确认会导致商家无法确认你是否已经收到物品,所以需要进行收货确认告知商家我已经拿到快递。
这个过程只有完成上一步之后,才会继续进行下一步,当中任意一步缺失或者错位都会导致这次网购失败。
TCP报文:
TCP报文类型
标志位代表的就是TCP报文的类型,可以指定单个或多个标志,每个标志占1位。
- URG:紧急指针;优先级最高,当URG置1时,该报文需要插在最前面,尽快发送。
- SYN:同步序号,表示发起连接;当SYN置1,ACK置0,表示请求连接;当SYN置1,ACK置1,表示确认连接。
- ACK:确认应答,表示确认应答,在TCP建立连接后的所有ACK都要置1。
- RST:两种含义:重新连接;拒绝连接/释放连接。
- FIN:结束连接,当FIN置1时,请求释放连接
- RSH:表示希望对端能够优先处理;当RSH置1时,对端收到后该类型报文后会尽快处理
三次握手(建立连接)
客户端
客户端未向服务端发起连接前,处在closed状态;在向服务端第一次握手后,状态转变为syn-send,等待服务端回应;收到服务端回应后,进行第三次握手,向服务端返回一个确认连接后,就会变成established状态,已经完成客户端的连接。
服务端
服务端未收到连接请求前,会一直处于listen状态;在收到客户端发送来的连接请求后,会从listen转变为syn-rcvd状态,并与客户端进行第二次握手,回应客户端一个响应报文和连接请求;当收到客户端回应后,状态会变为established状态,这时TCP的三次握手结束。
第一次握手:客户端 --> 服务端
TCP报文内标志位为SYN=1,ACK=0,并使用随机数生成器生成一个随机序列数seq,假设为x。
第二次握手:服务端 --> 客户端
TCP报文内标志位为ACK=1,SYN=1,ack=x+1,使用随机生成器生成一个随机序列数seq,假设为y。
第三次握手:客户端 --> 服务端
TCP报文内标志位为ACK=1,ack=y+1,为保证第一次握手与第三次握手仍是同一连接,则seq=x+1
四次挥手(释放连接)
客户端
当客户端决定进行释放连接时,进行第一次挥手向服务端发送释放连接请求将FIN置1;同时进入FIN-WAIT-1状态;当服务端确认后,从状态FIN-WAIT-1转变为FIN-WAIT-2,继续等待服务端请求释放连接;当收到服务端发送的请求释放连接后,进行第三次挥手,对服务端的请求进行确认应答。此时的状态并不是CLOSE,而是进入TIME-WAIT状态,再等待两个最长报文寿命后,才会进入CLOSE状态。这样做的目的是以保证服务端能够收到客户端的ACK确认应答。
服务端
当服务端收到客户端发送的释放连接的请求后,进行第二次挥手对发送端的请求确认,并进入CLOSE-WAIT状态;当服务端决定释放连接后,进行第三次挥手主动向客户端发送释放请求,并进入LAST-ACK状态;只有收到客户端的确认后,才会关闭此次连接。
第一次挥手:客户端 --> 服务端
TCP报文标志位为FIN=1,并随机生成一个随机序列数seq,假设为x。
第二次挥手:服务端 --> 客户端
TCP报文标志位为ACK=0,ack=x+1,随机生成一个随机序列数,假设为y。
第三次挥手:服务端 --> 客户端
TCP报文标志位为FIN=1,ACK=1,ack=x+1,随机生成一个随机序列数,假设为z。
第四次挥手:客户端 --> 服务端
TCP报文标志位为ACK=1,ack=z+1,为保证第一次挥手与第四次挥手是同一连接,则seq=x+1.
至此,关于TCP三次握手与四次挥手的内容就全部讲完了,如有错误,望指正。