网络层结构

网络结构有两种主流的分层方式:OSI七层模型和TCP/IP四层模型。

OSI七层模型和TCP/IP四层模型

OSI是指Open System Interconnect,意为开放式系统互联。
TCP/IP是指传输控制协议/网间协议,是目前世界上应用最广的协议。

两种模型区别

1、OSI采用七层模型,TCP/IP是四层模型
2、TCP/IP网络接口层没有真正的定义,只是概念性的描述。OSI把它分为2层,每一层功能详尽。
3、在协议开发之前,就有了OSI模型,所以OSI模型具有共通性,而TCP/IP是基于协议建立的模型,不适用于非TCP/IP的网络。
4、实际应用中,OSI模型是理论上的模型,没有成熟的产品;而TCP/IP已经成为国际标准。

OSI模型下的两端通信模型

一次连接

日常中,我们向一个网站地址进行访问的时候,都是浏览器默默的在内部构建了基于HTTP协议的请求,以访问百度为例:
谷歌浏览器地址栏输入百度地址,然后打开F12,查看:


在linux中,也可以完成这个操作:

[root@dream01 ~]# cd /proc/$$/fd
[root@dream01 fd]# ll
总用量 0
lrwx------ 1 root root 64 4月  12 23:46 0 -> /dev/pts/0
lrwx------ 1 root root 64 4月  12 23:46 1 -> /dev/pts/0
lrwx------ 1 root root 64 4月  12 23:46 2 -> /dev/pts/0
lrwx------ 1 root root 64 4月  12 23:46 255 -> /dev/pts/0

1、建立socket连接

[root@dream01 fd]# exec 8<> /dev/tcp/www.baidu.com/80
[root@dream01 fd]# ll
总用量 0
lrwx------ 1 root root 64 4月  12 23:46 0 -> /dev/pts/0
lrwx------ 1 root root 64 4月  12 23:46 1 -> /dev/pts/0
lrwx------ 1 root root 64 4月  12 23:46 2 -> /dev/pts/0
lrwx------ 1 root root 64 4月  12 23:46 255 -> /dev/pts/0
lrwx------ 1 root root 64 4月  12 23:47 8 -> socket:[10353]

2、基于连接,基于协议(HTTP协议:规范标准)进行通信数据的请求

echo -e 'GET / HTTP/1.0\n' >& 8

3、响应

