HOME
BLOG
TIME
FRIENDS
SAY TO ME
MOOD
TRAVELING
TCP_IP模型以及协议
2020/08/16 4.9k 17 分钟 点击

上一篇谈到OSI七层模型的标准规范,这一篇咱们说生活中用运到的TCP/IP模型。
首先,上图。

与OSI七层模型相比,TCP/IP模型只有仅仅四层,整个体系结构也变得相当灵活。我们一层一层来看:

  • 第四层 应用层
  • 应用层对应于OSI参考模型的高层,为用户提供所需要的各种服务,例如:FTP、Telnet、DNS、SMTP等.*
  • 第三层 传输层
    传输层对应于OSI参考模型的传输层,为应用层实体提供端到端的通信功能,保证了数据包的顺序传送及数据的完整性。该层定义了两个主要的协议:传输控制协议(TCP)和用户数据报协议(UDP).
    TCP协议提供的是一种可靠的、通过“三次握手”来连接的数据传输服务;而UDP协议提供的则是不保证可靠的(并不是不可靠)、无连接的数据传输服务.
  • 第二层 Internet层
    Internet层也可以叫网际互联层,对应于OSI参考模型的网络层,主要解决主机到主机的通信问题。它所包含的协议设计数据包在整个网络上的逻辑传输。注重重新赋予主机一个IP地址来完成对主机的寻址,它还负责数据包在多种网络中的路由。该层有三个主要协议:网际协议(IP)、互联网组管理协议(IGMP)和互联网控制报文协议(ICMP)。
    IP协议是网际互联层最重要的协议,它提供的是一个可靠、无连接的数据报传递服务。
  • 第一层 网络访问层
    网络访问层与OSI参考模型中的物理层和数据链路层相对应。它负责监视数据在主机和网络之间的交换。事实上,TCP/IP本身并未定义该层的协议,而由参与互连的各网络使用自己的物理层和数据链路层协议,然后与TCP/IP的网络接入层进行连接。地址解析协议(ARP)工作在此层,即OSI参考模型的数据链路层。

这样就清晰,对应TCP/IP模型来说最主要的就是就是搞清楚它每一层上的这些重要协议,下面我们从最高层开始说:

第四层:应用层
这一层的协议主要是一些应用程序定义的,比如FTP协议,用来邮件传输的POP3协议,我们浏览网页的HTTS协议,以及加密HTTPS,这里我们不多说。留在以后的服务器篇章来说吧

第三层:传输层
大名鼎鼎的TCP,UDP协议活动在这一层,让我们一步一步的看看它们之间的区别吧!


上图描述了TCP与UDP不同,首先名称不同,TCP:传输控制协议 UDP:用户数据报协议。我们经常这样描述它们,TCP是面向连接的可靠协议,UDP是非面向连接的不可靠协议。这句话便可以看出来它们的本质,对于重要的文件比如E-mail,文件的传输,文件下载我们就需要使用更加可靠的协议来保证不会出错,而对于我们平常的QQ,微信聊天,我们要保证即使,快速,这便需要使用UDP协议。那我们分别就从两者特性开始说吧!

TCP特性

  • 工作在传输层
  • 面向连接协议
  • 全双工协议
  • 半关闭
  • 错误检查
  • 将数据打包成段,排序
  • 确认机制
  • 数据恢复,重传
  • 流量控制,滑动窗口
  • 拥赛控制,慢启动和拥赛避免算法

这些特性我们来从TCP包报文首部就可以看出来

