计算机网络

七层模型(OSI)
    七层模型大而全,但是比较复杂,有模型理论,而没有实际应用。OSI 中的上面4层(应用层、表示层、会话层、传输层)为高层,定义了程序的功能;下面3层(网络层、数据链路层、物理层)为底层,主要是处理面向网络端到端的数据流。

TCP/IP 四层模型
    四层模型,是由实际应用发展总结出来的,包含应用层,传输层,网际层,网络接口层。不过从实质讲,TCP/IP 只有最上面三层,最下面一层没有什么具体内容,没有具体描述这一层的实现,只是要求能够给其上层(网络层),一个访问接口,以便在其上传递 IP 分组。

网络五层模型
    五层模型出现在计算机网络教学中,是对七层和四层模型的一个折中,综合了 OSI 和 TCP/IP 体系结构的优点,既简洁又能将概念阐述清楚

计算机网络的五层模型

  • 应用层:用于用户交互,工作在操作系统的用户态,负责给应用程序提供统一的接口,HTTP/HTTPS,DNS,FTP
  • 传输层:提供端到端的数据传输,TCP/UDP协议。需要端口号将应用层序区分开,一般80端口是web服务器使用,22端口是远程登录服务器使用,浏览器中每一个标签栏就是一个独立的进程,会由操作系统分配临时的端口号使用。
  • 网络层:跨网络传输,负责数据的路由、转发、分片,IP协议,ICMP等,IP报文大小限制MTU(以太网中一般为1500字节),IP地址为32位,分为4段,每段8位。IP地址分为了网络号(标识该IP地址属于哪个子网)和主机号(标识同一子网下不同的主机)。通过子网掩码才能计算出IP地址的网络号和主机号。
    路由寻址工作就是要找到目标地址的子网,找到后进而把数据包转发给对应的网络内。由路由器完成工作。
    数据链路层和物理层在有的定义里面归为一类——网络接口层。
  • 数据链路层:负责数据的封帧和差错检测,以及mac寻址,连接物理硬件,mac地址,在以太网内使用MAC地址进行设备间通信,可以通过ARP协议获取通讯要用到的MAC地址。
  • 物理层:提供物理硬件支持,负责在物理网络中传输数据帧。

HTTP(HyperText Transfer Protocol,超文本传输协议)

http基本概念(状态码,常问)

超文本:即文本(文字、图片、视频等的混合体)中有超链接,可以从一个超文本跳转到另一个超文本。html就是最常见的超文本。http是基于tcp传输协议进行通信的。
http的状态码:

1xx 类状态码属于提示信息,是协议处理中的一种中间状态,实际用到的比较少。

2xx 类状态码表示服务器成功处理了客户端的请求,也是我们最愿意看到的状态。

「200 OK」是最常见的成功状态码,表示一切正常。如果是非 HEAD 请求,服务器返回的响应头都会有 body 数据。

「204 No Content」也是常见的成功状态码,与 200 OK 基本相同,但响应头没有 body 数据。

「206 Partial Content」是应用于 HTTP 分块下载或断点续传,表示响应返回的 body 数据并不是资源的全部,而是其中的一部分,也是服务器处理成功的状态。

3xx 类状态码表示客户端请求的资源发生了变动,需要客户端用新的 URL 重新发送请求获取资源,也就是重定向。

「301 Moved Permanently」表示永久重定向,说明请求的资源已经不存在了,需改用新的 URL 再次访问。

「302 Found」表示临时重定向,说明请求的资源还在,但暂时需要用另一个 URL 来访问。

301 和 302 都会在响应头里使用字段 Location,指明后续要跳转的 URL,浏览器会自动重定向新的 URL。

「304 Not Modified」不具有跳转的含义,表示资源未修改,重定向已存在的缓冲文件,也称缓存重定向,也就是告诉客户端可以继续使用缓存资源,用于缓存控制。

4xx 类状态码表示客户端发送的报文有误,服务器无法处理,也就是错误码的含义。

「400 Bad Request」表示客户端请求的报文有错误,但只是个笼统的错误。

「403 Forbidden」表示服务器禁止访问资源,并不是客户端的请求出错。

「404 Not Found」表示请求的资源在服务器上不存在或未找到,所以无法提供给客户端。

5xx 类状态码表示客户端请求报文正确,但是服务器处理时内部发生了错误,属于服务器端的错误码。

「500 Internal Server Error」与 400 类型,是个笼统通用的错误码,服务器发生了什么错误,我们并不知道。

「501 Not Implemented」表示客户端请求的功能还不支持,类似“即将开业,敬请期待”的意思。