[root@dream01 fd]# cat <& 8
HTTP/1.0 200 OK
Accept-Ranges: bytes
Cache-Control: no-cache
Content-Length: 14615
Content-Type: text/html
Date: Sun, 12 Apr 2020 15:55:26 GMT
P3p: CP=" OTI DSP COR IVA OUR IND COM "
P3p: CP=" OTI DSP COR IVA OUR IND COM "
Pragma: no-cache
Server: BWS/1.1
Set-Cookie: BAIDUID=58BDB9283AB79ECA7FF2BFFA5FFBE1A0:FG=1; expires=Thu, 31-Dec-37 23:55:55 GMT; max-age=2147483647; path=/; domain=.baidu.com
Set-Cookie: BIDUPSID=58BDB9283AB79ECA7FF2BFFA5FFBE1A0; expires=Thu, 31-Dec-37 23:55:55 GMT; max-age=2147483647; path=/; domain=.baidu.com
Set-Cookie: PSTM=1586706926; expires=Thu, 31-Dec-37 23:55:55 GMT; max-age=2147483647; path=/; domain=.baidu.com
Set-Cookie: BAIDUID=58BDB9283AB79ECA7240308716C26A2A:FG=1; max-age=31536000; expires=Mon, 12-Apr-21 15:55:26 GMT; domain=.baidu.com; path=/; version=1; comment=bd
Traceid: 1586706926067396481011737324045974640484
Vary: Accept-Encoding
X-Ua-Compatible: IE=Edge,chrome=1<!DOCTYPE html><!--STATUS OK-->
<html>
<head><meta http-equiv="content-type" content="text/html;charset=utf-8"><meta http-equiv="X-UA-Compatible" content="IE=Edge"><link rel="dns-prefetch" href="//s1.bdstatic.com"/><link rel="dns-prefetch" href="//t1.baidu.com"/><link rel="dns-prefetch" href="//t2.baidu.com"/><link rel="dns-prefetch" href="//t3.baidu.com"/><link rel="dns-prefetch" href="//t10.baidu.com"/><link rel="dns-prefetch" href="//t11.baidu.com"/><link rel="dns-prefetch" href="//t12.baidu.com"/><link rel="dns-prefetch" href="//b1.bdstatic.com"/><title>百度一下,你就知道</title><link href="http://s1.bdstatic.com/r/www/cache/static/home/css/index.css" rel="stylesheet" type="text/css" /><!--[if lte IE 8]><style index="index" >#content{height:480px\9}#m{top:260px\9}</style><![endif]--><!--[if IE 8]><style index="index" >#u1 a.mnav,#u1 a.mnav:visited{font-family:simsun}</style><![endif]--><script>var hashMatch = document.location.href.match(/#+(.*wd=[^&].+)/);if (hashMatch && hashMatch[0] && hashMatch[1]) {document.location.replace("http://"+location.host+"/s?"+hashMatch[1]);}var ns_c = function(){};</script><script>function h(obj){obj.style.behavior='url(#default#homepage)';var a = obj.setHomePage('//www.baidu.com/');}</script><noscript><meta http-equiv="refresh" content="0; url=/baidu.html?from=noscript"/></noscript><script>window._ASYNC_START=new Date().getTime();</script>
</head>
<body link="#0000cc"><div id="wrapper" style="display:none;"><div id="u"><a href="//www.baidu.com/gaoji/preferences.html"  onmousedown="return user_c({'fm':'set','tab':'setting','login':'0'})">搜索设置</a>|<a id="btop" href="/"  onmousedown="return user_c({'fm':'set','tab':'index','login':'0'})">百度首页</a>|<a id="lb" href="https://passport.baidu.com/v2/?login&tpl=mn&u=http%3A%2F%2Fwww.baidu.com%2F" onclick="return false;"  onmousedown="return user_c({'fm':'set','tab':'login'})">登录</a><a href="https://passport.baidu.com/v2/?reg®Type=1&tpl=mn&u=http%3A%2F%2Fwww.baidu.com%2F"  onmousedown="return user_c({'fm':'set','tab':'reg'})" target="_blank" class="reg">注册</a></div><div id="head"><div class="s_nav"><a href="/" class="s_logo" onmousedown="return c({'fm':'tab','tab':'logo'})"><img src="//www.baidu.com/img/baidu_jgylogo3.gif" width="117" height="38" border="0" alt="到百度首页" title="到百度首页"></a><div class="s_tab" id="s_tab"><a href="http://news.baidu.com/ns?cl=2&rn=20&tn=news&word=" wdfield="word"  onmousedown="return c({'fm':'tab','tab':'news'})">新闻</a> <b>网页</b> <a href="http://tieba.baidu.com/f?kw=&fr=wwwt" wdfield="kw"  onmousedown="return c({'fm':'tab','tab':'tieba'})">贴吧</a> <a href="http://zhidao.baidu.com/q?ct=17&pn=0&tn=ikaslist&rn=10&word=&fr=wwwt" wdfield="word"  onmousedown="return c({'fm':'tab','tab':'zhidao'})">知道</a> <a href="http://music.baidu.com/search?fr=ps&key=" wdfield="key"  onmousedown="return c({'fm':'tab','tab':'music'})">音乐</a> <a href="http://image.baidu.com/i?tn=baiduimage&ps=1&ct=201326592&lm=-1&cl=2&nc=1&word=" wdfield="word"  onmousedown="return c({'fm':'tab','tab':'pic'})">图片</a> <a href="http://v.baidu.com/v?ct=301989888&rn=20&pn=0&db=0&s=25&word=" wdfield="word"   onmousedown="return c({'fm':'tab','tab':'video'})">视频</a> <a href="http://map.baidu.com/m?word=&fr=ps01000" wdfield="word"  onmousedown="return c({'fm':'tab','tab':'map'})">地图</a> <a href="http://wenku.baidu.com/search?word=&lm=0&od=0" wdfield="word"  onmousedown="return c({'fm':'tab','tab':'wenku'})">文库</a> <a href="//www.baidu.com/more/"  onmousedown="return c({'fm':'tab','tab':'more'})">更多»</a></div></div><form id="form" name="f" action="/s" class="fm" ><input type="hidden" name="ie" value="utf-8"><input type="hidden" name="f" value="8"><input type="hidden" name="rsv_bp" value="1"><span class="bg s_ipt_wr"><input name="wd" id="kw" class="s_ipt" value="" maxlength="100"></span><span class="bg s_btn_wr"><input type="submit" id="su" value="百度一下" class="bg s_btn" onmousedown="this.className='bg s_btn s_btn_h'" onmouseout="this.className='bg s_btn'"></span><span class="tools"><span id="mHolder"><div id="mCon"><span>输入法</span></div><ul id="mMenu"><li><a href="javascript:;" name="ime_hw">手写</a></li><li><a href="javascript:;" name="ime_py">拼音</a></li><li class="ln"></li><li><a href="javascript:;" name="ime_cl">关闭</a></li></ul></span><span class="shouji"><strong>推荐 : </strong><a href="http://w.x.baidu.com/go/mini/8/10000020" onmousedown="return ns_c({'fm':'behs','tab':'bdbrowser'})">百度浏览器,打开网页快2秒!</a></span></span></form></div><div id="content"><div id="u1"><a href="http://news.baidu.com" name="tj_trnews" class="mnav">新闻</a><a href="http://www.hao123.com" name="tj_trhao123" class="mnav">hao123</a><a href="http://map.baidu.com" name="tj_trmap" class="mnav">地图</a><a href="http://v.baidu.com" name="tj_trvideo" class="mnav">视频</a><a href="http://tieba.baidu.com" name="tj_trtieba" class="mnav">贴吧</a><a href="https://passport.baidu.com/v2/?login&tpl=mn&u=http%3A%2F%2Fwww.baidu.com%2F" name="tj_login" id="lb" onclick="return false;">登录</a><a href="//www.baidu.com/gaoji/preferences.html" name="tj_settingicon" id="pf">设置</a><a href="//www.baidu.com/more/" name="tj_briicon" id="bri">更多产品</a></div><div id="m"><p id="lg"><img src="//www.baidu.com/img/bd_logo.png" width="270" height="129"></p><p id="nv"><a href="http://news.baidu.com">新 闻</a> <b>网 页</b> <a href="http://tieba.baidu.com">贴 吧</a> <a href="http://zhidao.baidu.com">知 道</a> <a href="http://music.baidu.com">音 乐</a> <a href="http://image.baidu.com">图 片</a> <a href="http://v.baidu.com">视 频</a> <a href="http://map.baidu.com">地 图</a></p><div id="fm"><form id="form1" name="f1" action="/s" class="fm"><span class="bg s_ipt_wr"><input type="text" name="wd" id="kw1" maxlength="100" class="s_ipt"></span><input type="hidden" name="rsv_bp" value="0"><input type=hidden name=ch value=""><input type=hidden name=tn value="baidu"><input type=hidden name=bar value=""><input type="hidden" name="rsv_spt" value="3"><input type="hidden" name="ie" value="utf-8"><span class="bg s_btn_wr"><input type="submit" value="百度一下" id="su1" class="bg s_btn" onmousedown="this.className='bg s_btn s_btn_h'" onmouseout="this.className='bg s_btn'"></span></form><span class="tools"><span id="mHolder1"><div id="mCon1"><span>输入法</span></div></span></span><ul id="mMenu1"><div class="mMenu1-tip-arrow"><em></em><ins></ins></div><li><a href="javascript:;" name="ime_hw">手写</a></li><li><a href="javascript:;" name="ime_py">拼音</a></li><li class="ln"></li><li><a href="javascript:;" name="ime_cl">关闭</a></li></ul></div><p id="lk"><a href="http://baike.baidu.com">百科</a> <a href="http://wenku.baidu.com">文库</a> <a href="http://www.hao123.com">hao123</a><span> | <a href="//www.baidu.com/more/">更多>></a></span></p><p id="lm"></p></div></div><div id="ftCon"><div id="ftConw"><p id="lh"><a id="seth" onClick="h(this)" href="/" onmousedown="return ns_c({'fm':'behs','tab':'homepage','pos':0})">把百度设为主页</a><a id="setf" href="//www.baidu.com/cache/sethelp/index.html" onmousedown="return ns_c({'fm':'behs','tab':'favorites','pos':0})" target="_blank">把百度设为主页</a><a onmousedown="return ns_c({'fm':'behs','tab':'tj_about'})" href="http://home.baidu.com">关于百度</a><a onmousedown="return ns_c({'fm':'behs','tab':'tj_about_en'})" href="http://ir.baidu.com">About Baidu</a></p><p id="cp">©2018 Baidu <a href="/duty/" name="tj_duty">使用百度前必读</a> 京ICP证030173号 <img src="http://s1.bdstatic.com/r/www/cache/static/global/img/gs_237f015b.gif"></p></div></div><div id="wrapper_wrapper"></div></div><div class="c-tips-container" id="c-tips-container"></div>
<script>window.__async_strategy=2;</script>
<script>var bds={se:{},su:{urdata:[],urSendClick:function(){}},util:{},use:{},comm : {domain:"http://www.baidu.com",ubsurl : "http://sclick.baidu.com/w.gif",tn:"baidu",queryEnc:"",queryId:"",inter:"",templateName:"baidu",sugHost : "http://suggestion.baidu.com/su",query : "",qid : "",cid : "",sid : "",indexSid : "",stoken : "",serverTime : "",user : "",username : "",loginAction : [],useFavo : "",pinyin : "",favoOn : "",curResultNum:"",rightResultExist:false,protectNum:0,zxlNum:0,pageNum:1,pageSize:10,newindex:0,async:1,maxPreloadThread:5,maxPreloadTimes:10,preloadMouseMoveDistance:5,switchAddMask:false,isDebug:false,ishome : 1},_base64:{domain : "http://b1.bdstatic.com/",b64Exp : -1,pdc : 0}};var name,navigate,al_arr=[];var selfOpen = window.open;eval("var open = selfOpen;");var isIE=navigator.userAgent.indexOf("MSIE")!=-1&&!window.opera;var E = bds.ecom= {};bds.se.mon = {'loadedItems':[],'load':function(){},'srvt':-1};try {bds.se.mon.srvt = parseInt(document.cookie.match(new RegExp("(^| )BDSVRTM=([^;]*)(;|$)"))[2]);document.cookie="BDSVRTM=;expires=Sat, 01 Jan 2000 00:00:00 GMT"; }catch(e){}</script>
<script>if(!location.hash.match(/[^a-zA-Z0-9]wd=/)){document.getElementById("ftCon").style.display='block';document.getElementById("u1").style.display='block';document.getElementById("content").style.display='block';document.getElementById("wrapper").style.display='block';setTimeout(function(){try{document.getElementById("kw1").focus();document.getElementById("kw1").parentNode.className += ' iptfocus';}catch(e){}},0);}</script>
<script type="text/javascript" src="http://s1.bdstatic.com/r/www/cache/static/jquery/jquery-1.10.2.min_f2fb5194.js"></script>
<script>(function(){var index_content = $('#content');var index_foot= $('#ftCon');var index_css= $('head [index]');var index_u= $('#u1');var result_u= $('#u');var wrapper=$("#wrapper");window.index_on=function(){index_css.insertAfter("meta:eq(0)");result_common_css.remove();result_aladdin_css.remove();result_sug_css.remove();index_content.show();index_foot.show();index_u.show();result_u.hide();wrapper.show();if(bds.su&&bds.su.U&&bds.su.U.homeInit){bds.su.U.homeInit();}setTimeout(function(){try{$('#kw1').get(0).focus();window.sugIndex.start();}catch(e){}},0);if(typeof initIndex=='function'){initIndex();}};window.index_off=function(){index_css.remove();index_content.hide();index_foot.hide();index_u.hide();result_u.show();result_aladdin_css.insertAfter("meta:eq(0)");result_common_css.insertAfter("meta:eq(0)");result_sug_css.insertAfter("meta:eq(0)");wrapper.show();};})();</script>
<script>window.__switch_add_mask=1;</script>
<script type="text/javascript" src="http://s1.bdstatic.com/r/www/cache/static/global/js/instant_search_newi_redirect1_20bf4036.js"></script>
<script>initPreload();$("#u,#u1").delegate("#lb",'click',function(){try{bds.se.login.open();}catch(e){}});if(navigator.cookieEnabled){document.cookie="NOJS=;expires=Sat, 01 Jan 2000 00:00:00 GMT";}</script>
<script>$(function(){for(i=0;i<3;i++){u($($('.s_ipt_wr')[i]),$($('.s_ipt')[i]),$($('.s_btn_wr')[i]),$($('.s_btn')[i]));}function u(iptwr,ipt,btnwr,btn){if(iptwr && ipt){iptwr.on('mouseover',function(){iptwr.addClass('ipthover');}).on('mouseout',function(){iptwr.removeClass('ipthover');}).on('click',function(){ipt.focus();});ipt.on('focus',function(){iptwr.addClass('iptfocus');}).on('blur',function(){iptwr.removeClass('iptfocus');}).on('render',function(e){var $s = iptwr.parent().find('.bdsug');var l = $s.find('li').length;if(l>=5){$s.addClass('bdsugbg');}else{$s.removeClass('bdsugbg');}});}if(btnwr && btn){btnwr.on('mouseover',function(){btn.addClass('btnhover');}).on('mouseout',function(){btn.removeClass('btnhover');});}}});</script>
<script type="text/javascript" src="http://s1.bdstatic.com/r/www/cache/static/home/js/bri_7f1fa703.js"></script>
<script>(function(){var _init=false;window.initIndex=function(){if(_init){return;}_init=true;var w=window,d=document,n=navigator,k=d.f1.wd,a=d.getElementById("nv").getElementsByTagName("a"),isIE=n.userAgent.indexOf("MSIE")!=-1&&!window.opera;(function(){if(/q=([^&]+)/.test(location.search)){k.value=decodeURIComponent(RegExp["\x241"])}})();(function(){var u = G("u1").getElementsByTagName("a"), nv = G("nv").getElementsByTagName("a"), lk = G("lk").getElementsByTagName("a"), un = "";var tj_nv = ["news","tieba","zhidao","mp3","img","video","map"];var tj_lk = ["baike","wenku","hao123","more"];un = bds.comm.user == "" ? "" : bds.comm.user;function _addTJ(obj){addEV(obj, "mousedown", function(e){var e = e || window.event;var target = e.target || e.srcElement;if(target.name){ns_c({'fm':'behs','tab':target.name,'un':encodeURIComponent(un)});}});}for(var i = 0; i < u.length; i++){_addTJ(u[i]);}for(var i = 0; i < nv.length; i++){nv[i].name = 'tj_' + tj_nv[i];}for(var i = 0; i < lk.length; i++){lk[i].name = 'tj_' + tj_lk[i];}})();(function() {var links = {'tj_news': ['word', 'http://news.baidu.com/ns?tn=news&cl=2&rn=20&ct=1&ie=utf-8'],'tj_tieba': ['kw', 'http://tieba.baidu.com/f?ie=utf-8'],'tj_zhidao': ['word', 'http://zhidao.baidu.com/search?pn=0&rn=10&lm=0'],'tj_mp3': ['key', 'http://music.baidu.com/search?fr=ps&ie=utf-8'],'tj_img': ['word', 'http://image.baidu.com/i?ct=201326592&cl=2&nc=1&lm=-1&st=-1&tn=baiduimage&istype=2&fm=&pv=&z=0&ie=utf-8'],'tj_video': ['word', 'http://video.baidu.com/v?ct=301989888&s=25&ie=utf-8'],'tj_map': ['wd', 'http://map.baidu.com/?newmap=1&ie=utf-8&s=s'],'tj_baike': ['word', 'http://baike.baidu.com/search/word?pic=1&sug=1&enc=utf8'],'tj_wenku': ['word', 'http://wenku.baidu.com/search?ie=utf-8']};var domArr = [G('nv'), G('lk'),G('cp')],kw = G('kw1');for (var i = 0, l = domArr.length; i < l; i++) {domArr[i].onmousedown = function(e) {e = e || window.event;var target = e.target || e.srcElement,name = target.getAttribute('name'),items = links[name],reg = new RegExp('^\\s+|\\s+\x24'),key = kw.value.replace(reg, '');if (items) {if (key.length > 0) {var wd = items[0], url = items[1],url = url + ( name === 'tj_map' ? encodeURIComponent('&' + wd + '=' + key) : ( ( url.indexOf('?') > 0 ? '&' : '?' ) + wd + '=' + encodeURIComponent(key) ) );target.href = url;} else {target.href = target.href.match(new RegExp('^http:\/\/.+\.baidu\.com'))[0];}}name && ns_c({'fm': 'behs','tab': name,'query': encodeURIComponent(key),'un': encodeURIComponent(bds.comm.user || '') });};}})();};if(window.pageState==0){initIndex();}})();document.cookie = 'IS_STATIC=1;expires=' + new Date(new Date().getTime() + 10*60*1000).toGMTString();</script>
</body></html>

