计算机网络填坑

搞Web的话,是时时要和计算机网络打交道的,我在这里总结整理下自己遇到过的相关知识点。

1.常见的网络协议有几层, HTTP是在哪几层

这里写图片描述
这里写图片描述

物理层与数据链路层为上面的协议族提供服务我们一般很少接触。IP在网络层,TCP/UDP在传输层,应用层一般是我们经常接触的东西,HTTP、RTSP、FTP是应用层的协议。

2.UDP和TCP协议是哪层,这两个协议的技术特点是什么?

TCP(传输控制协议):提供IP环境下的数据可靠传输(一台计算机发出的字节流会无差错的发往网络上的其他计算机,而且计算机A接收数据包的时候,也会向计算机B回发数据包,这也会产生部分通信量),有效流控,全双工操作(数据在两个方向上能同时传递),多路复用服务,是面向连接,端到端的传输;面向连接:正式通信前必须要与对方建立连接。事先为所发送的数据开辟出连接好的通道,然后再进行数据发送,像打电话。TCP支持的应用协议:Telnet(远程登录)、FTP(文件传输协议)、SMTP(简单邮件传输协议)。TCP用于传输数据量大,可靠性要求高的应用。

UDP(用户数据报协议,User Data Protocol)面向非连接的(正式通信前不必与对方建立连接,不管对方状态就直接发送,像短信,QQ),不能提供可靠性、流控、差错恢复功能。UDP用于一次只传送少量数据,可靠性要求低、传输经济等应用。UDP支持的应用协议:NFS(网络文件系统)、SNMP(简单网络管理系统)、DNS(主域名称系统)、TFTP(通用文件传输协议)等。

总结:

  • TCP:面向连接、传输可靠(保证数据正确性,保证数据顺序)、用于传输大量数据(流模式)、速度慢,建立连接需要开销较多(时间,系统资源)。

  • UDP:面向非连接、传输不可靠、用于传输少量数据(数据包模式)、速度快**

3.一些特殊工具/应用的协议, 诸如邮件的SMTP协议,PING对应的ICMP协议,这类玩意的特点。

SMTP(Simple Mail Transfer Protocol)即简单邮件传输协议,它是一组用于由源地址到目的地址传送邮件的规则,由它来控制信件的中转方式。SMTP协议属于TCP/IP协议簇,它帮助每台计算机在发送或中转信件时找到下一个目的地。通过SMTP协议所指定的服务器,就可以把E-mail寄到收信人的服务器上了,整个过程只要几分钟。SMTP服务器则是遵循SMTP协议的发送邮件服务器,用来发送或中转发出的电子邮件。SMTP 是一种TCP协议支持的提供可靠且有效电子邮件传输的应用层协议。

SMTP详见链接

4.HTTP的常见状态码是什么,对应的语义是什么。

100:信息类,表示web浏览器请求,正在进一步的处理中
200:成功,表示用户请求被正确接收正在进一步的处理中 200 OK
300:表示请求没有成功,客户端必须采取进一步的动作
400:客户端错误,表示客户端提交的请求有错误 例如:404 NOT Found,意味着
请求中所引用的文档不存在
500:服务器错误 表示服务器不能完成对请求的处理,如500

详见我的另一篇博客:链接

5.TCP的连接操作(三次握手)?

图示:
这里写图片描述

过程:

  1. 第一步:客户端A中的一个TCP进程要与服务器B中的一个TCP进程建立连接,首先是A中的TCP进程向B中的TCP进程发送特殊的TCP报文段(标志位SYN被置1,因此该报文段也称为:SYN报文段)。另外,客户端会随机地选择一个初始序号(client_isn),并且将这个序号作为该报文段中的“序号”字段的值。

  2. 第二步:B收到SYN报文段后,会为TCP连接分配TCP缓存和变量,并向该客户TCP进程发送允许连接的报文段(这里会引起:SYN洪泛攻击)。该允许报文段包括了三个主要的数据:标志位SYN和ACK被置1,确认号字段被赋值为:client_isn+1,服务器也选择自己初始序号(server_isn),并且把该初始序号放在允许报文段的序号字段。因此,允许报文段又称为:SYNACK报文段。

  3. 第三步:收到SYNACK报文段后,客户端也给该连接分配缓存和变量,并且还要发送一个确认报文段给服务器。这个报文段是建立连接发送的最后一个报文段,报文段中的ACK被置1,确认号为:server_isn+1,同时要注意:此时连接已经建立了,所以标志位SYN是被置为0的。OK,到这里TCP连接已经被建立了,可以进行数据传输了。

