认识协议
协议其实是一种约定
网络协议初识:
1.内核上以结构体形式呈现
2.操作系统要进行协议管理--先描述,在管理
3.协议的本质是软件,软件是可以分层的,(联系C++继承多态的知识 )
可以参考 : C++ 继承_秋秋爱代码的博客-CSDN博客
C++多态_秋秋爱代码的博客-CSDN博客
4.协议在设计时候都是分层的,那为什么要设计成层状结构嘞?
(1)因为使用场景很复杂;(2)层状结构有利于解耦
5.复杂体现在什么地方?--协议栈要解决的问题
通信的复杂本质适合距离成正比的。
OSI七层模型(蓝图) <====> TCP/IP五层模型(实现)
TCP/IP通信过程
引入问题:同一个局域网内两个主机能否之际通信? 答案:能!!
内核上,相同层不能直接通信,但是这样理解可能比较直观,但是实际上两层的通信就好比你和你的朋友住在同一个小区的不同栋楼,他要给你送礼物,只能先从当前楼下楼梯再从你所在的楼上楼梯,但是你只需要关注的是他把礼物送到你手上了。
什么是报头?
每层都有自己的协议指定方案,每层协议也都有自己的协议报头,从上到下交付数据的过程叫做添加报头,从下到上递交数据的过程叫做去掉报头。
如果不好理解,这么来说,报头就是快递通过不同地方,如发货商,快递站(对应不同层),发货商会对商品做包装,快递站也会对商品进行再次包装,这个包装就和报头是等价的。
回溯通信过程:
当用户要将文件传输给另一台主机前,该文件数据需要先通过网络协议栈进行封装:
文件数据先交给应用层,应用层添加上对应应用层协议的报头信息后,将数据交给传输层。
传输层收到数据后,再添加上对应传输层协议的报头信息,并将数据继续向下进行交付。
网络层收到数据后,再添加上对应网络层协议的报头信息,接着将数据再交给链路层。
链路层收到数据后,最后再添加上对应链路层协议的报头信息,至此数据封装完毕。
数据封装完毕后就可以通过局域网将其发送给对端主机了,而当对端主机收到数据后,对应也需要通过网络协议栈对该数据进行解包与分用:
链路层收到数据后,先将数据中对应链路层协议的报头信息提取出来,然后将剩下的数据交 给网络层。
网络层收到该数据后,再将数据中对应网络层协议的报头信息提取出来,然后将剩下的数据 继续向上进行交付。
传输层收到该数据后,再将数据中对应传输层协议的报头信息提取出来,然后将剩下的数据 再交付给应用层。
应用层收到数据后,最后将数据中对应应用层协议的报头信息提取出来,至此便完成了数据 的解包与分用。
也就是说,任何一台主机在发送数据之前,该数据都要先自顶向下贯穿协议栈来完成数据的封装,在这个过程中,每一层协议都会添加上对应的报头信息;而任何一台主机收到数据后,都要先自底向上贯穿协议栈来完成数据的解包和分用,在这个过程中,每一层协议都会将对应的报头信息提取出来。
局域网中表示主机唯一性--MAC地址
大家应该都看过《西游记》吧,里面唐三藏的经典台词“贫僧自东土大唐而来,要往西天拜佛取经去”。这里的“东土大唐”就相当于源IP地址,“西天”就相当于 目的IP地址,这也就好理解源IP和目的IP地址都有且只有一个的原因啦。
话说西行路上,唐僧路经车迟国,下一站去黑风岭,这里的 “车迟国”就好比 源MAC地址,“黑风岭”就是下一站MAC地址。
udp代码详见 :udp/Multithreaded_version · fortianyang/StudyForLinux - 码云 - 开源中国 (gitee.com)