但到目前为止,我们实际只看到了表面上我们直观可以看到的东西,如你所见,不管是我们手动发送还是浏览器,都只完成了最上层:应用层 的构建。
而实际上,一套流程应该是这样的:
TCP/IP协议,将OSI模型的7层缩减成了4层,作为软件开发工程来说,只需要关注这四层就可以了。

如图,客户端到服务端的一次通信大致是上述的。 基于TCP/IP,应该是4层,但为了描述清楚整个过程,我把链路层和物理层没有合在一起,而是单独拿出来说。

下面我们就上图,来一层层描述一次连接会发生什么。

应用层

日常中,都是浏览器帮我们完成的这个工作,正常来说,作为一个无加密的网站,就是基于HTTP协议,进行组织信息,将字符串格式化,然后需要调用下层

传输控制层

这一层指的就是TCP,UDP
在TCP/IP下,我们这层指的就是TCP,说到TCP就是面向连接的可靠传输协议,什么叫面向连接可靠传输的呢?

输入:

netstap -natp

结果:

可以看到,每一个连接都有记录,以本地22端口为例,每启动一个shell,远程就多一个端口号与本地22进行连接,因此可以看出,通过本地+远程端口号,可以唯一确定一条连接。

接下来说一说TCP的一次连接的生命周期:

