TCP的基础知识

1. 简介

定义:TCP(Transmission Control Protocol),即传输控制协议,是一种传输层通信协议。

特点:面向连接、面向字节流、可靠的双全工通信协议。

面向连接:指的是要使用TCP传输数据,必须先建立TCP连接,传输完成后释放连接。就像打电话一样必须先拨号建立一条连接,打完后挂机释放连接。

双全工通信:即一旦建立了TCP连接,通信双方可以在任何时候都能发送数据。

可靠的:指的是通过TCP连接传送的数据,无差错,不丢失,不重复,并且按序到达。

面向字节流:流,指的是流入到进程或从进程流出的字符序列。简单来说,虽然有时候要传输的数据流太大,TCP报文长度有限制,不能一次性传输完,要把它分成好几个数据块,但是由于可靠性保证,接收方可以按顺序接收数据块然后重新组成分块之前的数据流,所以TCP看起来就像直接互相传输字节流一样,面向字节流。

2. TCP/IP的分层管理

TCP/IP协议族里最重要的一点就是分层。TCP/IP协议族按层次分别分为以下4层:应用层、传输层、网络层和数据链路层。

把TCP/IP层次化是有好处的。比如,如果互联网只由一个协议统筹,某个地方需要改变设计时,就必须要把所有部分整体替换掉。而分层之后只需把变动的层替换掉即可。把各层之间的接口部分规划好之后,每个层次内部的设计就能够自由改动了。

值得一提的是,层次化之后,设计也变得相对简单了。处于应用层上的应用可以只考虑分派给自己的任务,而不需要弄清对方在地球上哪个地方、对方的传输路线是怎样的、是否能确保传输等送达问题。

应用层

应用层决定了向用户提供应用服务时通信的活动。

TCP/IP协议族内预存了各类通用的应用服务。比如,FTP(File Transfer Protocol,文件传输协议)和DNS(Domain Name System,域名系统)服务就是其中两类。Http协议也处于改层。

传输层

传输层对上层应用层,提供处于网络连接中的两台计算机之间的数据传输。

在传输层有两个性质不同的协议:TCP(Transmission Control Protocol,传输控制协议)和UDP(User Data Protocol,用户数据报协议)。

网络层(又名网络互连层)

网络层用来处理在网络上流动的数据包。数据包是网络传输的最小数据单位。改成规定了通过怎样的路径(所谓的传输路线)到达对方计算机,并把数据包传送给对方。

与对方计算机之间通过多台计算机或网络设备进行传输时,网络层所起的作用就是在众多的选项内选择一条传输路线。

链路层(又名数据链路层,网络接口层)

用来处理连接网络的硬件部分。包括控制操作系统、硬件的设备驱动、NIC(Network Interfance Card,网络适配器,即网卡),及光纤等物理可见部分(还包括连接器等一些传输媒介)。硬件上的范畴均在链路层的作用范围之内。

TCP/IP模型和OSI模型

OSI模型分为七层:分别是,应用层、表示层、会话层、传输层、网络层、链路层和物理层。OSI七层模型对应TCP的四层模型如下所示。

3. TCP的三次握手

TCP建立连接,必须要进行三次握手:若A要与B进行连接,则必须经过以下几个步骤。

第一次握手:建立连接。客户端向服务端发送连接请求报文段,将SYN置为1,Sequence Number置为x;然后,客户端进入SYN_DENT状态,等待服务器的确认。即A发送信息给B。

第二次握手:服务器收到客户端的SYN报文段,需要对这个SYN报文段进行确认。即B收到连接信息后向A返回确认信息。此时服务器进入SYN_RECV状态。确认信息是:SYN=1,回复应答字段ACK=1,Sequence=y,ack=x+1;

第三次握手:(针对服务器端的SYN的确认应答)客户端收到服务器的(SYN+ACK)报文段,并向服务器发送ACK报文段。即A收到确认信息后再次向B返回确认连接信息。此时客户端与服务器进入ESTABLISHED状态。应答信息是:ACK=1,Sequence=x+1,ack=y+1。