这便是TCP首部的格式,我们来分析他们的作用

  • 源端口和目的端口:它们各占 2 字节。端口是传输层与应用层的服务接口,这就是为什么底层数据可以轻轻松松知道它是来自于哪个应用软件的原因。
  • 序号:占 4 字节,TCP 连接中传送的数据流中的每一个字节都编上一个序号,序号字段的值则指的是本报文段所发送的数据的第一个字节的序号,总的来说就是一些大包(大于IP数据包的最大范围)需要分成小包来发送,这个编号便是为了接收段可以把分开的小包合成一个大包。
  • ==确认号:占 4 字节,是希望收到对方的下一个报文段的数据的第一个字节的序号(后面我们会具体来说)==
  • 数据偏移:占 4 位,它指出 TCP 报文段的数据起始处距离 TCP 报文段的起始处有多远,“数据偏移”的单位是 8个 字节为偏移单位
  • 保留:占 6 位,保留为今后使用,现在没有作用,但目前应置为 0
  • 紧急URG:当 URG=1 时,表明紧急指针字段(下文中的紧急指针)有效.它告诉系统此报文段中有紧急数据,应尽快传送(相当于高优先级的数据)
  • ==确认ACK:只有当 ACK=1 时确认号字段才有效.当 ACK=0 时,确认号无效==
  • PSH(PuSH):接收 TCP 收到 PSH = 1 的报文段,就尽快地交付接收应用进程,而不再等到整个缓存都填满了后再向上交付
  • RST (ReSeT):当 RST=1 时,表明 TCP 连接中出现严重差错(如由于主机崩溃或其他原因),必须释放连接,然后再重新建立运输连接
  • ==同步 SYN:同步 SYN = 1 表示这是一个连接请求或连接接受报文==
  • ==终止 FIN:用来释放一个连接.FIN=1 表明此报文段的发送端的数据已发送完毕,并要求释放运输连接==
  • 检验和:占 2 字节.检验和字段检验的范围包括首部和数据这两部分.在计算检验和时,要在 TCP 报文段的前面加上 12 字节的伪首部
  • 紧急指针:占 16 位,指出在本报文段中紧急数据共有多少个字节(紧急数据放在本报文段数据的最前面)
  • 选项:长度可变.TCP 最初只规定了一种选项,即最大报文段长度 MSS.MSS 告诉对方 TCP:“我的缓存所能接收的报文段的数据字段的最大长度是 MSS 个字节.” [MSS(Maximum Segment Size)是 TCP 报文段中的数据字段的最大长度.数据字段加上 TCP 首部才等于整个的 TCP 报文段]
  • 填充:这是为了使整个首部长度是 4 字节的整数倍
    文中标记部分是需要重点掌握的,因为它在TCP协议的“三次握手”连接方式中用到,那现在让我们看看最为重点的“三次握手”吧!

  • 我们一步一步来说,首先客户端如果想访问服务器,它便会向服务器发送一个数据包,其中就有刚刚我们说的TCP首部,我们来用一种拟人化的说法来说明这次连接吧!A想要链接,它发送的包裹中SYN为1,seq=x,这里这样理解,SYN的意思就是A去和B说,我要连接你,并且还给B带了序号为x的一个数据包,在发完之后,A的状态变为同步已发送(SYN-SENT)然后B收到了,他这个时候的状态变从监听状态(LISTEN)变为了同步收到(SYN-RCVD)状态,并且回复了A一句话,我收到你的话啦,我也要连接你,这时候ACK=1的意思便是收到的意思,并且给A带了序号为y的数据包(seq=y),还和A说,你的x数据包我已经收到啦,你下次给我发x+1(ack=x+1)数据包吧。A在收到以后,状态变为了建立连接状态(ESTAB-LISHED),并且回复B 我收到啦(ACK=1),我这次发的是x+1数据包,你下次给我发y+1数据包吧。在这个阶段,连接就已经建立好了,它们就可以进行快快乐乐的数据传输了。*

在三次握手之后,数据便开始传输,当数据传输完成呢?又该怎么办,其中这里在数据传输完成之后,双方都可以提出分手,我们把这也过程叫做”四次挥手”,下面我们来看看具体过程!