三次握手

那么,为什么一定要三次握手呢,一次可以吗?两次可以吗?带着这些问题,我们来分析一下为什么必须是三次握手。
1、第一次握手,A向B发送信息后,B收到信息。B可确认A的发信能力和B的收信能力
2、第二次握手,B向A发消息,A收到消息。A可确认A的发信能力和收信能力,A也可确认B的收信能力和发信能力
3、第三次握手,A向B发送消息,B接收到消息。B可确认A的收信能力和B的发信能力
通过三次握手,A和B都能确认自己和对方的收发信能力,相当于建立了互相的信任,就可以开始通信了。
三次握手完成之后,双方才会开始分配各自的文件描述符,建立资源。
从图中可以看出,建立连接经历了三次握手。

四次挥手

我们知道,一个操作系统最多分配65535个端口号,你每经过三次握手后,成功建立一次socket连接,都会消耗自身连接方的一个随机端口号,也就是说,资源是有限的,用完需要被释放!
因此当数据传输完毕,需要断开连接释放资源,而断开连接经历了四次挥手:
1、第一次挥手:主机1(可以是客户端或服务器),设置seq和ack向主机2发送一个FIN报文段,此时主机1进入FIN_WAIT_1状态,表示没有数据要发送给主机2了
2、第二次挥手:主机2收到主机1的FIN报文段,向主机1回应一个ACK报文段,表示同意关闭请求,主机1进入FIN_WAIT_2状态。
3、第三次挥手:主机2向主机1发送FIN报文段,请求关闭连接,主机2进入LAST_ACK状态。
4、第四次挥手:主机1收到主机2的FIN报文段,向主机2回应ACK报文段,然后主机1进入TIME_WAIT状态;主机2收到主机1的ACK报文段后,关闭连接。此时主机1等待主机2一段时间后,没有收到回复,证明主机2已经正常关闭,主机1页关闭连接。
上述步骤更加形象的描述:
A主动向B发送想要断开连接的请求:
A:嘿,我想和你断开连接了,可以吗?
B:好的,我知道你想和我断开连接了。
此时B可能还有事情没有完成,需要过一段时间,当处理完之后,将由B主动向A再次主动发起断开请求:
B:我这边事情处理好了,可以断开连接了。
A:好的,我知道了,我们一起断开吧。
以上过程,完成了A,B双方都确认要进行断开的过程,此时才会断开。