此时,A会告诉自己上层连接建立;B收到连接信息后告诉上层连接建立。

三次握手过程,借用网上的一张图进行说明。

这样就完成了TCP三次握手过程,相当于TCP的连接建立完成可以开始传输数据了。

问题一:为什么是三次握手?

答:本质上是因为TCP是全双工,为了保证传输的可靠性,需要给每次传输的数据段添加序号,那么初始的序号就是TCP三次握手真正的意义所在。

理解:在一次网络传输过程中,C端发送给S端的数据包可能会被分割成多段,每一段都有一个序号,发送给S端的数据包并无法确保先发送的先收到后发送的后收到,所以每段数据都会有一个序号。S端收到数据后也并不是每收一个就立马返回给C端。在S端有一个队列缓冲区,等到所有数据全收到后,S端会先进性一个排序,然后再将数据返回给C端。故此,三次握手它做的事情就是交换TCP通信的属实序号。至于为什么是三次握手,这里用通俗的话解释就是为了确保通信的可靠性。首先第一次,C端发送序号给S端是告诉S端我发送的序号是啥啥啥,你别搞错了。第二次S端将收到的数据排序打包后再生成一个新的序号告诉C端,我给你返回的数据是啥啥啥,你别搞错了。第三次是C端告诉S端我收到你给我的回应了,内容是啥啥啥。

至此,TCP的三次握手过程就完成了。

4. TCP的四次挥手

TCP释放连接需要四次挥手的过程,该过程可以是客户端或者服务端首先发起断开连接的请求。现在假设A主动释放连接(数据传输结束后,通信的双方都可以释放连接)

第一次挥手:A发送释放信息给B。发出去之后,A->B发送数据这条路就断了。此时A(客户端)就进入了FIN-WAIT-1(终止等待1)状态。

第二次挥手:B收到释放信息后,回复确认释放的信息。服务端同意客户端的释放连接请求。此时服务器进入了CLOSE-WAIT(关闭等待)状态。在此之后(客户端收到服务器的确认请求),此时客户端就进入了FIN-WAIT-2(终止等待2)状态。等待服务器发送连接释放报文。

第三次挥手:B发送请求释放连接信息给A。此时是服务器向客户端发送连接释放报文。此时服务器进入了LASK-ACK(最后确认)状态,等待客户端的确认。

第四次挥手:A收到服务器B发出的释放连接信息后,向B发出确认释放信息。B收到确认信息后就会正式关闭连接。此时,客户端进入了TIME-WAIT(时间等待)状态。此时TCP连接还没有释放,必须经过2*SML时间段后,客户端才会进入CLOSED状态。

该过程用图表示可能会更清楚一些。

至此,TCP的四次挥手也就学习完了。上面描述了为什么需要三次握手,至此是否会有疑问,为什么握手需要三次,而挥手却需要四次呢?现在我们来看一下这个问题。

我们知道,TCP是全双工的(即,客户端和服务端可以相互发送和接收请求),所以需要双方都确认关闭连接。基于此,我们更详细的分析其中的道理。通信双方都可以独立关闭自己的通信通道,也就是办关闭。客户端先发送FIN告知服务端我已经完成数据发送了,服务端发送ack来告知客户端它已知晓此事。这样的一个流程下来,就关闭了客户端的发送信息通道,但是还是可以接受来自服务端的数据的。此时的服务端已经不能接收来自客户端的数据了,但是它还是可以给客户端发送数据。如果服务端也没有数据要发送给客户端了,服务端也会以一个FIN标志位发送一个释放连接的信息给客户端,客户端收到后会发送一个ack确认信息表示已经知晓。这样就关闭了服务端的发送信息通道和客户端的接收信息通道。

猜你喜欢

转载自blog.csdn.net/zhourui_1021/article/details/106752259