TCP/IP网络协议

  在我们使用网络通信中,即使是一次看似很简单的数据传输,实际背后需要做的工作非常多。我们经常感叹网络的神奇,不管传输的是一段文字,一张图片,一部视频,也不管和我通信的对方相距多远,数据都能稳定且快速的送达给对方。如何打包处理大小不同的数据;如何去和对方建立连接;如何在不可靠的信道上提供可靠的数据传输?处理这里面繁杂的逻辑,是一个大问题。前辈们给出的解决办法是将大问题分割成若干个小问题,交由不同的层去解决。每一层相互独立,互不干扰,只关心自身的任务;处理结束之后将结果交由下一层继续处理,这就引出了网络分层概念。

OSI七层网络模型

OSI参考模型(OSI/RM)的全称是开放系统互连参考模型,它是由国际化标准化组织(ISO)提出的一个网络系统互联模型。
在这里插入图片描述由下往上:

  1. 物理层:规定了激活、维持、关闭通信端点之间的机械特性、电气特性、功能特性以及过程特性。该层为上层协议提供了一个传输数据的物理媒体。
  2. 数据链路层:在不可靠的物理介质上提供可靠的传输,该层的作用包括:物理地址寻址、数据成帧、流量控制、数据检错、重发等。
  3. 网络层:负责对子网间的数据包进行路由选择。还可以实现拥塞控制、逻辑寻址、网际互连等。
  4. 传输层:传输层是第一个端到端。即主机到主机的层次。传输层负责将上层数据分段并提供端到端的、可靠的或不可靠的传输。此外,传输层还要处理端到端的差错控制和流量控制等问题。
  5. 会话层管理主机之间的会话进程,即负责建立、管理、终止进程之间的会话。会话层还利用在数据中插入校验点来实现数据的同步。
  6. 表示层对上层数据或信息进行变换以保证一个主机应用层信息可以被另一个主机的应用程序理解。表示层的数据转换包括数据的加密、压缩、格式转换等。
  7. 应用层为操作系统或网络应用程序提供访问网络服务的接口,如电子邮件、文件传输和终端仿真,提供用户身份认证等

  可以看出,每一层都为其上一层提供服务、并为其上一层提供一个访问接口或界面。不同主机之间的相同层次称为对等层。如主机A中的表示层和主机B中的表示层互为对等层、主机A中的会话层和主机B中的会话层互为对等层等,对等层之间互相通信需要遵守一定的规则,如通信的内容、通信的方式,我们将其称为协议(Protocol)。我们将某个主机上运行的某种协议的集合称为协议栈。主机正是利用这个协议栈来接收和发送数据的。

而在我们的实际应用中,OSI网络分层却只是一个模型,真正实现应用化的网络分层标准是更简易化的TCP/IP协议(简易并不代表简单哦)

TCP/IP网络协议

在这里插入图片描述
  和ISO模型一样,TCP/IP协议也是由上往下,层层包装,下一层为上一层提供服务,最上面的应用层合并了OSI模型里的表示层和会话层,最下面的网络接口层合并了OSI模型里的数据链路层和物理层,其它层大体功能不变,形成了TCP/IP四层网络模型。
应用层:该层包括所有和应用程序协同工作,利用基础网络交换应用程序专用的数据的协议。 应用层是大多数普通与网络相关的程序为了通过网络与其他程序通信所使用的层。这个层的处理过程是应用特有的;数据从网络相关的程序以这种应用内部使用的格式进行传送,然后被编码成标准协议的格式。应用层的程序更多的是关心业务逻辑的处理,而不是数据在网络中的传输活动
一些特定的程序协议运行在应用层,常见的协议有:

HTTP(Hypertext Transfer Protocol,超文本传输协议),主要用于普通浏览。
FTP(File Transfer Protocol,文件传输协议),由名知义,用于文件传输。
SSH(Secure Shell,用于替代安全性差的TELNET),用于加密安全登陆用。
POP3(Post Office Protocol, version 3,邮局协议),收邮件用
SMTP(Simple Mail Transfer Protocol,简单邮件传输协议),用来发送电子邮件。
DHCP(Dynamic Host Configuration Protocol,动态主机配置协议),动态配置IP地址。
DNS(Domain Name Service,域名服务),用于完成地址查找,邮件转发等工作(运行在TCP和UDP协议上)。

传输层:和上文提到的一样,传输层负责将上层数据分段并提供端到端的、可靠的或不可靠的传输。此外,传输层还要处理端到端的差错控制和流量控制,确保数据完整、无损并且有序到达,传输层最主要的协议就是大名鼎鼎的面向连接的TCP传输控制协议和无连接的包传输的UDP用户数据报文协议,每一个应用层协议一般都会使用到两个传输层协议之一。