这里例子就举A先发出断开请求的情况,A和B说:我不想和你连接啦,我要断开(FIN=1),这里FIN=1就是提出断开请求的意思,谁先发这个,谁就是提出方,虽然要断开,但是A还是会给B发一个数据包(seq=u),不过在他发完之后,就把状态从连接状态(ESTAB-LISHED)变为终止等待1(FIN-WAIT-1)状态,他也不管B是不是同意,自己先变了状态,这里B在收到断开请求之后,状态会从连接状态(ESTAB-LISHED)变为等待关闭(CLOSE-WAIT)状态,并且回复A,我知道了(ACK=1),我这次发送的是v数据包(seq=v),你下次给我发u+1数据包(ack=u+1)吧,这里他没同意断开,只不过是和A说我知道了,就像男女分手一样,女的说了咱们分手吧,男的只说我知道了,但是还是死皮赖脸的不分,但是A的状态在收到这句话之后就变了,变为终止等待2(FIN-WAIT-2)状态,因为B的数据还没有传输完,它便继续进行单方面的数据传输,这便是开始提到的TCP特性(半关闭),在所以数据传输完之后,B也同意分手了,变向A说:我们分手吧(ACK=1),这是w数据包(seq=w),你下次给我发u+1数据包(ack=u+1)吧,这时B也同意了,但是A上次没有给他发u+1数据包,他便又和人家要了一次,A看到B也同意了,高兴的立马切换状态,变为时间等待(TIME-WAIT),并且和B说了最后一句话:你好自为之吧(ACK=1),这是u+1数据包(seq=u+1),但是又向B要了一个w+1(ack=w+1),但是B向你都这样了,还和我要?于是就没回复A。它们直接彻底结束了。
你知道为什么A在切换为时间等待(TIME-WAIT)状态的时候等了2MSL时间吗?MSL指的是一个数据包从一边到另一边需要的时间,他等两倍的MSL时间就是担心别有数据落下,没传过来。

这样看TCP协议是不是很严谨啊,所以他才能办到断点续传等操作。那下面我们就来看看UDP协议吧!

首先我们来看UDP协议的特性

UDP特性

  • 工作在传输层
  • 提供不可靠的网络访问
  • 非面向连接协议
  • 有限的错误检查
  • 传输性能高
  • 无数据恢复特效

文中提到的有限的错误检查是什么意思呢?别错误理解,他确实可以有一点点检查功能,但是他发现错了的话是一种什么状态呢?“好吧,错就错了”,就是这种状态,所以和没有一个样。虽然他不可靠,但是他快呀,这就是他可以被使用的原因了。
我们来看UDP协议包报文首部


他的内容很简单,
目标端口,源端口,数据包长度,还有一个校验和,简单的构造让他有了速度的优势,也能容纳更多数据。

第二层:Internet层
TCP与UDP协议已经说完啦,我们来到了第二层,网络层,他里面又有哪些协议呢?看图!


IP协议,ICMP协议,ARP,RARP协议映入眼帘
既然这么多,我们挨个来说!

IP协议
首先来看IP数据报首部各字段的作用

  • 版本:占4位,指IP协议的版本。通信双方使用的IP协议版本必须一致。就比如我们现在广泛使用的IP协议为IPv4。
  • 首部长度:占4位,可表示的最大十进制数值是15。
  • 区分服务:占8位,用来获得更好的服务。只有在使用区分服务时,这个字段才起作用。
  • 总长度:总长度指首部和数据之和的长度,单位为字节。总长度字段为16位,因此数据报的最大长度为2^16-1=65535字节。
  • 但是在IP层下面的每一种数据链路层都有自己的帧格式,其中包括帧格式中的数据字段的最大长度,这称为最大传送单元MTU(Maximum Transfer Unit)。当一个数据报封装成链路层的帧时,此数据报的总长度(即首部加上数据部分)一定不能超过下面的数据链路层的MTU值。*
  • 标识(identification):占16位。就是表示被切割开的小数据报的编号,如何才能合成大数据包,就靠这。
  • 标志(flag):占3位,但只有2位有意义。
    • 标志字段中的最低位记为MF(More Fragment)。MF=1即表示后面“还有分片”的数据报。MF=0表示这已是若干数据报片中的最后一个。
    • 标志字段中间的一位记为DF(Don’t Fragment),意思是“不能分片”。只有当DF=0时才允许分片。
  • 片偏移:占13位。片偏移指出:较长的分组在分片后,某片在原分组中的相对位置。也就是说,相对用户数据字段的起点,该片从何处开始。片偏移以8个字节为偏移单位。这就是说,除了最后一个分片,每个分片的长度一定是8字节(64位)的整数倍。
  • 生存时间:占8位,生存时间字段常用的的英文缩写是TTL(Time To Live),表明是数据报在网络中的寿命。每经过一个路由器时,就把TTL减去数据报在路由器消耗掉的一段时间。若数据报在路由器消耗的时间小于1秒,就把TTL值减1。当TTL值为0时,就丢弃这个数据报。
  • 协议:占8位,协议字段指出此数据报携带的数据是使用何种协议,以便使目的主机的IP层知道应将数据部分上交给哪个处理过程。
  • 首部检验和:占16位。这个字段只检验数据报的首部,但不包括数据部分。这是因为数据报每经过一个路由器,路由器都要重新计算一下首部检验和(一些字段,如生存时间、标志、片偏移等都可能发生变化)。不检验数据部分可减少计算的工作量。
  • 源地址:占32位。
  • 目的地址:占32位。
  • 这便是IP数据包首部所含有的重要内容。*

