TCP介绍
TCP(Transmission Control Protocol):传输控制协议,是面向连接的、可靠的、基于字节流的传输层通信协议。
面向连接的:数据发送之前,两端必须先建立连接,方法就是我们熟知的三次握手。并且是一对一的,无法像UDP那样一对多。
可靠的:通过多种机制保证数据包的正确传输,如序列号/确认号应答机制、校验和机制、超时重传机制、流量控制、拥塞避免机制等。
基于字节流的:虽然应用程序和TCP的交互是一次一个数据块(大小不等)。但TCP把应用程序看成是一连串的无结构的字节流。TCP有一个缓冲,当应用程序传输的数据块太长,TCP就可以把它划分短一些再传送。如果应用程序一次就发一个字节,TCP也可以等待积累有足够多的字节后构成报文段再发出去。
TCP的三次握手
第一次握手:客户端向服务端申请建立TCP连接,并向服务端发送SYN报文,作为第一次握手。这个SYN为一个随机数,此处记作A。
第二次握手:服务端接受到SYN报文后,会向客户端再发送一个报文,这个报文中的ACK为A+1,即将ACK标识为收到的SYN数+1。同时会再返回另一个SYN给客户端,此处的SYN记作B。
第三次握手:客户端收到报文后,会将ACK与此前发送出去的SYN进行比对,若ACK满足A+1,则在客户端判断连接已建立。并给服务器发送确认数据包,SYN为A+1,表明已收到上一报文,ACK为B+1,通知服务器建立连接状态。
TCP的四次挥手
第一次挥手:客户端发送FIN报文给服务端,作为第一次挥手。告知服务端,我已经没有数据可以发送了。但是不知道服务端还有没有数据返回,所以仍然保持连接。
第二次挥手:服务端收到FIN报文,再返回一个ACK报文给客户端。告诉客户端我已经知道你没有东西要发送了,但是我不知道我有没有东西要给你。
第三次挥手:服务端确认自己没有报文需要发送给客户端,便发送FIN报文给客户端,告诉客户端我没有报文要发送给你了,你可以终结连接了。但是,此时服务端不确认客户端是否有收到信息,便继续保持连接。
第四次挥手:客户端在收到ACK和FIN后,得知服务器已经知道自己要终结连接了,并且没有东西要返回,便发送ACK报文给服务端,告知服务端我知道了,你终结连接吧。随后客户端便终结连接,服务端收到ACK后,也终结连接。