TCP/IP协议蔟分为4层结构,分别是应用层、传输层、网络层和数据链路层,每一层都由特定的协议与对方进行通信,在进行数据通信时,发送端的数据从应用层往数据链路层方向流动,接收端的数据从数据链路层往应用层流动。
数据链路层
数据链路层的主要工作是对电信号进行分组并形成具有特定意义的数据帧,然后以广播的形式通过物流介质发送给接受方,数据链路层处理数据的协议是以太网协议,它将传输的数据分组封装成数据帧,每个数据帧由首部、数据和尾部三部分组成,首部包含目标MAC地址、源MAC地址和类型,尾部为数据帧校验序列,用于确定数据包在传输过程中是否损坏。数据传输采用广播形式,把数据包发送给该子网内的所有主机,子网内每台主机接收到这个包以后,都会读取首部里的目标MAC地址,然后和自己的MAC地址进行比对,如果相同则进行下一步处理,如果不同,则丢弃这个包。
网络层
对于上面的过程,有几个细节值得我们思考:
- 发送者如何知道接受者的MAC地址?
- 发送者如何知道接受者和自己同属一个子网?
- 如果接受者和自己不在同一个子网,数据包如何发送给对方?
网络层有如下几个协议:
IP协议:MAC地址只与厂商有关,与所处的网络无关,所以无法通过MAC地址来判断两台主机是否属于同一个子网,因此,网络层引入IP协议,制定了一套新地址,用于区分两台主机是否同属于一个网络,这套地址就是网络地址-IP地址。
ARP协议:地址解析协议,根据IP地址获取MAC地址。ARP首先发起一个请求数据包,数据包的首部包含了目标主机的IP地址,数据包在链路层被封装成数据帧并在子网内广播,每一台主机都会接受到这个数据包,并取出目标IP地址,并与自己的IP地址进行比较,如果相同就返回自己的MAC地址,ARP接收返回消息,以此确定目标机的MAC地址,与此同时,ARP还会将返回的MAC地址与对应的IP地址存入本机ARP缓存并保留一段时间。
路由协议:通过ARP协议的工作原理可以发现,ARP的MAC寻址还是局限在同一个子网中,因此网络层引入路由协议,首先通过IP协议判断两台主机是否在同一个子网中,如果在,通过ARP协议查询对应的MAC地址,然后以广播形式向该子网内的主机发送数据包,如果不在,以太网会将数据包转发给本子网的网关进行路由,网关是子网与子网间的桥梁,经过网关的多次转发,最终将数据包转发到目标IP所在的子网,然后再通过ARP协议获取MAC地址。完成这个路由协议的设备就是路由器。
在网络层被包装的数据包就叫IP数据包,IP数据包由首部和数据两部分组成,首部包含目标IP地址和源IP地址,网络层的主要工作是定义网络地址,区分网段,子网内MAC寻址,对不同子网的数据进行路由。
传输层
链路层定义了MAC地址,网络层定义了IP地址,有了这两个地址,数据就能从一个主机发送到另一个主机,但是数据实际上是从一个主机上的某个应用程序发出,当数据包被接收后,也无法确定哪个应用程序要接收这个数据包。
因此传输层引入UDP协议来解决这个问题,UDP定义了端口号,同一个主机的每一个应用程序都需要指定唯一的端口号,并且在传输数据时在数据上加上端口信息,UDP定义的数据包叫做UDP数据包。UDP数据包由首部和数据两部分组成,首部包括源端口和目标端口。
UDP协议比较简单,实现容易,但是没有确认机制,可靠性较差,为了解决这个问题,TCP协议就被引入,TCP协议是一种面向连接的、可靠地、基于字节流的通信协议。TCP协议每发出一个数据包都要求确认,如果数据包丢失,收不到确认信息,发送发就必须重发这个数据包。
TCP协议
TCP为了保证传输的可靠性,在正式收发数据前,必须和对方建立可靠的连接。由此才有TCP的三次握手机制。下面是TCP三次握手过程中使用到的几个名词:
- 序列号seq:是TCP报文段的第一个字节的数据编号,其中第一个TCP报文段的第一个字节编号由本地随机产生。
- 确认号ack:期待收到对方下一个报文段的序列号,因此确认号为序列号+1。
- 确认ACK:ACK=1表示确认号字段有效,ACK=0确认号无效。
- 同步SYN:SYN这个标志在TCP建立连接时才会被置为1,握手完成被置为0。
- 终止FIN:FIN=1表示发送数据已发送完毕,要求释放连接。
主机A向主机B请求建立TCP连接,其TCP的三次握手过程如下:
- 主机A向主机B发送TCP连接请求数据包,SYN=1,seq=x。
- 主机B向主机A发送连接确认数据包,SYN=1,ACK=1,seq=y,ack=x+1。
- 主机A向主机B发送再次确认数据包,ACK=1,seq=x+1,ack=y+1。
主机A主机B的TCP链接断开,其TCP的四次挥手过程如下:
由于TCP连接时双全工的(即数据可以在两个方向上同时传递),所以进行关闭时每个方向都要单独进行关闭,这个单方向的关闭就叫半关闭,当一方完成它的数据发送任务,就发送一个FIN来向另一方通告将要终止这个方向的连接。
- A确认发送完数据后,想要关闭连接,发送FIN给B。
- B收到A发送的FIN,发送ACK回复。
- 但这时B可能还在发送数据,所以没有想要关闭连接的意思,所以FIN和ACK不是同时发送的,等B数据发送完毕后,才会发送ACK=1,FIN=1。
- A收到B发来的FIN,回复ACK=1,A等待2MSL以后,没有收到B传来的任何消息,知道B已经收到自己的确认消息ACK,A就关闭链接。
在A发送最后的ACK回复时,该ACK可能丢失,B如果没有收到ACK,将不断重复发送FIN片段,所以A不能立即关闭,它必须确认B接收到该ACK并关闭后,在2MSL内没有收到FIN,才会进行关闭。MSL指一个报文段在网络中的最大存活时间。
传输层的主要工作内容是定义端口,标识应用程序身份,实现端口到端口的通信,TCP协议保证数据传输的可靠性。
应用层
理论上来讲,有了以上三层协议的支持,数据已经可以从一个主机的应用程序传输到另一台主机的应用程序上了,但是传输过来的数据是字节流,不能被程序识别,因此应用层定义了各种各样的协议来规范数据格式,常见的有http、ftp等。应用层的主要工作就是定义数据格式并按照对应的格式解读数据。
TCP/IP协议蔟
- 链路层:对数据进行分组,定义数据帧,确认主机的物理地址,传输数据。
- 网络层:定义IP地址,确认主机所在的网络位置,并通过IP进行MAC寻址,对外网数据包进行路由转发。
- 传输层:定义端口号,确认主机上应用程序的身份,并将数据包交给对应的应用程序。
- 应用层:定义数据格式,并按照对应的格式解读数据。
当输入一个网址并按下回车键的时候,首先,应用层协议对该请求包做了格式定义,紧接着传输层协议加上了双发的端口号,确认双发通信的应用程序,然后网络层的IP协议加上了双方的IP地址,确认双发的网络位置,最后链路层协议加上双发的MAC地址,确认双发的物理位置,同时将数据进行分组,形成数据帧,采用广播方式,通过传输介质发送给对方主机,而对于不同子网,该数据包首先会转发给网关路由器,经过多次转发后,最终被发送到目标主机,目标主机接收到数据包后,采用对应的协议,对帧数据进行组装,然后一层一层的协议进行解析,最终被应用层的协议解析。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。