上述的过程中的三次握手>数据传输>四次分手,成为一次数据传输操作的最小粒度,不可被分割。

传输控制层主要是创建握手包,确认包,上面说的三次握手,四次分手,单单由传输控制层也是不能完成的,它还得依赖下层,最终通过物理网卡传输出去。

好,那到现在为止,我们的包算是通过这一层给捏好了,那怎么发出去呢?

网络层

说网络层之前可以先看一下我们的网卡配置:

IP & NETMASK(子网掩码) = 所在网络

这个关系我们可以通过查看路由表进行验证:

路由表

一个ip如何找到另外一个ip?

方案一:记录ip到另外一个ip的完整的网络拓扑链路图,之后通过最短路径连接。但当节点变多,计算耗时将不可避免变长。所以现代网络通信并未选用这种。

方案二:下一跳,无需存储全部节点,只需存储自身ip节点和下一跳的节点地址,具体什么意思呢?

我们拿请求百度为例:

使用ping命令,会把www.baidu.com转换成实际的ip地址(61.135.169.121),此时观察我们的路由表,似乎并没有与之对应的ip记录。
此时,我们通过这个ip去跟路由表每个条目的genmask进行与运算,然后将得到的所在网络地址与destination进行比对。
发现只有最后一个0.0.0.0可以匹上,然后它对应的网关Gateway是192.168.150.2
至此,我们虽然还不知道百度的ip地址到底在哪,但是我们已经知道,基于我们自身ip,下一跳要去的位置!

