TCP和UDP不同,UDP是面向无连接的,尽力的传输,他不在乎目标是否成功获取到包,也不在乎包是否完整,只需要尽快发送出去即可。但是TCP和UDP不一样,TCP需要保证可靠性,因此TCP有连接时的三次握手和断开连接时的四次挥手机制。
在TCP中,当发送端的数据到达接收主机的时候,接收端知己会返回一个已收到消息的通知,这个通知叫做确认应答(ACK)。就像我们在说话的时候,在停顿的地方可以询问对方是否接收到自己的想法,如果对方迟迟没有反馈,我们还可以再问一遍,把对话双方替换成收发两端就是互联网中的确认应答。TCP通过肯定的确认应答来实现可靠的数据传输。当发送端将数据发送之后会等待对端的确认应答,如果有确认应答就说明数据已经成功到达对端,反之则数据丢失的可能性很大。如果在一段时间内没有等到确认应答,那么发送端就可以认为数据已经丢失,并进行重发,所以即使产生了丢包也可以保证数据能够到达对端。未收到确认应答还有一种可能,那就是对端返回的确认应答在途中丢失,这时也会认为数据没有到达目的地,从而进行重新发送。有时候因为网络等原因导致返回的确认应答没有及时返回到源主机,这时源主机会向目标主机重新发送,但是为了保证对上层应用提供可靠的传输,目标主机必须舍弃重读的数据包。因此就需要引入一种机制,这种机制需要能够识别是否已经接受数据,又能够判断是否需要接收。
上述的功能都可以通过序列号来实现。序列号是按顺序给发送数据的每一个字节都标上号码的编号,接收端查询接受数据TCP首部中的序列号和数据的长度将自己下来应该接收的序号作为确认应答反送回去。这样通过序列号和确认应答号,TCP可以实现可靠传输。
TCP建立连接的过程被称作三次握手
首先客户端向服务器端发送一个SYN(seq=j)(同步序列编号(Synchronize Sequence Numbers)),这个包含了自己的最大消息长度(MSS)和自己即将发送的第一个序列号等
第二步,当服务器收到客户端发送的SYN之后,返回一个ACK(seq=j+1)来确认自己接收到了消息,然后自己也发送一个SYN包(seq=k)
第三步,客户端收到服务器的ACK+SYN包,然后向服务器发送ACK(seq=k+1),然后就成功建立起了连接,开始发送数据。
通信完成后断开连接的过程被称为四次挥手
第一步,当客户端发送完数据准备断开连接时会向服务器发送FIN包
第二步,服务器收到FIN信号后先向客户端发送ACK,来防止客户端重复发送FIN,然后通知自己的程序:对方希望断开连接
第三步,程序发送完剩余的内容之后,服务器向客户端发送FIN包
第四步,客户端接收到FIN之后返回一个ACK,然后断开连接