「502 Bad Gateway」通常是服务器作为网关或代理时返回的错误码,表示服务器自身工作正常,访问后端服务器发生了错误。

「503 Service Unavailable」表示服务器当前很忙,暂时无法响应客户端,类似“网络服务正忙,请稍后重试”的意思。

http报文的结构:

  • host字段:指定服务器的域名
  • content-length字段:表明本次回应的数据长度
  • connection字段:用于客户端要求服务器使用http长连接机制,以便其他请求复用。
  • content-Type字段:用于服务器回应时,告诉客户端,本次数据是什么格式。
  • Content-Encoding字段:说明数据的压缩方法,表示服务器返回的数据使用了什么压缩格式。

get和post区别
根据RFC规范定义
GET:GET语义是从服务器获取指定的资源。这个资源可以是静态的文本、页面、图片视频等。GET 请求的参数位置一般是写在 URL 中,URL 规定只能支持 ASCII,所以 GET 请求的参数只允许 ASCII 字符 ,而且浏览器会对 URL 的长度有限制(HTTP协议本身对 URL长度并没有做任何规定)。(比如,访问网页)GET通过URL访问,?表示资源位置,&区分不同变量。GET只发送一次报文。
POST:POST语义是根据请求负荷(报文body)对指定的资源做出处理,具体的处理方式视资源类型而不同。POST 请求携带数据的位置一般是写在报文 body 中,body 中的数据可以是任意格式的数据,只要客户端与服务端协商好即可,而且浏览器不会对 body 大小做限制。(比如,评论留言)POST在body主体内申请访问。POST发送两次报文,第一次发送http的head头部,第二次发送body。

http和https的区别
HTTP 是超文本传输协议,信息是明文传输,存在安全风险的问题。HTTPS 则解决 HTTP 不安全的缺陷,在 TCP 和 HTTP 之间(应用层之下,传输层之上,工作)加入了 SSL/TLS 安全协议,使得报文能够加密传输。
HTTP 连接建立相对简单, TCP 三次握手之后便可进行 HTTP 的报文传输。而 HTTPS 在 TCP 三次握手之后,还需进行 SSL/TLS 的握手过程,才可进入加密报文传输。
两者的默认端口不一样,HTTP 默认端口号是 80,HTTPS 默认端口号是 443。
HTTPS 协议需要向 CA(证书权威机构)申请数字证书,来保证服务器的身份是可信的。

TCP
重传机制:
TCP中发送端的数据到达接收主机时,接收端主机会返回一个确认应答消息,表示已收到消息。

超时重传
设置定时器,如果超过指定时间后,还没有收到对方的ACK确认应答报文,就会重发该数据。
快重传

快重传就是当收到三个相同的ACK报文时,会在定时器过期之前,重传丢失的报文段。根据TCP不同的实现,重传Seq2和重传Seq2、Seq3、Seq4、Seq5两种情况都有可能。为了解决不知道该重传哪些TCP报文,于是就有了SACK方法。
SACK(选择性确认)
这种方式需要在 TCP 头部「选项」字段里加一个 SACK 的字段,它可以将缓存的序列发送给发送方,这样发送方就可以知道哪些数据收到了,哪些数据没收到,知道了这些信息,就可以只重传丢失的数据。

D-SACK(Duplicate SACK,使用SACK来告诉发送方有哪些数据被重复接收了)

滑动窗口:
窗口大小就是指无需等待确认应答,而可以继续发送数据的最大值。
在操作系统开辟的一个缓存空间,发送方主机在等到确认应答返回之前,必须在缓冲区中保留已发送的数据,如果按期收到确认应答,此时数据就可以从缓存区中清除。

TCP三大特性

  • 面向连接:一定是一对一才能连接,不像UDP协议可以一个主机同时向多个主机发送消息,也就是一对多是无法做到的。
  • 可靠的:无论网络链路中出现了怎样的链路变化,TCP都可以保证一个报文一定能够到达接收端。
  • 字节流:用户消息通过TCP协议传输时,消息可能会被操作系统【分组】成多个TCP报文,如果接收方的程序不知道消息的边界,是无法读出一个有效的用户消息的。并且TCP报文是【有序的】,当【前一个】TCP报文没有收到的时候,即使它先收到了后面的TCP报文,那么也不能仍给应用层去处理,同时对【重复】的TCP报文会自动丢弃。