再请求qq,然后去用上述方式一样去与子网掩码进行与运算,发现无论什么请求,都是落到192.168.150.2上,这也就是我们的默认网关。

而关于路由表,存在如下特征:
1、在路由表中,网关可以有多个,但默认网关只有一个,它的特征是它对应的Genmask是0.0.0.0
2、Gateway为0.0.0.0的,代表本机一定在该网络地址中有一个具体的ip号。
3、反之,Gateway不为四个0,则表示需要进行下一跳,不是直连的地址。

问题:还是百度为例,如果我此时想要请求百度,那么我的目标地址应该是写谁呢? 是百度的ip,还是我路由下一跳的ip?

显然是目标ip,因为如果是下一跳,当发到下一跳时,下一跳的ip节点发现自身就是目标地址了,就结束“跳转”了。
可是,我如果直接目标ip是百度的ip,我的路由表里没有这个ip啊?要怎么跳到百度那里去?
这就不是网络层的事情了,需要再包一层“信封”,也就是,链路层。。。

链路层

它在写了目标ip地址的包上,又套了一层东西:mac地址(网卡地址)

网络层有路由表, 链路层当然也有表:

arp是啥?arp是一个协议。
DNS会解析ip地址和域名的映射。 这个解析是全网的
ARP会解析IP地址和网卡硬件地址的映射。这个解析是受限于是同一局域网下的