扩展补充:

  • SYN攻击利用的是TCP的三次握手机制,攻击端利用伪造的IP地址向被攻击端发出请求,而被攻击端发出的响应 报文将永远发送不到目的地,那么被攻击端在等待关闭这个连接的过程中消耗了资源,如果有成千上万的这种连接,主机资源将被耗尽,从而达到攻击的目的。
    详情:链接

  • 位码即tcp标志位,有6种标示:SYN(synchronous建立联机) ACK(acknowledgement 确认) PSH(push传送) FIN(finish结束) RST(reset重置) URG(urgent紧急)Sequence number(顺序号码) Acknowledge number(确认号码)

  • TCP连接关闭的正常方法是四次握手。但四次握手不是关闭TCP连接的唯一方法. 有时,如果主机需要尽快关闭连接(或连接超时,端口或主机不可达),RST (Reset)包将被发送. 注意,由于RST包不是TCP连接中的必须部分, 可以只发送RST包(即不带ACK标记). 但在正常的TCP连接中RST包可以带ACK确认标记。

  • ICMP协议是TCP/IP协议集中的一个子协议,属于网络层协议,主要用于在主机与路由器之间传递控制信息,包括报告错误、交换受限控制和状态信息等。当遇到IP数据无法访问目标、IP路由器无法按当前的传输速率转发数据包等情况时,会自动发送ICMP消息。我们可以通过Ping命令发送ICMP回应请求消息并记录收到ICMP回应回复消息,通过这些消息来对网络或主机的故障提供参考依据。

为什么不是两次或者更多?

  1. 如果A向B请求连接,B同意了为此次连接分配了资源和变量,然后,会返回允许报文段给A,若B的应答没有到达A端,A认为连接未建立,而B认为建立了。B会在一段时间内保留分配的资源,如果大量A这样请求,B会崩溃(SYN洪泛攻击就是这个原理)。而“三次握手”的话,我们就可以知道这次连接是没有建立成功的。

  2. 为了防止已失效的连接请求报文段突然又传送到了服务端,因而产生错误。这个主要是因为SYN报文段在传输过程中耽误了太久的时间,客户端A就以为丢失了,已经重新发送了SYN报文段,建立好了连接。但是我们的服务器B不知道这个事情,同样会为它分配资源,并且返回确认报文,但是客户端收到后,看到后不会去理会它,这样就会出现和第一种一样的情况,,A认为连接未建立,而B认为建立了。B会在一段时间内保留分配的资源,如果大量A这样请求,B会崩溃。

  3. 三次解决的事情就不要更多次了。

6.TCP的连接的断开(四次挥手)?

这里写图片描述

  • 客户端A发送一个“FIN”报文段给服务器B,其中该报文中的FIN标志位被置为1。
  • 服务器B收到了FIN报文段后,它会向客户端发送“ACK”报文段,表示允许断开该TCP连接了。同时它还会通知高层应用程序,客户端已经请求释放连接。此时客户端已经不再会给服务器发送数据了,但是服务器到客户端的TCP连接还没有断开,所以服务器还是可以向客户端发送数据,此时状态称为“半关闭状态”。
  • 当服务端的高层程序已经没有数据要发送了,它会通知TCP可以断开连接了,这时候,服务器就会向客户端发送FIN报文段。
  • 客户端收到FIN报文段后,客户端会发送“ACK”报文段给服务器,同时客户端会进入一个叫“TIME-WAIT”的状态,需要再等待两个报文寿命(MSL)时间后,才进入最后的“CLOSE”状态。

补充:

  • ACK : TCP协议规定,只有ACK=1时有效,也规定连接建立后所有发送的报文的ACK必须为1。

  • SYN(SYNchronization) : 在连接建立时用来同步序号。当SYN=1而ACK=0时,表明这是一个连接请求报文。对方若同意建立连接,则应在响应报文中使SYN=1和ACK=1. 因此, SYN置1就表示这是一个连接请求或连接接受报文。

  • FIN (finis)即完,终结的意思, 用来释放一个连接。当 FIN = 1 时,表明此报文段的发送方的数据已经发送完毕,并要求释放连接。

  • 为什么要等待2个MSL后才关闭整个连接?确保服务器在最后阶段发送给客户端的数据,已经客户端发送给服务器的最后一个“ACK”报文能够正确地被接收,防止因个别传输错误导致连接释放失败。

7.TCP是怎么确保网络传输的可靠性的?

这个问题可以先看看这个讨论:tcp 的可靠性到底指的是什么?

TCP提供一种面向连接的、可靠的字节流服务。
  面向连接:意味着两个使用TCP的应用(通常是一个客户和一个服务器)在彼此交换数据之前必须先建立一个TCP连接。在一个TCP连接中,仅有两方进行彼此通信。广播和多播不能用于TCP。
 