TCPUDP处在同一层—运输层,但是TCP和UDP最不同的地方是,TCP提供了一种可靠的数据传输服务,TCP是面向连接的,也就是说,利用TCP通信的两台主机首先要经历一个“拨打电话”的过程,等到通信准备结束才开始传输数据,最后结束通话。所以TCP要比UDP可靠的多,UDP是把数据直接发出去,而不管对方是不是在收信,就算是UDP无法送达,也不会产生ICMP差错报文。TCP尽量连续不断地测试网络的负载并且控制发送数据的速度以避免网络过载。另外, 应用数据被分割成TCP认为最适合发送的数据块,UDP却对应用程序产生的 数据报长度将保持不变。TCP还试图将数据按照规定的顺序发送。

思考所谓的可靠传输的“可靠”到底是指什么?
最开始我简单的把这个可靠性理解为:UDP通信有一定的概率失败,TCP通信是肯定会成功的。这是一个错误非常明显的理解,非常容易举出反例:如果你的电脑是脱机状态,那么无论选择什么样的网络协议你都无法和外界进行通信

我们来看一下TCP传输的工作流程:

  1. 当TCP发出一个报文段后,它启动一个定时器,等待目的端确认收到这个报文段。如果不能 及时收到一个确认,将重发这个报文段。
  2. 当TCP收到发自TCP连接另一端的数据,它将发送一个确认。这个确认不是立即发送,通常将推迟几分之一秒。
  3. TCP将保持它首部和数据的检验和。这是一个端到端的检验和,目的是检测数据在传输 过程中的任何变化。如果收到报文段的检验和有差错, TCP将丢弃这个报文段和不确认收到此报文段(希望发送端超时并重发)。

从上面的流程可以看出,TCP中保持可靠性的方式就是超时重发,这是有道理的,虽然TCP也可以用各种各样的ICMP报文来处理这些,但是这也不是可靠的,最可靠的方式就是只要不得到确认,就重新发送数据报,直到得到对方的确认为止。**即每一条消息发送成功以后都会返回一条Ack来告知发送方已送达。简洁来说就是:能够明确告知发送方发送结果,能够自主应对大部分数据传输过程中出现的问题,包括但不限于丢包,乱序等等。
**

  为了解决在不可靠的信道上完成可靠传输这样一个问题,那么我们必须要在双方传输数据之前,就某些问题达成一致。这里我们就不得不说一下连接机制中著名的三次握手和四次挥手……

三次握手
在这里插入图片描述
在TCP/IP协议中,TCP协议提供可靠的连接服务,采用三次握手建立一个连接。第一次握手:建立连接时,客户端发送syn包(syn=x)到服务器,并进入SYN_SEND状态,等待服务器确认。第二次握手:服务器收到syn包,必须确认客户的SYN(ack=x+1),同时自己也发送一个SYN包(syn=y),即SYN+ACK包,此时服务器进入SYN_RECV状态。第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=y+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。完成三次握手,客户端与服务器开始传送数据简版:首先A向B发SYN(同步请求),然后B回复SYN+ACK(同步请求应答),最后A回复ACK确认,这样TCP的一次连接(三次握手)的过程就建立了。

说简单了,更形象的表示就如下图:
在这里插入图片描述
好了说清楚了三次握手的过程,现在我们思考为什么要进行三次握手,如果只进行两次握手会怎么?

如果没有第三次握手,可能会出现如下情况:如果只有两次握手,那么server收到了client的SYN=1的请求连接数据包之后,便会分配资源并且向client发送一个确认位ACK回复数据包。那么,如果在client与server建立连接的过程中,由于网络不顺畅等原因造成的通信链路中存在着残留数据包,即client向server发送的请求建立连接的数据包由于数据链路的拥塞或者质量不佳导致该连接请求数据包仍然在网络的链路中,这些残留数据包会造成如下危害危害:当client与server建立连接,数据发送完毕并且关闭TCP连接之后,如果链路中的残留数据包才到达server,那么server就会认为client重新发送了一次连接申请,便会回复ACK包并且分配资源。并且一直等待client发送数据,这就会造成server的资源浪费。

第三次握手失败了怎么办?

当client与server的第三次握手失败了之后,即client发送至server的确认建立连接报文段未能到达server,server在等待client回复ACK的过程中超时了,那么server会向client发送一个RTS报文段并进入关闭状态,即:并不等待client第三次握手的ACK包重传,直接关闭连接请求,这主要是为了防止泛洪攻击,即坏人伪造许多IP向server发送连接请求,从而将server的未连接队列塞满,浪费server的资源。

