网络编程的理解和TCP三次握手和四次挥手详解

网络编程就是通过IP地址和端口号或者域名连接到另一台计算机上,使用规定的协议(HTTP)和数据传输方式(TCP/UDP)交换数据。

比如:使用套接字来达到进程间通信

TCP协议:

提供可靠的,端到端的字节流的通信。是一种面向连接的协议。是字节流而不是报文流。

UDP协议:

是一种无连接、不可靠的传输协议。发送的是IP数据包。

OSI模型

是一个用于计算机互联的标准体系。

一共分为七层:

物理层、数据链路层、网络层、传输层、会话层、表示层、应用层。

网络编程的理解和TCP三次握手和四次挥手详解

TCP/IP五层模型

网络编程的理解和TCP三次握手和四次挥手详解

分别应用层、传输层、网络层、数据链路层、物理层。

应用层囊括了OSI模型的应用、表示、会话层。

每一层都工作着不同的设备。

网络编程的理解和TCP三次握手和四次挥手详解

每一层也有自己的协议。

比如应用层有HTTP超文本传输协议。

传输层有TCP、UDP协议。

网络编程的理解和TCP三次握手和四次挥手详解

网络编程:

实际上就是计算机之间的通信,通过IP地址和端口交换数据。

通信的模型有官方的OSI七层模型和实际上用的TCP/IP模型。

OSI模型有七层分别是应用层、表示层、会话层、传输层、网络层、数据链路层和物理层。

而TCP/IP

模型把OSI中的应用、表示、会话层都放在了一个应用层中。

每一层都有自己的传输协议。像应用层就有我们常用的HTTP超文本传输协议,和FTP协议。

传输层则是TCP和UDP协议。

TCP协议是一种面向连接、可靠的、提供端到端的字节流的传输协议。TCP确保传输数据的正确性,不出现丢失或乱序。

TCP的工作方式:

TCP报文中比较重要的字段有:

Seq序号,确认号ACK,标志位Flags。

共6个,即URG、ACK、PSH、RST、SYN、FIN等。具体含义如下:[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HcfmcxV0-1595265358735)(C:\Users\12556\AppData\Roaming\Typora\typora-user-images\image-20200721004246759.png)]

建立连接的三次握手:

首先客户端发送一段TCP报文给服务器:

其中标志位为SYN表示请求建立新连接。

Seq序号为一个x(x通常是1)

随后客户端进入SYN-SEND也就是请求连接发送阶段

之后服务器接收到来自客户端的TCP报文也返回一段TCP报文:

标志位为SYN和ACK,表示确认客户端的报文Seq序号有效,并同意创建新连接。

序号为Seq=y

确认号为Ack=x+1(确认号在一次传输中一般都是对方的序号加一)

随后服务器进入SYN-RCVD:请求新连接已接收阶段。

客户端接受到服务器确认的TCP报文后:

明确客户端到服务器的数据传输都是正常的,结束SYN-SENT阶段。

并且返回最后一段TCP报文:

标志位为:ACK,确认服务器发送的信号。

序号Seq=x+1

确认号:ACK=y+1,表示收到了服务器的报文序号,+1作为这段报文的确认序号。

随后客户端进入ESTABLISHED阶段,连接以建立阶段。

服务器在收到来自客户端的确认数据报文后也进入ESTABLISHED阶段。

四次挥手:

连接的释放必须是某一方的主动释放。另一方被动释放。

以客户端主动释放为例。

1.客户端想要释放连接:

在挥手之前先结束ESTABLISHED阶段,

发送一段TCP报文:

标记为为FIN表示请求释放连接

序号为Seq=U

随后客户端进入FIN-WAIT-1阶段,也就是半关闭阶段,停止向客户端到服务器端的方向发送数据,但是任然可以接受服务器的数据。

这里的不发送的不是一切数据。所以客户端仍然能发送ACK确认报文。

2.服务器端接收到客户端的报文

结束ESTABLISHED阶段,进入CLOSE-WAIT阶段,半关闭状态,返回TCP报文。

标志位为ACK,接收到客户端发送释放连接的请求

序号Seq=V

确认号Ack=U+1

随后服务器准备释放他们的连接

客户端接收到服务器端的TCP报文后,确认了客户端之前的发送请求进入FIN-WAIT-2阶段。

3.服务器发送ACK确认报文后,准备释放连接之后,再次向客户端发送报文

其中:

标志位为FIN,ACK,表示已经准备好释放连接

Seq=W

确认序号为ACk=U+1

服务器结束CLOSE-WAIT阶段,进入LAST-ACK阶段。最后确认阶段。

此时停止了服务器端向客户端发送数据,但是能接受客户端的数据。

4.客户端收到服务器的报文后,确认服务器要释放连接,进入TIME-WAIT阶段

向服务器发送一段报文:

标记为ACK,表示接收到服务器准备释放连接的信号

序号Seq=U+1

确认号Ack=w+1

随后TIME-WAIT阶段等待2MSL

其中1MSL是指:一段TCP报文在传输过程中的最大生命周期。

2MSL的实际作用是:

第一个1MSL表示:

客户端发送的确认报文。

服务器端在1MSL内没有收到客户端发出的ACK确认报文,就会再次向客户端发出FIN报文。

此时是第二个MSL时间。

如果2MSL内客户端都没有接收到服务器的报文。

表示服务器正常接收了ACK报文,关闭了连接。

而UDP则是无连接、不可靠的发送IP数据包的协议。使用UDP的速度更快,但是不保证数据一定传输到对方。并且UDP的结构简单所以网络开销小。TCP则可以保证接收端毫无差错的收到发送端的字节流。