TCP通过下列方式来提供可靠性:

  1. 应用数据被分割成TCP认为最适合发送的数据块。这和UDP完全不同,应用程序产生的数据报长度将保持不变。(将数据截断为合理的长度)

  2. 当TCP发出一个段后,它启动一个定时器,等待目的端确认收到这个报文段。如果不能及时收到一个确认,将重发这个报文段。(超时重发)

  3. 当TCP收到发自TCP连接另一端的数据,它将发送一个确认。这个确认不是立即发送,通常将推迟几分之一秒 。(对于收到的请求,给出确认响应) (之所以推迟,可能是要对包做完整校验)

  4. TCP将保持它首部和数据的检验和。这是一个端到端的检验和,目的是检测数据在传输过程中的任何变化。如果收到段的检验和有差错,TCP将丢弃这个报文段和不确认收到此报文段。 (校验出包有错,丢弃报文段,不给出响应,TCP发送数据端,超时时会重发数据)

  5. 既然TCP报文段作为IP数据报来传输,而IP数据报的到达可能会失序,因此TCP报文段的到达也可能会失序。如果必要,TCP将对收到的数据进行重新排序,将收到的数据以正确的顺序交给应用层。 (对失序数据进行重新排序,然后才交给应用层)

  6. 既然IP数据报会发生重复,TCP的接收端必须丢弃重复的数据。(对于重复数据,能够丢弃重复数据)

  7. TCP还能提供流量控制。TCP连接的每一方都有固定大小的缓冲空间。TCP的接收端只允许另一端发送接收端缓冲区所能接纳的数据。这将防止较快主机致使较慢主机的缓冲区溢出。(TCP可以进行流量控制,防止较快主机致使较慢主机的缓冲区溢出)TCP使用的流量控制协议是可变大小的滑动窗口协议。

  8. 字节流服务::
    两个应用程序通过TCP连接交换8bit字节构成的字节流。TCP不在字节流中插入记录标识符。我们将这称为字节流服务(bytestreamservice)。
    TCP对字节流的内容不作任何解释:: TCP对字节流的内容不作任何解释。TCP不知道传输的数据字节流是二进制数据,还是ASCII字符、EBCDIC字符或者其他类型数据。对字节流的解释由TCP连接双方的应用层解释。

8.向浏览器输入一个URL链接后,接下来发生的事情?

(把这个答案联系握手和挥手,泛洪攻击最好)
知乎上关于这个问题的讨论:链接
最强回答,从键盘,电流,物理再到计算机网络和系统:链接 github
老外的很好的一个回答:链接

这里给下大概流程和DNS服务器的解释:(节选自知乎)

  1. 首先是浏览器程序开始解析你的地址。把地址分为域名和路径(如何含有的话)两个部分,然后连接DNS服务器,查询这个域名的IP地址。(完整URL,包括协议,域名,路径,端口)
  2. 获得DNS返回的IP地址之后,浏览器开始按照HTTP协议的格式向该IP地址和路径请求内容。(此时的DNS服务器处理也大有文章)(此时发生TCP连接三次握手)
  3. 服务器收到某个HTTP请求之后,就会把内容按照HTTP协议的格式返回这个请求的客户端。
  4. 浏览器收到服务器返回的内容后,开始渲染并显示出来。
  5. 浏览器与服务器对话结束。(四次挥手)

DNS服务器:
DNS具有两层含义:①一个由分层的DNS服务器实现的分布式数据库;②一个允许主机查询分布式数据库的应用层协议。有三种类型的DNS服务器:根DNS服务器、顶级DNS服务器和权威DNS服务器。这些服务器以下图的层次结构组织起来。
这里写图片描述
除此之外,还有一类重要的DNS,称为本地DNS服务器。严格来说本地DNS服务器并不属于DNS服务器的层次结构,但它在整个查询的过程中却扮演着重要的角色。首先,浏览器所在的主机向本地DNS服务器发送一个含有知乎域名的DNS查询报文。本地DNS服务器把查询报文转发到根DNS服务器,该根DNS服务器注意到其com后缀并向本地DNS服务器返回com的顶级域名服务器的IP地址。该本地DNS服务器再次向comDNS服务器发送查询请求,comDNS服务器注意到其http://zhihu.com后缀并用负责该域名的权威DNS服务器的IP地址作为回应。最后,本地域名服务器将含有http://zhihu.com的IP地址的响应报文发送给客户端主机。
这里写图片描述
这里的查询过程是包含递归查询和迭代查询的,客户端主机发送给本地服务器的查询是递归查询,而后面的三个查询是迭代查询。

原文地址:https://www.cnblogs.com/zhangmingzhao/p/8455403.html