TCP和UDP的区别

  • 连接:TCP是面向连接的传输层协议,传输数据之前要先建立连接;UDP是不需要连接,即可传输数据。
  • 服务对象:TCP是一对一的两点服务,即一条连接只有两个端点;UDP支持一对一,一对多,多对多的交互通信
  • 可靠性:TCP是可靠交付数据的,数据可以无差错、不丢失、不重复、按序到达。UDP尽最大努力交付,不保证可靠传输,但是可以基于UDP实现一个可靠的传输协议。
  • 拥塞控制、流量控制。TCP有拥塞控制和流量控制机制,保证数据传输的安全性。UDP没有,即使网络非常拥堵了,也不会影响UDP的发送效率
  • 首部开销:TCP首部长度较长,没有使用【选项】字段时是20个字节,如果使用了选项,字段则会变长,会有一定的开销。UDP首部只有8哥字节,而且固定不变的。
  • 传输方式:TCP是流式传输,没有边界,但保证顺序和可靠。UDP是一个包一个包的发送,是有边界的,但可能会丢包和乱序。
  • 分片不同:TCP数据大小如果大于MSS大小,则会在传输层进行分片,目标主机收到后,也同样在传输层组装TCP数据包,如果中途丢失了一个分片,则只需要传输丢失的那个分片。UDP的数据大小如果大于MTU大小,则会在IP层进行分片,目标主机收到后,在IP层组装完数据,接着再传给传输层。

三次握手、四次挥手

soket编程

服务端和客户端初始化 socket,得到文件描述符;

服务端调用 bind,将 socket 绑定在指定的 IP 地址和端口;

服务端调用 listen,进行监听;

服务端调用 accept,等待客户端连接;

客户端调用 connect,向服务端的地址和端口发起连接请求;

服务端 accept 返回用于传输的 socket 的文件描述符;

客户端调用 write 写入数据;服务端调用 read 读取数据;

客户端断开连接时,会调用 close,那么服务端 read 读取数据的时候,就会读取到了 EOF,待处理完数据后,服务端调用 close,表示连接关闭。

这里需要注意的是,服务端调用 accept 时,连接成功了会返回一个已完成连接的 socket,后续用来传输数据。所以,监听的 socket 和真正用来传送数据的 socket,是「两个」 socket,一个叫作监听 socket,一个叫作已完成连接 socket。成功连接建立之后,双方开始通过 read 和 write 函数来读写数据,就像往一个文件流里面写东西一样。

从键入URL链接,发生了什么(经常问)

首先浏览器会解析URL链接,该链接由服务器域名和文件地址组成。文件地址记录了所请求的超文本文件在服务器上存储的文件路径,而拿到服务器域名后,首先会查询本地缓存的域名与IP的映射,如果查找到则可以根据该IP地址,进行下一层结构,如果本地没有缓存,则需要请求DNS服务器去查询该域名所对应的IP地址。获取到IP之后,就可以把HTTP的传输工作交给操作系统的协议栈来完成传输,首先进入传输层,HTTP/HTTPS一般是基于TCP传输,将数据进行封装成TCP数据帧,进入下一层网络层,将TCP数据帧加上IP地址封装成IP报文,再进入下一层数据链路层,在该局域网下添加本机MAC地址,最后通过网卡发送出去。接收到按照发送的逆序层层解剖出数据,找到客户端请求的超文本文件,再按照同样的方式,将文件数据封装发送给客户机。

DNS

域名系统,DNS是因特网上作为域名和IP地址相互映射的一个分布式数据库。

查询顺序:浏览器缓存,系统缓存,路由器缓存,IPS服务器缓存,根域名服务器缓存,顶级域。 DNS域名解析采用的是UDP协议,原因是因为UDP快,而且域名解析数据量较小,用TCP连接的过程开销较大。但是UDP最大传输512字节,当传输大文件或者需要可靠传输的时候,采用TCP。

get和post区别

  • get是获取数据,post是修改数据
  • get把请求的数据放在URL上,以?分割URL和传输数据,参数之间以&相连,所以get不太安全,而post把数据放在HTTP的包体内(request body) 相对安全
  • get提交的数据最大是2k(限制实际上取决于浏览器),post理论上没有限制。
  • GET产生一个TCP数据包,浏览量会把HTTP header和data一并发送出去,服务器响应200;POST产生两个TCP数据包,浏览器会先发送header,服务器响应100 continue,浏览器再发送data,服务器响应200 ok(返回数据)。
  • GET请求会被浏览器主动缓存,而POST不会,除非手动设置
  • 本质区别:GET是幂等的,而POST不是幂等的。(幂等性是指一次和多次请求某一个资源应该具有同样的副作用,简单来说意味着对同一URL的多个请求应该返回同样的结果)。
Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