网络协议:TCP/IP

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状态(客户端说我知道了,你可以关闭闸口了,服务端关闭,过段时间后,若客户端没有接受到服务端的响应,客户端也关闭)。

滑动窗口协议:

概念

滑动窗口是两台主机间传送数据时的缓冲区。每台TCP /IP 主机支持两个滑动窗口,一个用于接收数据, 另一个用于发送数据。窗口尺寸表示计算机可能缓冲的数据量大小。

工作原理

1. 滑动窗口工作过程

  TCP 协议通过采用滑动窗口的方式控制数据流的传输。在传输层中, 数据按照一定的格式打成大小相同的包。每一个滑动窗口中包含一定数目的数据包, 滑动窗口的大小可以进行调整。

        每台网络上的主机维护一个发送窗口和一个接收窗口。发送方一次可发送相当于滑动窗口大小的数据包, 并在每个数据包前添加包头信息, 然后等待接收方返回确认信息。由于TCP 是面向连接的协议, 可以保证数据传输的完整性和准确性, 当传输过程中发生丢包时, 接收方会要求发送方从断点处重传数据。当TCP 从应用层中接收到数据时, TCP 将一个带序列号的报头加入数据包并将其交给IP, 由IP 将它发送到目标主机。当每一个数据包传送时, 源主机设置重发计时器, 描述在重新发送数据包前将等待ACK 的时间。在一般情况下, 当第一次发送失败后, 重发计时器的重试时间将设置为前一次的两倍。在发送窗口中有每一个数据包的备份, 直到收到ACK。当数据包到达目的主机接收窗口, 它们按照序列号放置。当目的主机接收到连续的数据段时, 就向源主机发送一个关于数据的认可( ACK) 的应答报文, 其中带有当前窗口尺寸。一旦源主机接收到数据包并认可, 发送窗口将进行滑动。如果在重发计时器设定的时间内, 源主机没有接收到对现存数据的认可, 数据将重新传送。重发数据包将加重网络和源主机的负担。下面通过应用实例来了解其作用吧。

滑动窗口应用实例

  “ 三次握手”的例子描述了一个典型的TCP 传输过程。TCP 可使用称为滑动窗口的方法获得更好的TCP 传输性能。在TCP“ 三次握手”的过程中, 两台主机交换传输窗口大小, 接收主机把它的接收窗口大小设置成和发送主机的传输窗口大小一致。窗口大小表明任何一次所能传输段的最大个数。窗口大小是通过TCP 协议的格式中“ 窗口”字段, 在传输给目标主机的每一个报文中给出的。发送主机通过创建一个发送窗口, 以设置它的最大传输规模。例如, 如果发送主机设置发送窗口的大小是6, 如下图1所示,

  这意味着发送主机一次最多可连续发送6 个数据段, 此时必须得到目标主机确认后, 才能继续发送后续的数据段。

 ( 1) 第一次连续发送6 个数据段后( 即1 至6 段) , 发送主机必须等待接收主机的确认。

  假如接收主机只收到段1, 2 和5, 则接收主机发回包含有序列号为3 的段进行确认, 确认的是1 和2 段。此时, 发送主机的滑动窗口向右滑过两个确认的段, 7 和8 段出现在滑动窗口中。如图2 所示。

( 2 ) 发送主机又连续发送6 个数据段( 即3 至8 段) 。假定这6 段均被正确收到, 接收

  主机发回包含有序列号为9 的段进行确认, 即表示9 段前的数据段均已正确收到, 期待第9段的发送。此时, 发送主机的滑动窗口向右滑过6 个确认的段, 9 至14 段出现在滑动窗口中, 如图3 所示。

 

通过上例可以看出, 借助于滑动窗口能够提高TCP 数据的传输性能。因为TCP 无须对每一数据段进行确认, 只需要对发送一个窗口宽度的段确认一次。

  小结

  滑动窗口的大小对网络性能有很大的影响。如果滑动窗口过小, 则需要在网络上频繁的传输确认信息, 占用了大量的网络带宽; 如果滑动窗口过大, 对于利用率较高、容易产生丢包现象的网络, 则需要多次发送重复的数据, 这同样耗费了网络带宽。

  决定滑动窗口大小的因素, 包括网络的带宽、可靠性以及需要传输的数据量。

       明白了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返回时,数据不一定发送到对方。

 

 

 

 

 

 

 

 

 

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值