IP协议的特征:

  • 运行于OSI网络层
  • 面向无链接的协议
  • 独立处理数据包
  • 分层编码
  • 尽力而为的传输
  • 无数据恢复功能

*IP协议主要包含三方面内容:IP编址方案、分组封装格式及分组转发规则。 *

ICMP协议

ICMP(Internet Control Message Protocol)因特网控制报文协议。它是IPv4协议族中的一个子协议,用于IP主机、路由器之间传递控制消息。控制消息是在网络通不通、主机是否可达、路由是否可用等网络本身的消息。这些控制消息虽然不传输用户数据,但是对于用户数据的传递起着重要的作用。
如果我们觉得网络状况有问题,往往可以进行一个简单的测试,来验证网络是否畅通,但是IP协议并不提供可靠传输。如果丢包了,IP协议并不能通知传输层是否丢包以及丢包的原因。所以我们就需要一种协议来完成这样的功能–ICMP协议。
==ping命令和traceroute都是基于ICMP协议实现的==。

ARP协议

ARP是地址解析协议,他可以把IP地址解析成对于的主机MAC地址,从而进行通信,DNS是吧网址解析为IP,而ARP是吧IP解析为MAC地址,我们从两方面来讨论ARP协议的工作发方式

  • 局域网内
  • 在局域网内,计算机A想和计算机B通信,首先需要找到B计算机的MAC地址,这个时候,A计算机就会发出广播,去询问计算机B的MAC地址是什么,计算机B接收到广播之后便会把MAC地址发送给A,需要注意的是,在询问MAC地址时是广播模式,在回答的时候为单点模式。就是B只发给A。*
  • 不在一个局域网
  • 不在同一个局域网的通信,也是先由ARP协议来询问MAC地址,只不过他会在接收到IP地址的时候分析这个IP和本机IP是不是在同一个局域网内,如果是,直接广播,如果不是,他就要先去询问局域网网关的MAC地址,网关在收到之后,回复自己的MAC地址,计算机A在收到之后,把IP与MAC地址的对应关系写入ARP表中,紧接着又会把信息发给网关,网关看到目标地址不是本网段,就会把这条信息转发出去,为广播模式发送,在另一片局域网中计算机B收到了广播,回复网关MAC地址,只不过在转发的时候,目标IP与源IP没有变,而源MAC却变成了网关的MAC,网关再回复给计算机A,便完成了通讯。
    ARP是基于信任机制的,所以只要有人回答它的MAC提问,他就会选择相信,这也是许多黑客进行ARP欺骗的原因。*

第一层:网络访问层
以太网协议规定,接入网络的设备都必须安装网络适配器,即网卡,数据包必须是从一块网卡传送到另一块网卡。而网卡地址就是数据包的发送地址和接收地址,有了MAC地址以后,以太网采用广播形式,把数据包发给该子网内所有主机,子网内每台主机在接收到这个包以后,都会读取首部里的目标MAC地址,然后和自己的MAC地址进行对比,如果相同就做下一步处理,如果不同,就丢弃这个包。
所以链路层的主要工作就是对电信号进行分组并形成具有特定意义的数据帧,然后以广播的形式通过物理介质发送给接收方。

文中提到的网关,我们留在下一节来讨论,它是涉及到路由器的,如下图:

等下一篇,一起来讨论这至关重要的一环把。

网络与协议