写在前面需要了解的一些关键词可能会更好的了解TCP/IP。
帧、数据报、IP包、TCP/UDP包、段、消息
帧:数据链路层的包
IP包:网络层的包
TCP/UDP:传输层的包
段:TCP数据流中的信息(我也不是很理解)
消息:应用协议中的数据的单位
数据包:网络层以上都以叫数据报
而这些包只所有叫法不同是因为他们的包头不同,就像人的脸一样,脸不同名字不同。
协议号和端口号
协议号:它位于网络层,各种传输协议,网络控制管理协议。
端口号:它位于传输层,TCP/UDP端口号,可以理解为区分用了各种连接,细分IP地址的用途。区分哪个应用程序发的数据包。
⚠️需要注意的是:上层数据包会被下层的包头封装在里面,而下层的包头会在它的一个字段里面说明它下一层封装的是什么协议,就像人套几件衣服一样里面的肉体是不变的(原始的数据)。
下面会通过发送一封邮件来解释一下数据包在分层协议中到底经历了什么?
需要注意的是数据包发送一般情况下是双向的。
应用程序处理
当我们在邮件这个APP中编辑一份邮件的时候,直到我们点发送之前都是不涉及TCP/IP通信的。但是这是应用层发送的事情。
当我们点击“发送”之后,程序会对这些消息进行编码。编码的可以说是表示层需要做的。
表示层是:“统一的网络数据格式”与“某一台计算机或某一软件特有的数据格式“之间的转换
而我们点击“发送”之后,程序不一定会立即发送,因为发送不是应用层或者表层做的事情。
此时,会话层要做来决定:1.何时建立连接2.何时发送数据。
上面的三层可能由一个或者几个程序完成。你可以理解是TCP/IP定义的是一种规范、一种流程,执行的人可以这么干,但是它也可以变通,只要他完成了他自己的任务,并且他对应的对接的人可以认可他的方式就是可以的。
可以说规范流程是让工作可以顺利的走下去,不会卡在一个人手上,只要他顺利完成自己的任务,并且顺利交接给对应的人,这就是可以被认可的。
TCP/IP的精髓就是标准话。让数据的传输可以在不同的设备中被识别。
TCP对数据包处理
此时会话层会让传输层来帮他建立连接。会话层就是负责建立连接,发送TCP/UDP数据以及断开链接。
此时我们的包头就来了,TCP部首中包含源端口和目标端口(用来区分发送和接收主机的应用程序)、序号(此时的数据会被分段,我们的分组交换就来了,一般理解就是可以让同一个物理链路建立不同的链接,这里序号就是表示这个数据包是数据的第几段)以及校验和(用来检验数据包是否被损坏)。此时我们在传输层的数据包已经封装完毕,准备发往IP层(网络层)。
IP对数据包处理
此时TCP数据包成为了IP数据包的数据部分。IP会装上自己的部首:源目IP地址,以及说明TCP一个下层协议的字段。
IP数据包生成后他就可以被路由表转发啦。数据可以真正发送了。
但是网络层只是司机,我们的数据链路层才是那辆车。当不知道MAC地址的时候,我们的2.5层协议ARP就来了,他会帮我们找到对端的MAC地址。最搞笑的是ARP也是基于TCP/IP的。哈哈哈哈😂
以太网驱动对数据包的处理
IP包对于数据链路层来时也是他的数据部分,我们的二层包头就来了,给IP包封装源目MAC地址,还有有个字段会表示网络层是什么协议。这时候就会发送给对端(可以理解为直连)啦。所以直连通不通很重要。其实二层包尾部还有FCS,用来判断数据包在直连传输中是否被噪声破坏。
数据链路层(以太网头)网络层(IP部首)传输层(TCP/UDP部首)会话层、表示层、应用层(应用包头以及数据)数据链路层(以太网Trailer)
接收端MAC地址-发送端MAC地址-以太网类型(表示下一个协议的类型)接收端IP地址-发送端IP地址-协议类型(表示下一个协议的类型)源端口-目的端口(表示下一个协议的类型)数据循环冗余校验码
下面会通过接受一封邮件来解释一下数据包在分层协议中到底经历了什么?
以太网驱动对数据包的处理
设备接收到以太网包以后,首先它会看二层包的部首找到MAC地址看看是否是发给自己的包,如果不是就丢弃。
如果是发给自己的,就查找包头里面的下一个协议类型的字段来确定下一层数据类型,然后就丢给IP的子程序,像ICMP、IGMP、IP、IPv6、ARP都是这些子程序。如果下一个协议没法识别,那丢弃,不规范造成的,无奈。
IP对数据包处理
当数据包顺利进到网络层,也是类似二层的处理方法。
先匹配IP地址看看是不是发给自己的,在查看上层协议,TCP就发给TCP,UDP就发给UDP。
但是,如果真的跟二层一样,就没意思了呀。此时我们要把一个爸爸请出来,就是我们的路由器👏👏👏
在路由器中如果目的IP地址不是自己,就查路由表,然后转发IP数据包。转发就是回到二层,发给对端。所以我们网工干的事是很小的一部分啊,你要有梦想就求求你别学网工好吧。开玩笑😝
TCP对数据包处理
TCP就厉害了,他作为传输层,可是会检查数据包的准确性哦。它会计算校验和,判断数据是否被破坏,然后还会按照接收数据,最后检查端口号,确定上层具体的应用程序。
数据接收完毕后,接收端会发送一个“确认回执”给发送端。如果这个消息没有到发送端,那么发送端会认为接收端没有收到这个消息一直反复发送。
数据被完整地接收以后,会传给有端口号识别的应用程序。
应用程序处理
接收端程序会获得“网络数据格式”通过表示层翻译成计算机或程序可以识别的数据,然后看这个邮件是不是发给自己的,不是就丢弃。反正这部分操作由应用程序处理,类似于甲方爸爸,他想怎么干就怎么干。