-
当浏览器输入网址输入www.baidu.com之后。
-
浏览器会将域名解析成ip地址。how?
- 用户主机上运行着DNS的客户端,就是我们的PC机或者手机客户端运行着DNS客户端了
- 浏览器将接收到的url中抽取出域名字段,就是访问的主机名,比如
, 并将这个主机名传送给DNS应用的客户端。
DNS应用的客户端首先会在浏览器的缓存中查找是否有该域名对应的IP地址(若曾经访问过该域名且没有清空缓存便存在)
当浏览器缓存中无域名对应IP则会自动检查用户计算机系统Hosts文件DNS缓存是否有该域名对应IP;
当浏览器及系统缓存中均无域名对应IP则进入路由器缓存中检查,以上三步均为客服端的DNS缓存;
如果hosts与本地DNS解析器缓存都没有相应的网址映射关系,首先会找TCP/ip参数中设置的首选DNS服务器( ISP(互联网服务提供商)DNS缓存),在此我们叫它本地DNS服务器,此服务器收到查询时,如果要查询的域名,包含在本地配置区域资源中,则返回解析结果给客户机,完成域名解析,此解析具有权威性。
DNS使用TCP和UDP端口53。
DNS请求包:https://juejin.im/post/5ab719c151882577b45ef9d9
- 如果本地DNS服务器本地区域文件与缓存解析都失效,则根据本地DNS服务器的设置(是否设置转发器)进行查询,如果未用转发模式,本地DNS就把请求发至13台根DNS,根DNS服务器收到请求后会判断这个域名(.com)是谁来授权管理,并会返回一个负责该顶级域名服务器的一个IP。本地DNS服务器收到IP信息后,将会联系负责.com域的这台服务器。这台负责.com域的服务器收到请求后,如果自己无法解析,它就会找一个管理.com域的下一级DNS服务器地址([http://baidu.com])给本地DNS服务器。当本地DNS服务器收到这个地址后,就会找[http://baidu.com]域服务器,重复上面的动作,进行查询,直至找到www . baidu .com主机
迭代DNS解析过程详解 https://blog.csdn.net/crazw/article/details/8986504
总结一下便是
①本机向local dns请求www.baidu.com
②local dns向根域请求www.baidu.com,根域返回com.域的服务器IP
③向com.域请求www.baidu.com,com.域返回baidu.com域的服务器IP
④向baidu.com请求www.baidu.com,返回cname www.a.shifen.com和a.shifen.com域的服务器IP
⑤向root域请求www.a.shifen.com
⑥向com.域请求www.a.shife.com
⑦向shifen.com请求
⑧向a.shifen.com域请求
⑨拿到www.a.shifen.com的IP
⑩localdns返回本机www.baidu.com cname www.a.shifen.com 以及 www.a.shifen.com的IP
-
上面提到的DNS请求包是UDP转发。UDP是什么?从OSI理解怎么发信息?
从TCP/IP图中可以看出,DNS服务属于OSI的应用层。应用层开始将加上报头的DNS请求包依次传到传输层。这里我们假定它传输层走的UDP “IP地址:53端口”。
** UDP ** 是用户数据报协议。** 也就是说他传送的是一个又一个数据包,与之相应的TCP传输的“流” ** 。 它利用IP提供面向 ** 无连接 ** 的通信服务,将应用程序发来的数据在收到的那一刻,立刻按照原样发送到网络上的一种机制,并不能保证它们能到达目的地。即使是出现网络拥堵的情况下,UDP也无法进行 ** 流量控制 ** 等避免网络拥塞的行为。此外,传输途中如果出现了** 丢包,UDP也不负责重发 ** 。甚至当出现包的到达顺序乱掉时也没有纠正的功能。如果需要这些** 细节控制 ** ,那么不得不交给由采用UDP的应用程序去处理。换句话说,UDP将部分控制转移到应用程序去处理,自己却只提供作为传输层协议的最基本功能。UDP有点类似于用户说什么听什么的机制,但是需要用户充分考虑好上层协议类型并制作相应的应用程序。
** UDP头部8字节。与之对比的TCP,头部大很多,开销20字节。**
TCP与UDP区别总结:
1、TCP面向连接(如打电话要先拨号建立连接);UDP是无连接的,即发送数据之前不需要建立连接
2、TCP提供可靠的服务。也就是说,通过TCP连接传送的数据,无差错,不丢失,不重复,且按序到达;UDP尽最大努力交付,即不保 证可靠交付
3、TCP面向字节流,实际上是TCP把数据看成一连串无结构的字节流;UDP是面向报文的
UDP没有拥塞控制,因此网络出现拥塞不会使源主机的发送速率降低(对实时应用很有用,如IP电话,实时视频会议等)
4、每一条TCP连接只能是点到点的;UDP支持一对一,一对多,多对一和多对多的交互通信
5、TCP首部开销20字节;UDP的首部开销小,只有8个字节
6、TCP的逻辑通信信道是全双工的可靠信道,UDP则是不可靠信道
这里看好像数据就从传输层到目的ip主机的对应传输层直接连通起来了,这里就是因为传输层下面一层 ** 数据链路层 ** 实现了透明传输的。** 透明传输 ** 如何办到呢?
网络层传输的包(packet,又称分组),在数据链路层中传输的是“帧”(frame)。数据包到达数据链路层后加上数据链路层的协议头和协议尾就构成了一个数据帧。在每个帧的前部加上一个帧头部,在帧的结尾处加上一个帧尾部,把网络层的数据包作为帧的数据部分,就构成了一个完整帧。帧头和帧尾就是作为帧的起始和结束标志,也就是帧边界。
帧结构
帧头部:
这里补充前篇数据链路层中没有说到的一点:在以太局域网中,由于数据链路层分成了LLC子层和MAC子层这两层,所以来自网络层的IP数据报在到达数据链路层后先要经过LLC子层和MAC子层的协议头封装,最终形成数据链路层的以太网MAC帧。
由数据包封装成的数据帧其大小是受对应的数据链路层协议的** MTU(最大传输单元)** 限制的。
如以太网数据链路层封装网络层IP 包的MTU 值为1500 字节(这是指帧中数据部分,也就是来自网络层整个数据分组,最大不能超过1500 字节,但不包括帧头和帧尾部分)。同时,帧还有最小大小限制,如以太网帧中封装的IP 包最小值为46 字节,如果封装的IP 包小于最小帧要求时,就要用一些特殊字符进行填充,以满足对应链路中传输最小帧的限制。
在发送端数据链路层中的帧到达** 物理层 ** 后就会以比特为单位进行传输,而不是以帧为单位进行传输。尽管在并行传输方式中,可以一次传输一个或多个字节,但每条线路中的传输单位还是比特。要使接收端的数据链路层对从物理层传输而来的一串串比特流以帧为单位进行区分,我们需要进行 ** 帧同步 **。
帧同步方法的基本同步原理:字节计数法、字符填充的首尾定界符法、比特填充的首尾定界符法、违法编码法。
这里仅介绍字符填充的首尾定界符法
该同步方法是用一些特定的控制字符来定界一个帧的起始与结束,如IBM 的BSC 协议在每个数据块的头部用一个或多个同步字符“SYN”来标记数据块的开始;尾部用字符“ETX”来标记数据决的结束。图5-8 所示的是要传输一个“ADFGJ”的字符串,在帧的头部加上了两个SYN 控制字符,用于标识该帧的开始,在结束位置加了ETX 控制字符,用于标识该帧的结束。
另外,为了不使数据信息中与以上特定字符相同的字符被误判为帧的首尾定界符,可以在这种数据帧的帧头填充一个转义控制字符(Data Link Escape-Start of TeXt,DLE),这就属于“透明传输”的范围了。
接收端可以区分每个数据帧的起始和结束了,但是还没有解决数据正确传输的两方面问题:一是如果有帧出现了错误怎么办?二是如果有帧丢失了怎么办?这都是数据链路层确保向网络层提供可靠数据传输服务要解决的问题,也就是数据链路层的 差错控制 功能。
差错检测在数据链路层检测数据传输错误的方法一般是通过对差错编码进行校验来实现,常见的校验方法有奇偶校验码(Parity Check Code,PCC)、循环冗余校验(Cyclic RedundancyCheck,CRC)两种。它们都统称为检错码(error-detecting code)。
1可能会变成0,0可能会变成1.这就叫做比特差错。在一段时间内传输错误的比特占所传输比特总数的比率称为误码率。目前在数据链路层广泛使用了循环冗余检测CRC( Cyclic Redundancy Check)的检错技术。CRC运算就是在数据M后面添加供差错检测用的n位冗余码。为了检错而添加的冗余码常称为帧检验序列FCS(Frame Check Sequence).在CRC检测的基础上增加帧编号、确认、重传机制。
CRC 其根本思想就是先在要发送的帧后面附加一个数(这个就是用来校验的校验码,但要注意,这里的数也是二进制序列的,下同),生成一个新帧发送给接收端。当然,这个附加的数不是随意的,它要使所生成的新帧能与发送端和接收端共同选定的某个特定数整除(注意,这里不是直接采用二进制除法,而是采用一种称之为“模2除法”)。到达接收端后,再把接收到的新帧除以(同样采用“模2除法”)这个选定的除数。因为在发送端发送数据帧之前就已通过附加一个数,做了“去余”处理(也就已经能整除了),所以结果应该是没有余数。如果有余数,则表明该帧在传输过程中出现了差错。
传输还需要考虑流量控制。两层含义一是发送端的数据发送速度与接收端的数据接收速度要匹配,否则接收端来不及接收就会造成数据在传输过程中的丢失。二是发送端的数据发送速度要与线路上的承载速率(与线路信道带宽有关)相匹配,否则也会造成数据在传输过程中的丢失。实际的数据链路层流量控制中,更多的是采用滑动窗口机制来进行流量控制的.
“滑动窗口机制”中的“窗口”是指发送端和接收端的缓存空间大小;“滑动”的意思是指缓存空间中存放的未处理帧数是变化的,发送端一次可以连续发送多个帧,并且在其缓存空间中保存所有已发, 发送端在收到确认帧后会删除原来保存在缓存中的待重发帧,接收端也可以在缓存空间中保存来不及处理的帧,当接收端向网络层提交一个帧后也会删除原来保存在缓存中的帧。大大提高了数据传输的效率。
数据链路层完成主要功能、服务后,发送端物理层以比特位方式一位位地传输到接收端的物理层,然后接收端的物理层把比特流向数据链路层传输,到达后又要将比特流封装成数据帧,这就是数据链路层的帧组装方式了。
发送端物理层以比特位方式一位位地传输到接收端的物理层,怎么传??
前面提到了MAC子层。
数据链路层主要功能、服务后,下面我们再来简单介绍工作在数据链路层上的主要网络设备。在常见的网络设备中,如网卡、网桥和二层交换机。
交换机
实际上就是一个多接口的网桥, 以太网交换机的每个接口都直接与一个单个主机或另一个集线器相连, 可以很容易实现VLAN(虚拟局域网)。在计算机网络系统中,交换机是针对共享工作模式的弱点而推出的。交换机拥有一条高带宽的背部总线和内部交换矩阵。
交换机的所有的端口都挂接在这条背部总线上,当控制电路收到数据包以后,处理端口会查找内存中的地址对照表以确定目的MAC(网卡的硬件地址)的NIC(网卡)挂接在哪个端口上,通过内部交换矩阵迅速将数据包传送到目的端口。目的MAC若不存在,交换机才广播到所有的端口,接收端口回应后交换机会“学习”新的地址,并把它添加入内部地址表中。
交换机工作于OSI参考模型的第二层,即数据链路层。交换机内部的CPU会在每个端口成功连接时,通过ARP协议学习它的MAC地址,保存成一张ARP表。在今后的通讯中,发往该MAC地址的数据包将仅送往其对应的端口,而不是所有的端口。因此,交换机可用于划分数据链路层广播,即冲突域;但它不能划分网络层广播,即广播域。(ARP下面有解释)
网桥
网桥工作在数据链路层, 根据MAC帧的目的地址对收到的帧进行转发和过滤.
路由器
路由器(Router)是一种计算机网络设备,提供了路由与转发两种重要机制,可以决定数据包从来源端到目的端所经过的路由路径(host到host之间的传输路径),这个过程称为路由;将路由器输入端的数据包移送至适当的路由器输出端(在路由器内部进行),这称为转送。路由工作在OSI模型的第三层——即网络层,例如IP协议。
路由器的一个作用是连通不同的网络,另一个作用是选择信息传送的线路。 路由器与交换器的差别,路由器是属于OSI第三层的产品,交换器是OSI第二层的产品(这里特指二层交换机)。
=================================================================================
客户端通过DNS获得了www.BAIDU.com 的ip了。客户端浏览器发起一个HTTP会话到220.161.27.48,然后通过TCP进行封装数据包,输入到网络层。
http包格式:一个HTTP请求报文由请求行(request line)、请求头部(header)、空行和请求数据4个部分组成。
1.请求头
1).GET
最常见的一种请求方式,当客户端要从服务器中读取文档时,当点击网页上的链接或者通过在浏览器的地址栏输入网址来浏览网页的,使用的都是GET方式。GET方法要求服务器将URL定位的资源放在响应报文的数据部分,回送给客户端。使用GET方法时,请求参数和对应的值附加在URL后面,利用一个问号(“?”)代表URL的结尾与请求参数的开始,传递参数长度受限制。
2)POST
对于上面提到的不适合使用GET方式的情况,可以考虑使用POST方式,因为使用POST方法可以允许客户端给服务器提供信息较多。POST方法将请求参数封装在HTTP请求数据中,以名称/值的形式出现,可以传输大量数据,这样POST方式对传送的数据大小没有限制,而且也不会显示在URL中。
3).HEAD
HEAD就像GET,只不过服务端接受到HEAD请求后只返回响应头,而不会发送响应内容。当我们只需要查看某个页面的状态的时候,使用HEAD是非常高效的,因为在传输的过程中省去了页面内容。
状态码(Status-Code)都是三位数字的,分为 5 大类共 33 种。
如:
状态码 说明 请求行例子
1xx 表示通知信息的,如请求收到了或正在进行处理
2xx 表示成功 HTTP/1.1 200 OK
3xx 表示重定向
4xx 表示客户端的差错,如请求链接为不存在 HTTP/1.1 404 Not Found
5xx 表示服务器的差错
HTTP 响应
HTTP是无状态无连接的,所以每次发送带上cookie或者sessionid告诉服务器之前状态。但是Http1.1可以实现keep-alive 连接。
Http基于TCP。TCP是面向连接的,为了实现无连接的http通信,就需要收到HTTP响应之后断开TCP连接。
==================================================================================
传输层:在客户端的传输层,把HTTP会话请求分成报文段,添加源和目的端口,如服务器使用80端口监听客户端的请求,客户端由系统随机选择一个端口如5000,与服务器进行交互,服务器把相应的请求返回给客户端的5000端口。然后使用IP层的IP地址查找目的端。
TCP是什么?
TCP 提供一种面向连接的、可靠的字节流服务
在一个 TCP 连接中,仅有两方进行彼此通信。广播和多播不能用于 TCP
TCP 使用校验和,确认和重传机制来保证可靠传输
TCP 给数据分节进行排序,并使用累积确认保证数据的顺序不变和非重复
TCP 使用滑动窗口机制来实现流量控制,通过动态改变窗口的大小进行拥塞控制
注意:TCP 并不能保证数据一定会被对方接收到,因为这是不可能的。TCP 能够做到的是,如果有可能,就把数据递送到接收方,否则就(通过放弃重传并且中断连接这一手段)通知用户。因此准确说 TCP 也不是 100% 可靠的协议,它所能提供的是数据的可靠递送或故障的可靠通知。
SYN攻击
什么是 SYN 攻击(SYN Flood)?
在三次握手过程中,服务器发送 SYN-ACK 之后,收到客户端的 ACK 之前的 TCP 连接称为半连接(half-open connect)。此时服务器处于 SYN_RCVD 状态。当收到 ACK 后,服务器才能转入 ESTABLISHED 状态.
SYN 攻击指的是,攻击客户端在短时间内伪造大量不存在的IP地址,向服务器不断地发送SYN包,服务器回复确认包,并等待客户的确认。由于源地址是不存在的,服务器需要不断的重发直至超时,这些伪造的SYN包将长时间占用未连接队列,正常的SYN请求被丢弃,导致目标系统运行缓慢,严重者会引起网络堵塞甚至系统瘫痪。
SYN 攻击是一种典型的 DoS/DDoS 攻击。
如何检测 SYN 攻击?
检测 SYN 攻击非常的方便,当你在服务器上看到大量的半连接状态时,特别是源IP地址是随机的,基本上可以断定这是一次SYN攻击。在 Linux/Unix 上可以使用系统自带的 netstats 命令来检测 SYN 攻击。
如何防御 SYN 攻击?
SYN攻击不能完全被阻止,除非将TCP协议重新设计。我们所做的是尽可能的减轻SYN攻击的危害,常见的防御 SYN 攻击的方法有如下几种:
缩短超时(SYN Timeout)时间
增加最大半连接数
过滤网关防护
SYN cookies技术
面向连接协议和无连接协议
- 面向连接协议:会在通信计算机之间建立并维护一个连接,并且在通信过程中监视连接状态。通过网络传输的每个数据包都会有一个确认,发送端计算机会记录状态信息来确保每个数据包都被正确无误的接收了,并且在需要时会重发数据。当数据传输结束后,发送端和接收端计算机会以适当方式关闭连接。
- 无连接协议:以单向方式向目的发送数据报,不承担通知目的计算机关于数据发送的职责。目的计算机接收到数据后也不需要向源计算机返回状态信息。
TCP:面向连接的传输协议
- TCP重要特性:
- TCP数据格式:
- TCP连接:TCP通过连接发送和接收数据,而这个连接必须根据TCP的规则进行请求、打开和关闭。TCP的功能之一是为应用程序提供访问网络的接口。这个接口是通过TCP端口提供的,而为了通过端口提供连接,必须打开TCP与应用程序的接口。 被动打开——某个应用程序进程通知TCP准备通过TCP端口接收连接,这样就会打开TCP到应用程序的连接,从而为参与连接请求做准备。 主动打开——程序要求TCP发起与另一台计算机的连接,这就是主动打开状态。
- 建立连接:三次握手总是发生在TCP连接建立的初期 。需要三次握手的原因——TCP的三次握手最主要是防止已过期的连接再次传到被连接的主机。
TCP流量控制(滑动窗口方法):接收端计算机利用“窗口”字段(也被称为“缓存大小”字段)来定义一个超过最后一个已确认序列号的序列号“窗口”,在这个范围内的序列号才允许发送端计算机进行发送。发送端计算机在没有接收到下一个确认消息之前不能发送超过这个窗口的序列号。
关闭连接:计算机A发送一个数据分段,其中的FIN标记设置为1。之后应用程序进入"fin-wait"状态。在这个状态下,计算机的TCP软件继续接受数据分段,并处理已经在序列中的数据分段,但不再从应用程序接收数据了。当计算机B接收到FIN数据分段时,它返回FIN确认信息,然后发送剩余的数据分段,通知本地应用程序接收到了FIN消息。计算机B向计算机A发送一个FIN数据分段,计算机A返回确认信息,连接就被关闭了。
==================================================================================
客户端的网络层不用关心应用层或者传输层的东西,主要做的是通过查找路由表确定如何到达服务器,期间可能经过多个路由器,这些都是由路由器来完成的工作,通过查找路由表决定通过那个路径到达服务器,其中用到路由选择协议
-
路由选择协议:因特网有两大类路由选择协议:
内部网关协议IGP(Interior Gateway Protocol)即在一个自治系统内部使用的路由选择协议。目前这类路由选择协议使用得最多,如RIP和OSPF协议。外部网关协议EGP(External Gateway Protocol)若源站和目的站处在不同的自治系统中,当数据报传到一个自治系统的边界时,就需要使用一种协议将路由选择信息传递到另一个自治系统中。这样的协议就是外部网关协议EGP。在外部网关协议中目前使用最多的是BGP-4。
- RIP协议
工作原理:
路由信息协议RIP是内部网关协议IGP中最先得到广泛使用的协议。RIP是一种分布式的基于距离向量的路由选择协议。RIP协议要求网络中的每一个路由器都要维护从它自己到其他每一个目的网络的距离记录。距离的解释:从一路由器到直接连接的网络的距离定义为1。从一个路由器到非直接连接的网络的距离定义为所经过的路由器数加1。RIP协议中的“距离”也称为“跳数”(hop count),因为每经过一个路由器,跳数就加1。这里的“距离”实际上指的是“最短距离”。RIP认为一个好的路由就是它通过的路由器的数目少,即“距离短”。RIP允许一条路径最多只能包含15个路由器。“距离”的最大值为16时即相当于不可达。可见RIP只适用于小型互联网。RIP不能在两个网络之间同时使用多条路由。RIP选择一个具有最少路由器的路由(即最短路由)哪怕还存在另一条高速(低时延)但路由器较多的路由。 - 外部网关协议 BGP
BGP是不同自治系统的路由器之间交换路由信息的协议。边界网关协议BGP只能是力求寻找一条能够到达目的网络且比较好的路由(不能兜圈子),而并非要寻找一条最佳路由。
BGP发言人:每一个自治系统的管理员要选择至少一个路由器作为该自治系统的“BGP发言人”。一般说来,两个BGP发言人都是通过一个共享网络连接在一起的,而BGP发言人往往就是BGP边界路由器,但也可以不是BGP边界路由器。
BGP交换路由信息:
一个BGP发言人与其他自治系统中的BGP发言人要交换路由信息,就要先建立TCP连接,然后在此连接上交换BGP报文以建立BGP会话(session),利用BGP会话交换路由信息。使用TCP连接能提供可靠的服务也简化了路由选择协议。使用TCP连接交换路由信息的两个BGP发言人,彼此成为对方的邻站或对等站。
NAT 网络地址转换
网络地址转换
NAT(网络地址转换):NAT路由器本身的一个IP,通过不同端口与本身身后的子网主机地址形成映射,进而子网多个主机可以通过以NAT路由器的一个IP地址访问外网
这要求NAT路由器要维护一个NAT转发表,记录端口到地址的映射关系
NAT缺点:
加重了路由器的负担
对P2P协议有阻碍作用,P2P协议不能感知到NAT路由器后面子网的主机
模糊了端口的作用,本来端口是为了表示进程而存在的,NAT中一个端口可以表示一个主机了
NAT优点:
扩展了IP地址,应该说IPv4到现在地址资源还没有枯竭,NAT给它续命是一个重要的原因
==================================================================================
客户端的链路层,包通过链路层发送到路由器,通过邻居协议查找给定IP地址的MAC地址,然后发送ARP请求查找目的地址,如果得到回应后就可以使用ARP的请求应答交换的IP数据包现在就可以传输了,然后发送IP数据包到达服务器的地址。
ARP(地址解析协议)
不管网络层使用的是什么协议,在实际网络的链路上传送数据帧时,最终还是必须使用硬件地址。每一个主机都设有一个 ARP 高速缓存(ARP cache),里面有所在的局域网上的各主机和路由器的 IP 地址到硬件地址的映射表。当主机 A 欲向本局域网上的某个主机 B 发送 IP 数据报时,就先在其 ARP 高速缓存中查看有无主机 B 的 IP 地址。如有,就可查出其对应的硬件地址,再将此硬件地址写入 MAC 帧,然后通过局域网将该 MAC 帧发往此硬件地址