观察图中,发现第二条,192.168.150.2,也就是我们下一跳的ip位置,对应的mac地址是 00:50:56:f7:53:2b

因此,到这一层,实际上,一次请求包会被包装成三层:

当然,源地址和目标地址都是需要有的,因此一个包大致内容:

关于ARP

当一台计算机重启后,不激活网卡的时候,实际上arp是空的。
当网卡激活的时候,会主动宣告(我来了),发起ARP广播。

举例来说,计算机1(192.168.1.4)要获取路由器(192.168.1.1)arp中的信息,会怎么一个过程?
首先,计算机1要主动发起一个arp包:

目标mac地址因为不确定,所以用FFFF表示

接下来arp包发送到交换机,交换机会学习记录下发送源的信息。然后触发广播动作
广播给计算机2,发现目标ip对不上,这个arp包直接被丢弃。
广播给路由器,发现目标ip对的上,然后路由器将回返一个arp包给广播源头:

包将被转发给交换机,交互机触发学习动作,记录下路由器的信息。并且交换机已经在之前请求来时已经学习记录下了源头(计算机1)的信息,此时将不触发广播动作,而是定向转发到计算机1上。
至此,计算机1将得到关于路由器(192.168.1.1)的arp中的ip和mac的映射信息

当下次计算器1真正发起一个点到点的请求的时候,经过交换机的时候,同理,因为之前路由器将arp包回送给计算机1的时候已经经过了交换机,交换机记录学习下了路由器的信息,可以直接定向转发到路由器上去。

结论:

TCP/IP协议,基于下一跳的机制。
IP是端点间
mac地址是节点间的

一个ip到另外一个ip之间可能需要经过若干个节点的一跳一跳接力完成。
在一个数据包传输过程中,每一跳只有mac地址会发生变化,而ip和端口号不会变化。
跳跃过程中有多条路径怎么办?这是网络工程师需要规划的地方,一定会规划出一条跳往指定ip方向的路径。 路径的下一跳选择,体现在路由层通过 目标ip & 掩码 匹配到的网络地址, 然后通过链路层中的mac映射,通过下一跳网络地址,找到对应的mac硬件地址,这样就确定好了下一次的包的流转。

科普

路由器是三层的,有路由表,一般是衔接不同网段的中介点,因此会分别拥有可以直接连接两端网段的地址。 可以做路由的转发和判定
交换机是二层的,只管转发
计算机是五层或者七层的。

一次路由实操

node03和node04都属于192.168.150.0网络上的机器,它们之间是可以直连的。

但与此同时,node03上面有一块额外的网卡eth0:3,它的ip是192.168.88.88

问题:node04可以ping通node03的这块etho0:3的网卡吗?

不行。
分析这个过程,为什么不行:
在04上ping 192.168.88.88,会走路由表的按位判定,之后发现走默认网关,192.168.150.2。
当路由过去后,默认网关实际也没有连接着192.168.88.88的网段,因此地址丢失了,无法找到目录ip。

那怎么办?
手动在node04添加路由条目:

使得在04上ping 192.168.88.88的时候可以路由到192.168.150.13上,也就是node03上,此时03可以直连192.168.88.88,因此就可以ping通了!