四次挥手
在这里插入图片描述
TCP连接的释放一共需要四步,因此称为『四次挥手』.我们知道,TCP连接是双向的,因此在四次挥手中,前两次挥手用于断开一个方向的连接,后两次挥手用于断开另一方向的连接。

  • 第一次挥手:若A认为数据发送完成,则它需要向B发送连接释放请求.该请求只有报文头,头中携带的主要参数为:FIN=1,seq=u.此时,A将进入FIN-WAIT-1状态。1,FIN=1表示该报文段是一个连接释放请求.seq=u,u-1是A向B发送的最后一个字节的序号。

  • 第二次挥手:B收到连接释放请求后,会通知相应的应用程序,告诉它A向B这个方向的连接已经释放.此时B进入CLOSE-WAIT状态,并向A发送连接释放的应答,其报文头包含:ACK=1,seq=v,ack=u+1。
    ACK=1:除TCP连接请求报文段以外,TCP通信过程中所有数据报的ACK都为1,表示应答。
    seq=v,v-1是B向A发送的最后一个字节的序号。
    ack=u+1表示希望收到从第u+1个字节开始的报文段,并且已经成功接收了前u个字节.A收到该应答,进入FIN-WAIT-2状态,等待B发送连接释放请求。
    第二次挥手完成后,A到B方向的连接已经释放,B不会再接收数据,A也不会再发送数据。但B到A方向的连接仍然存在,B可以继续向A发送数据。

  • 第三次挥手:当B向A发完所有数据后,向A发送连接释放请求,请求头中包含:
    FIN=1,ACK=1,seq=w,ack=u+1.随后B进入LAST-ACK状态.

  • 第四次挥手:A收到释放请求后,向B发送确认应答,此时A进入TIME-WAIT状态.该状态会持续2MSL时间,若该时间段内没有B的重发请求的话,就进入CLOSED状态,撤销TCB.当B收到确认应答后,也便进入CLOSED状态,撤销TCB。

思考:为什么连接的时候是三次握手,而关闭的时候是四次挥手

因为当Server端收到Client端的SYN连接请求报文后,可以直接发送SYN+ACK报文。其中ACK报文是用来应答的,SYN报文是用来同步的。但是关闭连接时,当Server端收到FIN报文时,很可能并不会立即关闭SOCKET,所以只能先回复一个ACK报文,告诉Client端,”你发的FIN报文我收到了”。只有等到我Server端所有的报文都发送完了,我才能发送FIN报文,因此不能一起发送。故需要四步握手。
即MSL(MaximumSegment Lifetime),TCP允许不同的实现可以设置不同的MSL值。第一,保证客户端发送的最后一个ACK报文能够到达服务器,因为这个ACK报文可能丢失,站在服务器的角度看来,我已经发送了FIN+ACK报文请求断开了,客户端还没有给我回应,应该是我发送的请求断开报文它没有收到,于是服务器又会重新发送一次,而客户端就能在这个2MSL时间段内收到这个重传的报文,接着给出回应报文,并且会重启2MSL计时器。第二,防止类似与“三次握手”中提到了的“已经失效的连接请求报文段”出现在本连接中。客户端发送完最后一个确认报文后,在这个2MSL时间中,就可以使本连接持续的时间内所产生的所有报文段都从网络中消失。这样新的连接中不会出现旧连接的请求报文。

思考:为什么TIME_WAIT状态需要经过2MSL(最大报文段生存时间)才能返回到CLOSE状态?

MSL(MaximumSegment Lifetime),TCP允许不同的实现可以设置不同的MSL值。第一,保证客户端发送的最后一个ACK报文能够到达服务器,因为这个ACK报文可能丢失,站在服务器的角度看来,我已经发送了FIN+ACK报文请求断开了,客户端还没有给我回应,应该是我发送的请求断开报文它没有收到,于是服务器又会重新发送一次,而客户端就能在这个2MSL时间段内收到这个重传的报文,接着给出回应报文,并且会重启2MSL计时器。第二,防止类似与“三次握手”中提到了的“已经失效的连接请求报文段”出现在本连接中。客户端发送完最后一个确认报文后,在这个2MSL时间中,就可以使本连接持续的时间内所产生的所有报文段都从网络中消失。这样新的连接中不会出现旧连接的请求报文。

网络互连层
网络层解决在一个单一网络上传输数据包的问题。类似的协议有X.25和ARPANET的Host/IMP Protocol。 随着因特网思想的出现,在这个层上添加附加的功能,也就是将数据从源网络传输到目的网络。这就牵涉到在网络组成的网上选择路径将数据包传输,也就是因特网。 在因特网协议组中,IP完成数据从源发送到目的的基本任务。

网络接口层
网络接口层实际上并不是因特网协议组中的一部分,但是它是数据包从一个设备的网络层传输到另外一个设备的网络层的方法。这个过程能够在网卡的软件驱动程序中控制,也可以在韧体或者专用芯片中控制。这将完成如添加报头准备发送、通过实体媒介实际发送这样一些数据链路功能。

————————————————
特别声明:本文少部分内容参考以下连接:

http://www.yunweipai.com/category/tiku

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值