TCP协议原理

一、互联网协议是什么

1.1 TCP/IP模型

​ TCP/IP模型分五层,分别为:物理层,数据链路层,网络层,传输层,应用层。越往下的层越靠近硬件;越往上的层越靠近用户。

1.2 层与层之间的协议

​ 从下往上,每一层都会为上一层提供服务;每一层都会为数据进行封装。

​ 物理层:使用网线把电脑连接起来,由电信号0和1进行数据传输;

​ 数据链路层:使用以太网协议,对电信号进行分组,叫以太网数据包(数据帧),作用是解决局域网内部的点对点通信。以太网协议的数据传输方式是在局域网内进行广播,局域网内的机器根据数据帧“标头”上的目的MAC地址,来判断是否是发给自己。一个数据帧最长为1522个字节,数据长则分帧发送。以太网数据包分为标头(Head)和数据(Data):“标头”的长度为22字节,主要储存目的MAC地址和源MAC地址;”数据“则是储存的数据包具体内容,比如IP数据包。

​ 网络层:作用是建立“主机”到”主机“的通信。主要协议有:ICMP,IP,ARP等。使用IP协议,为每台机器分配一个IP地址,IP地址可以根据ARP协议获取到当前机器的MAC地址,继而将获取到的MAC地址封装到以太网协议的“标头”进行广播。IP数据包分为标头(Head)和数据(Data):”标头“主要储存的是目的IP地址和源IP地址,"数据"部分则是IP数据包的具体内容。IP数据包是直接放进以太网数据包的"数据"部分。

​ 传输层:作用是建立“端口“到”端口“的通信,即程序间的通信。主要协议有:TCP,UDP等。使用TCP协议,可以根据端口找到对应的程序,确保数据发送给机器上的指定程序;也可以提高数据传输的可靠性,即使数据包遗失,也会重发。TCP数据包分为标头(Head)和数据(Data):”标头“主要储存的是目的端口和源端口,"数据"部分则是TCP数据包的具体内容。TCP数据包是直接放进IP数据包的"数据"部分。

​ 应用层:规定应用程序通信数据的格式。主要协议有:HTTP,websocket,FTP等。不同的应用协议有自己协定的格式,应用数据是直接放在TCP数据包的"数据"部分。

二、TCP协议

2.1 TCP数据包

​ TCP数据包是在IP数据包的“数据”里面,以太网数据包最大是1522个字节,去掉以太网的”标头“22个字节,则以太网数据实际负载为1500个字节,再去掉IP数据包和TCP数据包的”标头“及其格外头信息,所以TCP实际负载为1400字节左右。

​ TCP"标头"内的占位符:

​ 序号seq:数据包上的编号,首包编号随机生成,占4个字节;

​ 确认号ack:表示期待接受下一个数据包的编号,占4个字节;

​ 确认ACK:当ACK=1时,表示对接收到数据包的序列号确认有效,反之无效,占1个字节;

​ 同步SYN:当SYN=1,ACK=0时表示:这是一个连接请求报文段。若同意连接,则在响应报文段中使得SYN=1,ACK=1。因此,SYN=1表示这是一个连接请求,或连接接受报文。SYN这个标志位只有在TCP建产连接时才会被置1,握手完成后SYN标志位被置0;

​ 终止FIN:用来释放一个连接。FIN=1表示:此报文段的发送方的数据已经发送完毕,并要求释放运输连接。

2.2 TCP的可靠传输

​ 在网络层的IP协议上传输数据并不保证数据包的完整性,比如路由器丢包,需要知道丢的哪一个包,从而重新发送,就需要依靠TCP协议了。

​ 比如10MB的文件,TCP的实际负载时1400字节,那就需要发送7100多个包。为了7100多个包完整的发送到指定机器,TCP协议机制会为每一个包进行编号,第一个包的编号随机生成。假设第一个包的编号为1,这个包的实际负载长度为100个字节,那么可以推算出下一个包的编号是101,以此类推。

​ TCP协议在传输的过程中,发送端每发送一个数据包,接收端都会返回一个确认包即为ACK;假如数据包编号为100的遗失了,接收端会重复发送ack=100 ACK=1的确认包给发送端,直到发送端重新发送编号为100的为止,所以TCP保证了数据的完整性

三、TCP的三次握手和四次挥手

3.1 TCP的三次握手

​ 第一次握手:客户端发送一个SYN=1,随机生成序号seq=x的syn包给服务端,然后进入等待确认连接状态;

​ 第二次握手:服务端接收到syn包后,也返回一个(SYN+ACK)包,内容为ACK=1,随机生成序号seq=y,SYN=1,ack=x+1,然后进入等待确认连接状态;

​ 第三次握手:客户端收到(SYN+ACK)包后,向服务端返回序号为seq=x+1,ACK=1,ack=y+1的确认包,然后进入连接状态;服务端收到确认包后也把状态改为连接状态;

3.2 TCP的四次挥手

​ 第一次挥手:客户端发送请求断开连接数据包FIN=1,seq=u,进入等待断开状态;

​ 第二次挥手:服务端收到FIN包后,返回一个确认包,进入关闭等待状态,表示已经收到断开请求,但是还没有断开;然后将服务端上的缓存数据全部发给客户端;

​ 第三次挥手:等服务端上的缓存数据都给客户端之后,发送一个请求断开数据包FIN=1给客户端,然后进入确认等待关闭状态(如果客户端没有返回确认包,则重复发送);

​ 第四次挥手:客户端收到服务端的FIN包后,返回一个确认包2分钟后自动断开;服务端收到确认包后立即断开。

posted @ 2020-11-05 15:50  吹_神  阅读(706)  评论(0)    收藏  举报