网络协议:TCP/IP

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/fangxinde/article/details/83832047

TCP/IP(Transmission Control Protocol/Internet Protocol)是一种可靠的网络数据传输控制协议。定义了主机如何接入因特网以及数据如何在他们之间传输的标准。

TCP/IP协议参考模型把所有TCP/IP系列协议归类到四个抽象层中;每一个抽象层建立在底一层提供的服务上,并且为高一层提供服务。如下图:

OSI模型(开放式系统互联通信参考模型),它是由国际标准化组织提出的,试图使各种计算机在世界范围内互联为网络的标准框架。

三次握手协议:

所谓三次握手协议,指在建立TCP连接前,客户端、服务端之间要发送三次数据包来确认是否建立连接。

 协议中一些字段的含义:

 1)序号:seq序号,占32位,用来标识从TCP源端向目的端发送的字节流,发起方发送数据时对此进行标记。

 2)确认序号:ack序号,占32位,只有ACK标志位为1时,确认序号字段才有效,ack=seq+1。

 3)标志位:共6个,即URG、ACK、PSH、RST、SYN、FIN等,具体含义如下:

                           

  

三次握手协议的流程如下图:

第一次握手:客户端设置标志位SYN=1,随机生成序号seq的值为J,并导入数据包中,发送给服务端,此时客户端的状态为SYN_SENT,等待服务端确认.。

第二次握手:服务端接受到数据包后,由标识为SYN=1可知客户端请求建立连接,此时,设置SYN=1,ACK=1,ack的值为客户端传过来的seq值J加上1,再随机生成一个seq值K,这些值导入数据包,发送给客户端以确认连接请求,此时服务端的进入SYN_RCVD状态。

第三次握手:客户端接受到数据包,需对数据进行验证,确认ACK值为1、ack为J+1,如果正确则将标识位设置为ACK=1,ack的值为传递过来的seq值K加1.然后将此数据包发送给服务端,服务端需对传递过来的数据进行检查验证,确认ACK是否为1,ack为K+1.如果正确,则双方建立连接成功,双方都进入ESTABLISHED状态。完成三次握手后,客户端、服务端就可以传递数据了。

四次挥手协议:

所谓四次挥手(Four-way Wavehand)即终止TCP连接,就是指断开一个TCP连接时,需要客户端和服务端总共发送四个包以确认连接的断开。

了解四次挥手协议,首先了解下单工、半双工、双工三种通信方式的内涵:

单工:数据通信只支持数据在一个方向上传输

半双工:数据通信允许数据在两个方向上传输,但某一时刻,只能在一个方向上传输,有点像切换方向的单工传输。

全双工:数据通信允许数据在两个方向上同时传输,因此全双工是两个单工通信方式的结合,他要求发送设备和接受设备都有独立的发送和接受能力,

由于TCP连接时是全双工的,因此,每个方向都必须要单独进行关闭,这一原则是当一方完成数据发送任务后,发送一个FIN来终止这一方向的连接,收到一个FIN只是意味着这一方向上没有数据流动了,即接受端不会再收到数据了,但是在这个TCP连接

中反方向上仍能发送数据,直到此方向上也能发送一个FIN。首先进行关闭一方是主动关闭,另一方是被动关闭。

1)第一次挥手:Client端发送一个FIN至Service端,表示Client端没有数据传输至Service端了,等待服务端的确认(客户端说我将要关闭闸口了,将不发信息给你了,你那边需发送的信息,赶快发过来)。

2)第二次挥手:Service收到FIN后,发送一个ack给Client,ack值为确认序号+1,表示服务端Service数据发送完了,可准备关闭连接;服务端进入CLOSE_WAIT状态(服务端说我知道了,我正在把剩余的信息发给你)。

3)第三次挥手:Service端发送一个FIN至Client端,用来关闭Service端至Client端方向的数据传输。服务端进入LAST_WAIT状态(服务端说我这边的信息发完了,将要关闭这边的闸口了)。

4)第四次挥手:Client端收FIN后,客户端进入TIME_WAIT状态,同时发送ACK至服务端,确认序号为接受序号+1,服务端接受后进入CLOSE状态(客户端说我知道了,你可以关闭闸口了,服务端关闭,过段时间后,客户端关闭)。

滑动窗口协议:

发送方和接受方都会维护一个数据帧的序列,这个序列被称为窗口。发送发的窗口大小由接受方确认,目的是控制发送速度,以免接受方的缓存不够大导致溢出,同时控制流量也可以避免网络拥塞。

下面图中4、5、6号数据帧已经被发送出去,但是未收到关联的确认序号ACK,7、8、9帧则是等待发送。可以看出发送端的窗口大小为6,这是由接受端告知的。此时如果发送端收到4号ACK,则窗口的右边滑动。即数据帧10也可以被发送。

               

明白了Socket读写数据的底层原理,我们就很容易理解“阻塞模式”:对于读取Socket数据的过程而言,如果接受缓冲区为空,则调用Socket的read方法的线程会阻塞,直到有数据进入接受缓冲区;而对于写数据到Socket中的线程来说,如果待发送的数据长度大于发送缓冲区空余长度,则会阻塞在write方法上,等待发送缓冲区的报文被发送到网络上,然后继续发送下一段数据,循环上述过程直到数据都被写入到发送缓冲区为止。

TCP通信原理

首先,对于TCP通信来说,每个TCPSocket的内核中都有一个发送缓冲区和一个接受缓冲区,

TCP的全双工的工作模式及TCP的滑动窗口就是依赖于这两个独立的Buffer和Buffer的填充状态。

接受缓冲区把数据缓存到内核,若应用进程一直没有调用Socket的read方法进行读取,那么该数据会一直被缓存在接受缓冲区内。不管进程是否读取Socket,对方发来的数据都会经过内核接受并缓存到Socket的内核接受缓冲区。

read所要做的工作,就是把内核接受缓冲区中的数据复制到应用层用户的Buffer里。

进程调用Socket的send发送数据的时候,一般情况下是讲数据从应用层用户的Buffer里复制到Socket的内核发送缓冲区,然后send就会在上层返回,换句话说,send就会在上层返回。换句话说,send返回时,数据不一定发送到对方。

猜你喜欢

转载自blog.csdn.net/fangxinde/article/details/83832047