TCP/IP 是一个四层体系结构,它包含:应用层,运输层,网际层和网络接口层。
应用层:通过应用进程间的交互来完成特定网络进程的应用。应用层协议定义的是应用进程间的通信和交互规则。
运输层:负责向两台主机进程之间的通信提供通用的数据传输服务。应用进程利用该服务传送应用层报文。
网络层:选择合适的网间路由和交换节点,确保计算机通信的数据及时传送。
数据链路层:两台主机之间传输数据,总是在一段一段的链路上传送,需要使用专门的链路层协议。
物理层:实现相邻计算机节点之间比特流的透明传送,尽可能屏蔽掉具体传输介质和物理设备的差异。
什么是TCP?
TCP其实一种面向连接的、可靠的、基于字节流的传输层通信协议,在发送数据前双方必须建立一种连接。所谓连接就是服务端和客户端保存的关于对方的一份信息,包含IP地址或者端口号等。
一个TCP连接由一个4元组构成,分别是两个IP地址和两个端口号。一个TCP连接通常分为三个阶段:连接、数据传输、退出(关闭)。通过三次握手建立一个链接,通过四次挥手来关闭一个连接。
三次握手:三次握手的本质是确认通信双方收发数据的能力。
第一次握手:客户端要向服务端发起连接请求,首先客户端随机生成一个起始序列号ISN(比如是100),那客户端向服务端发送的报文段包含SYN标志位(也就是SYN=1),序列号seq=100。
第二次握手:服务端收到客户端发过来的报文后,发现SYN=1,知道这是一个连接请求,于是将客户端的起始序列号100存起来,并且随机生成一个服务端的起始序列号(比如是300)。然后给客户端回复一段报文,回复报文包含SYN和ACK标志(也就是SYN=1,ACK=1)、序列号seq=300、确认号ack=101(客户端发过来的序列号+1)。
第三次握手:客户端收到服务端的回复后发现ACK=1并且ack=101,于是知道服务端已经收到了序列号为100的那段报文;同时发现SYN=1,知道了服务端同意了这次连接,于是就将服务端的序列号300给存下来。然后客户端再回复一段报文给服务端,报文包含ACK标志位(ACK=1)、ack=301(服务端序列号+1)、seq=101(第一次握手时发送报文是占据一个序列号的,所以这次seq就从101开始,需要注意的是不携带数据的ACK报文是不占据序列号的,所以后面第一次正式发送数据时seq还是101)。当服务端收到报文后发现ACK=1并且ack=301,就知道客户端收到序列号为300的报文了,就这样客户端和服务端通过TCP建立了连接。
简而言之,三次握手:
1.客户端向服务器发送一个建立连接的请求
2.服务器接到请求后发送同意连接的信号
3.客户端接到同意连接的信号后,再次向服务器发送了确认信号,然后客户端与服务器的连接建立成功
四次挥手:目的是关闭一个链接
第一次挥手:当客户端的数据都传输完成后,客户端向服务端发出连接释放报文。
第二次挥手:服务端收到客户端发的FIN报文后给客户端回复确认报文。
第三次挥手:服务端将最后数据(比如50个字节)发送完毕后就向客户端发出连接释放报文。
第四次挥手:客户端收到服务端发的FIN报文后,向服务端发出确认报文。而服务端一旦收到客户端发出的确认报文就会立马释放TCP连接,所以服务端结束TCP连接的时间要比客户端早一些。
参考:https://blog.csdn.net/ThinkWon/article/details/104903925