网络并发知识第一天网络通信基本原理相关推荐

  1. 网络基础知识 第一章上

    欢迎大家参加"思科网院杯"大学生网络技术大赛.本竞赛主要考察选手的网络基础知识,题目难度远比ACM等编程比赛简单,适合大一新生参加.只要你对计算机网络感兴趣,愿意学习网络知识,即可 ...

  2. Node 学习八、通信之 01 网络通信基本原理、网络层次模型、数据封装与解封装、TCP三次握手与四次挥手

    网络通信基本原理 网络通信(或通讯)模型和通讯协议(常见的 HTTP.TCP/IP.FTP等)解决的本质问题就是主机与主机之间的网络通信. 下面以最基本的两台主机之间的通信开始,慢慢认识网络通信模型和 ...

  3. 网络编程知识预备(3) ——SOCKET、TCP、HTTP之间的区别与联系

    参考:SOCKET,TCP,HTTP之间的区别与联系 作者:丶PURSUING 发布时间: 2021-03-19 11:54:01 网址:https://blog.csdn.net/weixin_44 ...

  4. JAVA网络编程知识学习

    JAVA网络编程知识学习 学习目标 第一章 网络编程入门 1.1软件结构 1.2 网络通信协议 1.3 协议分类 1.4 网络编程三要素 协议 IP地址 IP地址分类 常用命令 端口号 InetAdd ...

  5. 史上最详细网络基础知识

    网络技术的基本原理: 1. 网络层次划分 2. OSI七层网络模型 3. IP地址 4. 子网掩码及网络划分 5. ARP/RARP协议 6. 路由选择协议 7. TCP/IP协议 8. UDP协议 ...

  6. 第三模块 面向对象网络并发编程 | day17 面向对象基础

    第三模块 面向对象&网络&并发编程 从今天开始,我们将进入系列课程第3个模块的的学习,此模块包含如下三大部分知识: 面向对象,Python中支持两种编程方式来写代码,分别是:函数式编程 ...

  7. 网络基础知识 | 协议 | TCP/IP分层模型

    目录 网络基础知识 网络互联 互联网基础知识 网络的构成要素 网卡 中继器 网桥/2层交换机 路由器/3层交换机 4-7层交换机 网关 协议 分组交换协议 谁来规定协议 协议的标准化 协议的分层 分层 ...

  8. 网络基础知识学习笔记

    网络基础知识学习笔记 参考菜鸟教程.个人学习整理,仅供参考.三年前学过,三年没用忘了,重新学习整理一下. 文章目录 网络基础知识学习笔记 OSI七层网络模型 IP地址 子网掩码及网络划分 网络协议 A ...

  9. 软件测试之第六章 网络基础知识

    第六章 网络基础知识 一.计算机网络基本概念与分类 1 计算机网络的定义 计算机网络是在网络协议的控制下,通过通信设备和线路将分布在不同地理位置,且具有独立功能的多个计算机系统连接起来,通过网络操作系 ...

最新文章

  1. 自动驾驶汽车“定位”技术
  2. linux devm_request_irq 引发BUG sleeping function called from invalid context问题
  3. Linux 系统安全加固
  4. dj鲜生-05-配置-静态目录-模板目录-后台语言时区
  5. Redis执行monitor命令报错 (error) NOAUTH Authentication required.
  6. Paint的方法总结(一):基本常用Api
  7. 七月算法机器学习5 回归分析与工程应用 小案例
  8. The Podfile (Podfile 的写法和规范)
  9. [转]小D课堂 - 零基础入门SpringBoot2.X到实战_汇总
  10. html轮播图片不显示不了,图片轮播的奇怪现象【图片显示不完整】
  11. python变量相关性,数据科学:定量和定性变量之间的相关性(python语言)
  12. Ubuntu 16.04 有道词典不发音修复
  13. 百度地图 变黑问题 解决方法
  14. 中国网络视频前景 表面云淡风轻实在暗潮汹涌
  15. 中文的括号和英文的括号区别_工具推荐 含笔顺及英文的汉字书写练习纸
  16. QT 任务栏图标显示问题
  17. P1195 口袋的天空
  18. yED Editor Getting Start
  19. 爬虫晋江小说python_python 爬虫入门之爬小说
  20. Redis Desktop Manager中出现\xAC\xED\x00\x05t\x00乱码问题

热门文章

  1. windows下整合UCenter、ECShop、Discus
  2. detect(detected是什么意思)
  3. Linux系统中用命令行清空垃圾箱Trash
  4. linux gpu 风扇速度,如何在无头节点上调整NVIDIA GPU风扇速度?
  5. 利用蒙特卡洛法求π的近似值:
  6. 初学者如何快速开发大数据分析平台
  7. python+selenium实现自动刷新网页
  8. Barcode读取之barcode_param_majority_voting.hdev
  9. python接入微信_使用python接入微信聊天机器人
  10. 2021404209陈聪blog