不同层有各自的职能,组合起来,就像排列组合一样,根据不同的需要组合成不同的排列,比如,同样的ip协议,有的要TCP协议长连接方式,有的要UDP方式。分成不同层,就可以满足更多不同的需求。
在链路层,数据以帧的形式传输,格式分两部分,帧头和帧体,头部记录了网卡的信息,帧体记录了传输的数据,一帧最大为1518个字节。当要传输的数据如图片大于它时,就会分成多个帧来传输;
在网络层,从链路层中帧体,可以拿到ip标头和ip数据
以上,相当于在一个‘体’中,封装了头+体的数据格式,就像递归,不同数据之间存在着层级关系,层与层之间的识别只需要拿到相应数据层的‘头’信息来标识
所以,在传输层,就从网络层的ip数据体中拿到传输层的‘头’+‘体’信息:TCP/UDP标头和TCP/UDP数据,如果是UDP协议,标头就会相对比较简单
应用层:端到端的通信
传输层:进程和进程之间的通信
传输层拿到应用层的数据,将数据发给其他主机的某一个进程,利用端口号来识别具体的进程,网络层中有了本地IP地址和目的主机IP地址。
至于UDP和TCP,就是传输层传输数据的方式,一种是稳定的长连接,一种是快速的短连接
UDP面向报文,只要管好报文的组装即可。
TCP面向连接,需要管好连接通道的管理,包括建立的三次握手,释放连接的四次握手,建立连接后,双方都对数据的起始位置和下一次要拿到的数据位置做了标识,如果发生数据不对,就会通知重发,以此来保证数据的连续性和准确性。
至于主机-路由器、路由器-路由器、路由器-主机的通路,由网络层负责,有路由选择算法来得到,传输层不需关心。而对应用层来说,数据是怎样传到另外一个主机的进程的,也不需要关心,由传输层负责。
不同协议的报文可能会封装到同一个IP分组中,不过报文头中有标识协议类型和端口,如UDP,所以,对于网络层来说,忽视传输层协议的差异性,统一封装到IP分组中,接收方的传输层根据端口识别进程,根据协议类型来选择处理方式。
处理方式:比如,如果是UDP的协议类型报文,则只要获取数据即可。如果是TCP的协议类型报文,则要看是在处于什么连接阶段,根据TCP头部的报文中的标识位,来判断是否要去建立连接,还是获取数据并回应,还是通知重发等操作,正是有了这些操作,才让TCP变得可靠。
端口号中有三类:熟知端口号,如HTTP的80端口,DNS的53端口;注册端口号,供用户注册使用,避免冲突;临时端口号,标识用户进程用的,只对一次通信有用。
如果应用层选择了DNS协议,则会将传输层的数据报文中目标主机的端口设为53,本机主机的端口就为临时端口。这样,这个报文去到目标主机,就会选择DNS的处理进程来处理数据,即解析域名。
用户在浏览器访问一个地址时,首先会发起一次域名解析请求,向域名服务器获取具体的IP地址,这个过程就涉及到不同主机之间的通信,也就用到以上所说的应用层、传输层、网络层等发挥作用。DNS可以用UDP,也可以用TCP,目标主机的53端口进程拿到一段文字域名后,查找匹配相应的IP地址,再同样将数据传输过来。
如果应用层选择了FTP或HTTP这种协议,传输层就会选择TCP的协议类型来传输数据,保证数据传输过程中的稳定可靠。
socket:是网络通信的端点,ip+端口可以识别一个进程,用socket来封装ip+端口,就可以来进行网络通信
同步、异步、阻塞、非阻塞:
同步:接收方会执行完请求才返回结果
异步:接收方会立刻返回结果,但实际结果会晚点再发,类似被叫回去等通知
阻塞:发起方在没拿到结果前一直等待
非阻塞:发起方在没拿到结果前可以做其他事情
同步阻塞:发起方等待,接收方也等执行完才返回结果
异步阻塞:发起方等待,接收方先返回一个通知,等晚点才返回真正结果
同步非阻塞:发起方不等待,接收方执行完才返回结果
异步非阻塞:发起方不等待,接收方也会先返回一个通知,晚点执行完才返回结果
比如:老师发布成绩,学生拿到成绩,考完试后,学生是不是一直挂念成绩结果,就等同于阻塞非阻塞;而老师不管学生是怎样的,我是不是立刻就改试卷不做其他事,还是跟学生说后天发布成绩,就等同于同步异步