TCP/IP模型

478 阅读15分钟

历史

研发初期

1983年1月1日,在因特网的前身(ARPA网)中,TCP/IP取代旧的网络控制协议(NCP,Network Control Protocol),从而成为今天的互联网的基石。最早的TCP/IP由文顿·瑟夫和罗伯特·卡恩两位开发,慢慢地通过竞争战胜其他一些网络协议的方案,比如国际标准化组织ISO的OSI模型。TCP/IP的蓬勃发展发生在1990年代中期。当时一些重要而可靠的工具的出世,例如页面描述语言HTML和浏览器Mosaic,促成了互联网应用的飞速发展。 随着互联网的发展,目前流行的IPv4协议(网际协议版本四)已经接近它的功能上限。IPv4最致命的两个缺陷在于:

  • 地址只有32位,IP地址空间有限;
  • 不支持服务质量(Quality of Service,QoS)的想法,无法管理带宽和优先级,故而不能很好的支持现今越来越多实时的语音和视频应用。因此IPv6(网际协议版本六)浮出水面,用以取代IPv4。

TCP/IP成功的另一个因素在于对为数众多的低层协议的支持。这些低层协议对应OSI模型中的第一层(物理层)和第二层(数据链路层)。每层的所有协议几乎都有一半数量支持TCP/IP,例如:以太网(Ethernet)、令牌环(Token Ring)、光纤数据分布接口(FDDI)、点对点协议(PPP)、X.25、帧中继(Frame Relay)、ATM、Sonet、SDH等。

研发背景

最初想到让不同电脑之间实现连接的,是美国加州大学洛杉矶分校网络工作小组的S.克罗克。1970年,克罗克及其小组着手制定最初的主机对主机通信协议,它被称为网络控制协议(Network Control Protocol,缩写NCP)。该协议被用于阿帕网,并在局部网络条件下运行稳定,但随着阿帕网用户的增多,NCP逐渐暴露出两大缺陷:

  • NCP只是一台主机对另一台主机的通讯协议,并未给网络中的每台电脑设置唯一的地址,结果就造成电脑在越来越庞大的网络中难以准确定位需要传输数据的对象。
  • NCP缺乏纠错功能,这样一来,数据在传输过程中一旦出现错误,网络就可能停止运行。出错电脑增多,使得网络运行效率大打折扣。

开发过程

在构建阿帕网先驱之后,DARPA开始其他数据传输技术的研究。NCP诞生后两年,1972年,罗伯特·卡恩(Robert E. Kahn)被DARPA的信息技术处理办公室雇佣,在那里他研究卫星数据包网络和地面无线数据包网络,并且意识到能够在它们之间沟通的价值。在1973年春天,已有的ARPANET网络控制程序(NCP)协议的开发者文顿·瑟夫(Vinton Cerf)加入到卡恩为ARPANET设计下一代协议而开发开放互连模型的工作中。到了1973年夏天,卡恩和瑟夫很快开发出一个基本的改进形式,其中的网络协议之间的差异通过使用一个公用互联网协议而隐藏起来,且可靠性由主机保证而不是ARPANET那样由网络保证。瑟夫称赞了Hubert Zimmerman和Louis Pouzin(CYCLADES网络的设计者)在这个设计上发挥重要影响。

由于网络的作用减少到最小的程度,更有可能将任何网络连接到一起,而不用管它们不同的特点,这样能解决卡恩最初的问题。一个流行的说法提到瑟夫和卡恩工作的最终产品TCP/IP将在运行“两个罐子和一根弦”上,实际上它已经用在信鸽上。一个称为网关(后来改为路由器以免与网关混淆)的计算机为每个网络提供一个接口并且在它们之间来回传输数据包。这个设计思想更细的形式由瑟夫在斯坦福的网络研究组的1973年–1974年期间开发出来。处于同一时期诞生PARC通用包协议组的施乐PARC早期网络研究工作也有着重要的技术影响;人们在两者之间摇摆不定。DARPA于是与BBN、斯坦福和伦敦大学签署协议开发不同硬件平台上协议的运行版本。有四个版本被开发出来——TCP v1、TCP v2、在1978年春天分成TCP v3和IP v3的版本,后来就是稳定的TCP/IP v4——目前因特网仍然使用的标准协议。

1975年,两个网络之间的TCP/IP通信在斯坦福和伦敦大学(UCL)之间进行测试。1977年11月,三个网络之间的TCP/IP测试在美国、英国和挪威之间进行。在1978年到1983年间,其他一些TCP/IP原型在多个研究中心之间开发出来。ARPANET完全转换到TCP/IP在1983年1月1日发生。1984年,美国国防部将TCP/IP作为所有计算机网络的标准。1985年,因特网架构理事会举行一个三天有250家厂商代表参加的关于计算产业使用TCP/IP的工作会议,帮助协议的推广并且引领它日渐增长的商业应用。

OSI七层网络模型

