首先,什么是TCP?
TCP是传输控制协议(Transmission Control Protocol)的缩写,是一种面向连接的、可靠的、基于字节流的传输层通信协议。它是由IETF的RFC 793定义的,旨在适应支持多网络应用的分层协议层次结构1。 TCP在网络传输中起到了重要的作用,它确保了数据的可靠传输,使得数据能够在远程计算机之间创建连接。
以上是百度词条对TCP的诠释,可以一点一点理解。
面向连接:是在传输数据前将进行三次握手来进行端到端的虚链路。
三次握手
在TCP协议中,通信双方将通过三次TCP报文,实现对信息的了解,并在此基础上建立一个TCP连接,而通信双方的三次TCP报文段的交换过程就叫三次握手。
TCP三次握手示意图
第一次握手:
客户端发送一个数据包,询问对方是否能与对方建立连接,我们称这个数据包为SYN包,并随机产生一个值seq=j,这个数据包传输到服务器,客户端进入SYN_SENT状态,等待服务器回应;
第二次握手:
服务器收到syn包,必须确认客户端的SYN(ack=j+1),同时自己也发送一个SYN包(值为seq=k)确认请求,即SYN+ACK包,此时服务器进入SYN_RECV状态。
第三次握手:
客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),两方检查ACK包和ack值,如果没有问题,客户端和服务器进入ESTABLISHED(TCP连接成功)状态,三次握手完成。
为什么是三次握手?
原因就是为了相互确认对方的序列号。
完成三次握手后,TCP协议为每一个连接都建立了一个发送缓冲区,建立连接后,第一个序列号为0,从第一个序列号开始,后面每个字节的序列号会增加1。发送数据时,会从发送缓冲区取一部分数据组成发送报文,其中会附带序列号和长度。另一边在接收到数据后,会回复确认报文,在确认报文中,ack=序列号+长度,这是下一数据包要发送的起始序列号。
这样的发送方式能使发送端确认发送的数据被接收端接收。发送端也可以一次发送多个数据片段。如果丢失了其中一些数据包,接收端可以要求重传,这时接收端发送的ack就等于缺失部分起始序列号。这个过程不分发送端和接收端,TPC连接是全双工的。
四次断开
处于连接状态的客户端和服务端都可以发起断开连接请求。
TCP四次断开示意图
第一次断开:
当客户端通知TCP数据已经发送完毕时,TCP向服务端发送一个带有FIN附加标记的报文段(FIN表示英文finish),表示要求关闭连接,然后进入等待一状态。
第二次断开:
服务端收到这个FIN报文段之后,并不立即用FIN报文段回复客户端,而是先向客户端发送一个确认序号ACK,表示自己进入了关闭等待状态,同时客户端进入了等待二状态。
第三次断开:
服务端说我要彻底的关闭连接,向客户端发送一个FIN报文段,进入最后确认状态。
第四次断开:
客户端收到这个FIN报文段后,向服务端发送一个ACK包,进入超时等待状态,时间到了之后自动关闭;服务端收到ACK包后立刻关闭连接。
超时等待是为了确认对方已经收到ACK包。
至此TCP四次断开结束。
一些专业术语:
- IETF:国际互联网工程任务组(The Internet Engineering Task Force)是一个公开性质的大型民间国际团体,汇集了与互联网架构和互联网顺利运作相关的网络设计者、运营者、投资人和研究人员。
- RFC:是一系列以编号排定的文件。文件收集了有关互联网相关资讯,以及UNIX和互联网社群的软件文件。RFC 793是传输控制协议。
- syn:请求同步。
- ack:确认同步。
- seq:发送自己的数据。
- FIN(ISH):为TCP报头的码位字段,该位置为1的含义为发送方字节流结束,用于关闭连接。
- 报文:数据包。