OSI 七层网络模型

  • 应用层(Application) :提供网络与用户应用软件之间的接口服务,例如HTTP、SMTP、SNMP、FTP、Telnet、SIP、SSH、NFS、RTSP、XMPP、Whois、ENRP

  • 表示层(Presentation) :提供格式化的表示和转换数据服务,如XDR、ASN.1、SMB、AFP、NCP

  • 会话层(Session) 提供包括访问验证和会话管理在内的建立和维护应用之间通信的机制,例如ASAP、SSH、ISO 8327 / CCITT X.225、RPC、NetBIOS、ASP、IGMP、Winsock、BSD sockets

  • 传输层(Transimission):提供建立、维护和取消传输连接功能,负责可靠地传输数据(PC),例如TCP、UDP、TLS、RTP、SCTP、SPX、ATP、IL

  • 网络层(Network): 处理网络间路由,确保数据及时传送(路由器),例如IP、ICMP、IPX、BGP、OSPF、RIP、IGRP、EIGRP、ARP、RARP、X.25

  • 数据链路层(DataLink): 负责无错传输数据,确认帧、发错重传等(交换机),例如以太网、令牌环、HDLC、帧中继、ISDN、ATM、IEEE 802.11、FDDI、PPP

  • 物理层(Physics) :提供机械、电气、功能和过程特性例如线路、无线电、光纤

TCP/IP协议

通常人们认为OSI模型的最上面三层(应用层,表示层和会话层)在TCP/IP组中是一个应用层。由于TCP/IP有一个相对较弱的会话层,由TCP和RTP下的打开和关闭连接组成,并且在TCP和UDP下的各种应用提供不同的端口号,这些功能能够被单个的应用程序(或者那些应用程序所使用的库)增加。与此相似的是,IP是按照讲它下面的网络当做一个黑盒子的思想设计的,这样在讨论TCP/IP的时候就可以把它当做一个独立的层。

1)应用层

该层包括所有和应用程序系统工作,利用基础网络交换应用程序专用的数据的协议。应用层是大多数普通与网络相关的程序为了通过网络其他程序通信所使用的层。这个层的处理过程是应用特有的,数据从网络相关的程序以这种应用内部使用的格式进行传送,然后被编码成标准协议的格式。

2)传输层

传输层的协议,能够解决诸如端到端可靠性和保证数据按照正确的顺序到达这样的问题。在TCP/IP协议族中,传输协议也包括所给数据应该送给哪个应用程序。

TCP(IP协议6)是一个可靠的,面向连结的传输机制,它提供一种可靠的字节流保证数据完整、无损并且按顺序到达。TCP 尽量连续不断地测试网络的负载并且控制发送数据的速度以避免网络过载。

1.TCP的功能

TCP 主要是将数据进行分段打包传输,对每个数据包编号控制顺序,运输中丢失、重发和丢弃处理

2.TCP头的介绍

  • Source Port & Destination Port - 源端口号和目标端口号;计算机通过端口号识别访问哪个服务,比如http服务或ftp服务;发送方端口号是进行随机端口;目标端口号决定了接收方哪个程序来接收。

  • Sequence number - 32位序列号,TCP用序列号对数据包进行标记,以便在到达目的地后重新重装。在建立连接时通常由计算机生成一个随机数作为序列号的初始值。

  • Acknowledgment number - 32位确认号,确认应答号。发送端接收到这个确认应答后,可以认为这个位置以前所有的数据都已被正常接收。

  • Header Length - 首部长度。单位是 '4'个'字节',如果没有可选字段,那么这里的值就是 5。表示 TCP 首部的长度为 20 字节。

  • checksum - 16位校验和。用来做差错控制,TCP校验和的计算包括TCP首部、数据和其它填充字节。

  • flags - 控制位(UGA,ACK,PSH,PST,SYS,FIN)。TCP的连接、传输和断开都受这六个控制位的指挥。

    • URG (urgent紧急) — 紧急标志位,表示的是此报文段中有紧急数据,将紧急数据排在普通数据的前面;当接受端收到此报文后后必须先处理紧急数据,而后再处理普通数据。 通常用来暂时中断通信
    • ACK (acknowledgement确认) — 置1时表示确认号合法,为0表示数据段不包含确认信息,确认号被忽略
    • PSH (push推送) — 置1时请求的报文在接收方收到时,会尽快交付接收应用进程,而不在等到整个缓存区都填满后再交付给应用进程
    • RST (reset重置) — 置1时重新连接,表示出现错误,需要释放连接,再重新建立连接
    • SYN (synchronous同步) — 置1时连接请求或同意报文,当SYN=1而ACK=0时,表明这是一个连接请求报文段。对方若同意建立连接,则应在响应的报文段中使SYN=1和ACK=1
    • FIN (FINis终止) — 释放连接,提出断开连接的一方将FIN置为1表示断开连接
  • window size - 本地可接收数据的数目,这个值的大小是可变的。当网络通畅时将这个窗口值变大加快传输速度,当网络不稳定时减少这个值可以保证网络数据的可靠传输。它是来在TCP传输中进行流量控制的

3.不得不提的三次握手,四次挥手

  • TCP是面向连接的协议,它在源点和终点之间建立虚拟连接,而不是物理连接
  • 在数据通信之前,发送端与接收端要先建立连接,等数据发送结束后,双方再断开连接
  • TCP连接的每一方都是由一个IP地址和一个端口组成

TCP有6种标示:SYN(synchronous建立联机) ACK(acknowledgement 确认) PSH(push传送) FIN(finish结束) RST(reset重置) URG(urgent紧急)Sequence number(顺序号码) Acknowledge number(确认号码)

  • 三次握手
    • 第一次握手,首先建立连接,客户端连接服务器端,发送32位序列号 seq= x,并且把 SYN 置1,
    • 第二次握手,服务端监听客户端发送的序列号,接收成功后,向客户端发送32位确认响应 swq=y 和ack= x+1,并将 SYN、ACK置1
    • 第三次握手,客户端接收以后,说明服务端接收成功,然后再返回 ack = y+1,表示客户端已经接收成功可以开始连接

用大白话来讲,就是客户端向服务端发送数据(第一次握手);服务端收到后会告诉客户端收到了消息(第二次握手),客户端收到服务端的响应后,已经确定了自己向服务端的发送数据是正常的;但是此时服务端的还不知道自己的发送数据是否正常,需要客户端给服务端回复(第三次握手),这就是为什么需要三次握手的原因了。

  • 四次挥手
    • 第一次挥手:客户端向服务器发送一个FIN报文段,将设置seq为x+2和ack为y+1,;此时,客户端进入 FIN_WAIT_1状态,这表示客户端没有数据要发送服务器了,请求关闭连接;

    • 第二次挥手:服务器收到了客户端发送的FIN报文段,向客户端回一个ACK报文段,ack设置为1,seq设置为x+3;服务器进入了CLOSE_WAIT状态,客户端收到服务器返回的ACK报文后,进入FIN_WAIT_2状态;

    • 第三次挥手:服务器会观察自己是否还有数据没有发送给客户端,如果有,先把数据发送给客户端,再发送FIN报文;如果没有,那么服务器直接发送FIN报文给客户端。请求关闭连接,同时服务器进入LAST_ACK状态;

    • 第四次挥手:客户端收到服务器发送的FIN报文段,向服务器发送ACK报文段,将seq设置为y+1,将ack设置为y+2,然后客户端进入TIME_WAIT状态;服务器收到客户端的ACK报文段以后,就关闭连接;此时,客户端等待2MS后依然没有收到回复,则证明Server端已正常关闭,客户端也可以关闭连接了。

继续大白话讲讲四次挥手的梗,为什么握手需要三次,断开却需要四次?客户端向服务端发送断开连接的消息(第一次挥手),服务端收到后向客户端发送响应信息表示已经收到(第二次挥手),注意:此时服务端不会立刻关闭,此时的服务端可能还有一些数据没发送完,需要把这些未发送完的数据发送完毕,数据发送完毕同时会向客服端发请求关闭的消息(第三次挥手),客户端收到服务器的消息后,会返回给客户端确认关闭的消息(第四次挥手),服务器收到消息后会确定关闭服务。

3)网络互连层

TCP/IP协议族中的网络互连层(internet layer)在OSI模型中叫做网络层(network layer)。

正如最初所定义的,网络层解决在一个单一网络上传输数据包的问题。随着因特网思想的出现,在这个层上添加附加的功能,也就是将数据从源网络传输到目的网络。这就牵涉到在网络组成的网上选择路径将数据包传输,也就是因特网。 在因特网协议组中,IP完成数据从源发送到目的的基本任务。IP能够承载多种不同的高层协议的数据;这些协议使用一个唯一的IP协议号进行标识。ICMP和IGMP分别是1和2。 一些IP承载的协议,如ICMP(用来发送关于IP发送的诊断信息)和IGMP(用来管理多播数据),它们位于IP层之上但是完成网络层的功能,这表明因特网和OSI模型之间的不兼容性。所有的路由协议,如BGP、OSPF、和RIP实际上也是网络层的一部分,尽管它们似乎应该属于更高的协议栈。

4)网络接口层

网络接口层实际上并不是因特网协议组成的一部分,但是它是数据包从一个设备的网络层传输到另外一个设备的网络层的方法。这个过程能够在网卡的软件驱动程序中控制,也可以在专用芯片中控制。这将完成如添加报头准备发送,通过实体媒介发送数据的功能。另一端,链路层将完成数据帧接收、去除报头并且将接收到的包传到网络层。然而,链路层并不经常这样简单。它也可能是一个虚拟专有网络(VPN)或者隧道,在这里从网络层来的包使用隧道协议和其他(或者同样的)协议组发送而不是发送到实体的接口上。VPN和隧道通常预先建好,并且它们有一些直接发送到实体接口所没有的特殊特点(例如,它可以加密经过它的数据)。由于现在链路“层”是一个完整的网络,这种协议组的递归使用可能引起混淆。但是它是一个实现常见复杂功能的一个优秀方法。(尽管需要注意预防一个已经封装并且经隧道发送下去的数据包进行再次地封装和发送)。

http报文通过tcp发送的举例

参考文献