计算机网络
写在前面: 对牛客网面试知识的总结…
文章目录
- 计算机网络
- 1. 保证节点传输存储的可靠性
- 2. TCP怎么保证可靠性,简述TCP建立连接和断开连接的过程
- 3. TCP模型,状态转移
- 4. HTTP和HTTPS区别,HTTPS缺点
- 6. HTTP返回码
- 7. IP地址作用,MAC地址作用
- 9. OSI七层协议,TCP/IP四层模型
- 10. 三次握手四次挥手【补充】
- 11. 搜索baidu,会用到计算机网络中什么层,每层干什么
- 12. TCP拥塞控制,达到什么情况的时候开始减慢增长的速度
- 13. TCP保证可靠性的措施
- 14. TCP/IP数据链路层的交互过程
- 15. 传递到IP层怎么知道报文是给那个应用程序的,如何区分UDP和TCP
- 16. socket开发(网络编程)的基本步骤,i.e.,网络层的具体操作
- 19. TCP为什么两次或者四次握手不可以,必须三次握手?
- 20. TCP拥塞控制
- 21. TCP和UDP的区别和各自适用的场景
- 22. http协议
- 23. GET和POST区别
- 24. socket编程中服务器和客户端主要用到哪些函数
- 28. 阻塞、非阻塞,同步,异步
- 29. socket编程的send(),recv(),accept(),socket()函数
- 30. http协议会话结束标志怎么截出来
- 30. http协议会话结束标志怎么截出来
1. 保证节点传输存储的可靠性
2. TCP怎么保证可靠性,简述TCP建立连接和断开连接的过程
-
TCP保证可靠性:
-
序列号、确认应答、超时重传:数据达到接收方需要发出一个确认应答,表示已经收到该数据段,并且确认序号会说明它下一次需要接收的序列号。如果发送方迟迟未收到确认应答,那么可能是发送数据丢失,也可能是确认应答丢失,这时发送方在等待一定时间后会进行重传,这个时间一般是2*RTT(报文段往返时间)+一个偏差值
-
窗口控制与高速重发控制/快速重传(重复确认应答):TCP会利用窗口控制来提高传输速度,即在一个窗口大小内,不用一定等到应答才能发送下一段数据,窗口大小就是无需等待确认而可以继续发送数据的最大值。如果不使用窗口控制,每一个没收到确认应答的数据都要重发。
-
拥塞控制
-
问题:窗口定的很大,发送端连续发送大量数据,可能会造成网络的拥塞。
-
控制:
- 慢启动:定义拥塞窗口,一开始将该窗口大小设为1,之后每次收到确认应答(经过一个RTT),将拥塞控制窗口大小*2
- 拥塞避免:设置慢启动阈值,一般开始都设为65536,拥塞避免是指当拥塞窗口大小达到这个阈值,拥塞窗口的值不再指数上升,而是加法增加,每次确认应答,以此来避免拥塞.
- 将报文段的超时重传看做拥塞,一旦发生超时重传,我们需要先将阈值设为当前窗口大小的一半,并且将窗口大小设为初值1,然后重新进入慢启动过程。
- 快速重传:在遇到3次重复确认应答(高速重发控制)时,代表收到了3个报文段,但是这之前的1个段丢失了,便立即重传.
-
-
-
TCP建立连接和断开连接的过程:
-
三次握手:
- client将标志位SYN置为1,随机产生一个值seq=J,并将该数据包发送给server,client进入SYN_SENT状态,等待server确认;
- server收到数据包后由标志位SYN=1知道client请求建立连接,server将标志位SYN和ACK都置为1,ack=J+1,随机产生一个值seq=K,并将数据包发送给client以确认连接请求,server进入SYN_RCVD状态。
- client收到确认后,检查ack是否为J+1,ACK是否为1,如果正确则将标志位ACK置为1,ack=K+1,并将该数据包发送给server,server检查ack是否等于K+1,ACK是否为1,如果正确则连接建立成功,client和server进入ESTABLISHED状态,完成三次握手,随后client与server可以开始传输数据
-
四次挥手:由于TCP连接是全双工的,因此每个方向都必须单独进行关闭,原则:当一方完成数据发送任务后,发送一个FIN终止这一方向的连接,收到一个FIN只是意味着这个方向没有数据流动了,即不会再收到数据,但是在这个TCP连接上仍然能够发送数据,知道这个方向也发送了FIN。首先进行关闭的一方将执行主动关闭,另一方则执行被动关闭.
- 数据传输结束后,客户端的应用进程发出连接释放报文段,并停止发送数据,客户端进入FIN_WAIT_1状态,此时客户端依然可以接收服务器发送的数据;
- 服务器接收到FIN后,发送一个ACK给客户端,确认序号为收到的序号+1,服务器进入CLOSE_WAIT状态,客户端收到后进入FIN_WAIT_2状态;
- 当服务器没有数据要发送时,服务器发送一个FIN报文,此时服务器进入LAST_ACK状态,等待客户端确认;
- 客户端收到服务器的FIN报文后,给服务器发送一个ACK报文,确认序列号为收到的序列号+1.此时客户端进入TIME_WAIT状态,等待2MSL(MSL:报文段最大生存时间),然后关闭连接.
-
3. TCP模型,状态转移
TCP/IP四层模型,状态转移
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JAYkzJ8D-1583678597047)(./image/tcp.png)]
4. HTTP和HTTPS区别,HTTPS缺点
-
HTTP协议和HTTPS协议区别:
- HTTP协议是以明文的方式在网络中传输数据,而HTTPS协议传输数据则是通过TLS加密后的,HTTPS具有更高的安全性.
- HTTPS在TCP三次握手后,还需要SSL的handshake,协商加密使用的对称加密秘钥
- HTTPS协议需要服务端申请证书,浏览器端安装对应的根证书
- HTTP协议端口是80,HTTPS协议端口是443
-
HTTPS优点:
- HTTPS传输数据过程中使用密钥进行加密,所以安全性高
- HTTPS协议可以认证用户和服务器,确保数据发送到正确的用户和服务器
-
HTTPS缺点:
- 延迟高
- 部署成本高
6. HTTP返回码
HTTP协议的响应报文由状态行、响应头部和响应包体组成。响应码总体描述:
- 1xx:指示信息->请求已接收,继续处理
- 2xx: 成功->请求已被成功接收、理解、接受
- 3xx:重定向,要完成请求必须进行更进一步的操作
- 4xx:客户端错误,请求有语法错误,或者请求无法实现
- 5xx:服务端错误,服务器未实现合法请求
常见状态码:
- 200 OK:客户端请求成功
- 206 partiail content服务器已经正确处理部分GET请求实现断点续传和分片下载
- 300 multiple choices(可选重定向):被请求的资源有一系列可供选择的反馈信息
- 302 moved permanently(永久重定向):请求资源临时从不同URI中获取
- 304
- 403 服务器收到请求,但拒绝提供服务.
7. IP地址作用,MAC地址作用
MAC地址是硬件地址,用来定义网络设备的位置,主要由数据链路层负责,IP地址是IP协议提供的一种统一的地址格式,为互联网上每一个网络和主机分配一个逻辑地址,以此来屏蔽物理地址的差异.
9. OSI七层协议,TCP/IP四层模型
OSI七层协议:
- 物理层:通过媒介传输比特,确定机械和电气规范。协议有:IEE802.3, CLOCK RJ45
- 数据链路层:将比特组装成帧和点到点的传递,传输单位为帧,协议有:MAC, VLAN,PPP
- 网络层:负责数据包从源到宿的传递和网际互连,传输单位为包,协议:IP,ARP,ICMP
- 传输层:提供端到端的可靠报文传递和错误恢复,传输单位为报文,协议:TCP,UDP
- 会话层:建立、管理和终止会话,传输单位为SPDU,协议:RPC,NFS
- 表示层:对数据进行翻译、加密和压缩,传输单位为PPDU,协议:JPEG,ASII
- 应用层:允许访问OSI环境的手段,传输单位APDU,协议:FTP,HTTP,DNS
TCP/IP 4层模型包括:
- 网络接口层:MAC,VLAN
- 网络层:IP,ARP,ICMP
- 传输层:TCP,UDP
- 应用层:HTTP,DNS,SMTP
10. 三次握手四次挥手【补充】
TCP三次握手:(防止已经失效的连接请求报文突然又传输到服务器端导致服务器资源浪费)
C->SYN->S
S->SYN/ACK->C
C->ACK->S
TCP四次挥手:
C->FIN->S
S->ACK->C
S->FIN->C
C->ACK->S
11. 搜索baidu,会用到计算机网络中什么层,每层干什么
-
浏览器输入URL
浏览器将URL解析为IP地址,解析域名用到DNS协议,首先主机会查询DNS缓存,如果没有就给本地DNS发送查询请求,DNS查询分为两个方式:递归查询,迭代查询,如果是迭代查询,本地的DNS服务器向根域名服务器发送查询请求,根域名服务器告知该域名的一级域名服务器,然后本地服务器给该一级域名服务器发送查询请求,然后依次查询该域名的IP。DNS服务器是基于UDP,会用到UDP协议;得到IP地址后,浏览器就要与服务器建立一个http链接。因此要用到http协议,http生成get请求报文,将该报文传给TCP层处理,所以会用到TCP协议,如果采用https还好使用https协议,先对http数据加密,TCP数据包会发送IP层,用到IP协议,IP层经过路由选择,一跳一跳发送到目的地
-
协议和各层的工作
- DNS,HTTP,HTTPS协议属于应用层,应用层是体系结构最高层,应用层确定进程之间通信的性质以满足用户的需求,应用层不仅要提供应用进程所需要的信息交换和远地操作,而且还要作为互相作用的应用进程的用户代理。用来完成一些为进行语义上有意义的信息交换所必须的功能。应用层直接为用户的应用进程提供服务。
- TCP,UDP属于传输层,传输层负责主机中两个进程之间的通信。因特网的传输层可使用两种不同的协议,即面向连接的传输控制协议TCP,和无连接的用户数据报协议UDP。TCP:面向连接的服务,提供可靠的交付;UDP:无连接服务,不保证提供可靠的交付,尽可能努力交付
- IP协议,ARP协议属于网络层,网络层负责为分组交换网上的不同主机提供通信,在发送数据时,网络层将运输层产生的报文段或用户数据报封装成分组或包进行传送。在TCP/IP体系中,分组也要IP数据报,或简称数据报。网络层的另一个任务是选择合适的路由,是源主机运输层传下来的分组能够交付到目的主机.
- 数据链路层,当发送数据时,数据链路层的任务是将网络层的任务交下来的IP数据报组装成帧,在两个相邻节点的链路上传送以帧为单位的数据,每一帧包括数据和必要的控制信息(如同步信息,地址信息,差错控制,流量控制信息)。控制信息使接收端能够知道一个帧从哪个比特开始和哪个比特结束。控制信息还能使接收端能够检测到所收到的帧中是否有差错.
- 物理层,透明地传送比特流。在物理层上所传数据的单位比特。传递信息所利用的一些物理媒体,双绞线、同轴电缆,光缆,并不在物理层之内而是在物理层的下面,因此物理媒体可以当做第0层
12. TCP拥塞控制,达到什么情况的时候开始减慢增长的速度
-
概念:拥塞控制是防止过多的数据注入网络,使得网络中的路由器或者链路过载。流量控制是点对点的通信量控制,而拥塞控制是全局的网络流量整体性控制。发送双方都有一个拥塞窗口–cwnd
-
慢开始:最开始发送方的拥塞窗口为1,由小到大逐渐增大发送窗口和拥塞窗口。每经过一个传输轮次,拥塞窗口cwnd加倍。当cwnd超过慢开始门限,则使用拥塞避免算法,避免cwnd增长过大.
-
拥塞避免:每经历一个往返时间RTT,cwnd+1,在慢开始和拥塞避免的过程中,一旦发现网络拥塞,就把慢开始门限设为当前值的一半,并且重新设置cwnd=1,重新慢启动(乘法减小,加法增大)
-
快重传:接收方每次收到一个失序的报文段后就立即发出重复确认,发送方只要连续收到三个重复确认就立即重传(尽早重传未被确认的报文段)
-
快恢复:当发送方连续收到三个重复确认,就乘法减半(慢开始门限减半),将当前的cwnd设置为慢开始门限,并且采用拥塞避免算法(连续收到三个重复请求,说明当前网络可能没有拥塞),采用快恢复算法时,慢开始只在建立连接和网络超时时才使用;
-
减慢增长速度的时间:
-
采用慢开始和拥塞避免算法的时候
- 一旦cwnd>慢开始门限,就采用拥塞避免算法,减慢增长速度;
- 一旦出现丢包的情况,就重新进行慢开始,减慢增长速度
-
采用快恢复和快重传算法的时候
- 一旦cwnd>慢开始门限,采用拥塞避免算法,减慢增长速度
- 一旦发送方连续收到三个重复确认,就采用拥塞避免算法,减慢增长速度
-
13. TCP保证可靠性的措施
同
- 序列号、确认应答、超时重传
- 窗口控制与高速重发控制/快速重传(重复确认应答)
- 拥塞控制
14. TCP/IP数据链路层的交互过程
数据链路层用mac地址作为通信目标,数据包到达网络等准备往数据链路层发送时,网络层首先会去自己的ARP缓存表(存着IP-MAC对应关系)去查找目标IP的MAC地址,如果查到了,就将目标IP的MAC地址封装到链路层数包的包头。如果缓存中没找到,则会发起一个广播:who is IP XXX tell IP XXX,所有收到的广播的机器看到这个IP是不是自己的,如果是自己的,则以单播方式将自己的MAC地址回复给请求的机器
15. 传递到IP层怎么知道报文是给那个应用程序的,如何区分UDP和TCP
- 根据端口区分
- 看IP头中的协议标识字段,17是UDP,6是TCP
16. socket开发(网络编程)的基本步骤,i.e.,网络层的具体操作
- 服务端:socket->bind->listen->accept
- 客户端:socket->connect
19. TCP为什么两次或者四次握手不可以,必须三次握手?
-
两次握手不可以:tcp是全双工通信,两次握手不能确定单向数据链路是可以通信的,不能保证反向通信的正常;
-
不用四次:本来握手应该和挥手一样,都需要确认两个方向都能联通,本来模型是:
- 客户端发送sync0给服务器
- 服务器收到sync0,回复ack(syn0+1)
- 服务器发送sync1
- 客户端收到sync1,回复ack(syn1+1),因为tcp是全双工的,上边的四步确认了数据在两个方向上都是正确到达的,但是2,3步没有上下的联系,可以合并,加快握手的效率,因此变为3步握手
20. TCP拥塞控制
- 发送方维持一个叫做拥塞控制的窗口cwnd(congestion window)的状态变量。拥塞窗口的大小取决于网络的拥塞程度,并且动态地变化。发送方让自己的发送窗口等于拥塞窗口另外考虑到接受方的接收能力,发送窗口可能小于拥塞窗口。慢开始算法的思路:不要一开始就发送大量的数据,先探测一下网络的拥塞程度,也就是说由小到大,逐渐增加拥塞窗口的大小,过程cwnd的大小呈指数增长,直到超过慢启动门限,然后进入拥塞避免阶段,cwnd的大小线性增长,当出现网络拥塞(三个重复的ack或者超时)时,将慢启动门限设置为出现拥塞时候大小的一半,cwnd的大小重新从0开始进入慢启动阶段.
- 快重传和快恢复:快重传要求接收方在收到一个失序的报文段后就立即发出重复确认(为的是使发送方尽早知道有报文没达到对方)而不要等到自己发送数据时捎带确认。快重传算法规定,发送方只要一连收到三个重复确认就应当立即重传对方尚未收到的报文段,而不必继续等待设置的重传计时器时间到期.
21. TCP和UDP的区别和各自适用的场景
-
TCP和UDP的区别
- 连接:TCP是面向连接的传输层协议,即传输数据之前必须先建立好连接;UDP无连接
- 服务对象:TCP是点对点的两点间服务,即一条TCP连接只能有两个端点;UDP支持一/多对一/多的交互通信;
- 可靠性:TCP是可靠交付(无差错,不丢失,不重复,按序达到);UDP是尽最大努力交付,不保证可靠交付;
- 拥塞控制,流量控制:TCP有拥塞控制和流量控制保证数据传输的安全性;UDP没有拥塞控制,网络拥塞不会影响源主机的发送效率.
- 报文长度:TCP是动态报文长度,即TCP报文长度是根据接收方的窗口大小和当期网络拥塞情况决定的;UDP面向报文,不合并,不拆分,保留上面传下来报文的边界
- 首部开销:TCP首部开销大,首部20个字节,UDP首部开销小,8字节(源端口,目的端口,数据长度,校验和)
-
TCP和UDP适用场景
TCP是可靠的但传输速度慢,UDP是不可靠的但传输速度快,若通信数据完整性让位于通信实时性,则选择TCP协议(如文件传输,重要状态的更新);反之则使用UDP协议(如视频传输、实时通信)
22. http协议
-
HTTP协议:HTTP协议(hyper text transfer protocol超文本传输协议),用于从万维网服务器传输超文本到本地浏览器的传送协议。是一个应用层的面向对象的协议,工作于客户端-服务端架构.
-
特点:快速,灵活,无连接,无状态,支持B/S C/S,默认端口80,基于TCP协议
-
HTTP协议过程概述:HTTP协议定义Web客户端如何从Web服务器请求Web页面,以及服务器如何把Web页面传送给客户端。HTTP协议采用了请求/响应模型。客户端向服务器发送一个请求报文,请求报文包含请求的方法,URL、协议版本、请求头部和请求数据。服务器以一个状态行作为响应,响应内容包括协议版本,错误代码,服务器信息,响应头部,响应数据
-
HTTP请求/响应步骤:
- 客户端连接Web服务器
- 发送HTTP请求
- 服务器接受请求并返回HTTP响应
- 释放连接TCP连接
- 客户端浏览器解析HTML
23. GET和POST区别
-
概念:
- GET方式请求,浏览器会把http header和data一并发送出去,服务器响应200
- POST方式请求,浏览器先发送header,服务器响应100 continue,浏览器再发送data,服务器响应200
-
区别:
- get参数通过url传递,post放在request body中;
- get请求在url传递的参数是有长度限制,而post没有;
- get比post更不安全
- get请求只能url编码,post支持多种编码方式
- get请求参数会被完整保留/缓存在浏览器的历史记录中,而post不会
- get和post本质是TCP连接,get产生一个TCP数据包,post产生两个TCP数据包
24. socket编程中服务器和客户端主要用到哪些函数
-
基于TCP的socket
-
服务器端程序:
- 创建socket,用函数socket()
- 绑定IP地址,端口等信息到socket上,用函数bind()
- 设置允许的最大连接数,用函数listen()
- 接收客户端上来的连接,用函数accept()
- 收发数据,用函数send()和recv(),或者read()和write()
- 关闭网络连接
-
客户端程序:
- 创建一个socket,用函数socket()
- 设置要连接的对方的IP地址和端口等属性
- 连接服务器,用函数connect()
- 收发数据,用函数send()和recv(),或者read()和write()
- 关闭网络连接
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4tT6MWjw-1583678597055)(./image/socket.png)]
-
-
基于UDP的socket:
-
服务器端:
- 建立套接字文件描述符,使用socket()
- 设置服务器地址和侦听端口,初始化要绑定的网络地址
- 绑定侦听端口,使用bind函数,将套接字文件描述符和一个地址类型变量进行绑定
- 接收客户端的数据,使用recvfrom函数接收客户端的网络数据
- 向客户端发送数据,使用sendto()函数向服务器主机发送数据
- 关闭套接字,使用close函数释放资源
-
客户端:
- 建立套接字文件描述符,socket()
- 设置服务器地址和端口,struct sockaddr
- 向服务器发送数据,sendto()
- 接收服务器的数据,recvfrom()
- 关闭套接字,close()
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3hn5mgB7-1583678597056)(./image/socket-udp.png)]
-
28. 阻塞、非阻塞,同步,异步
- 阻塞和非阻塞:调用者在事件没发生的时候,一直在等待事件发生,不能去处理别的任务,这是阻塞,可以去处理别的任务,这是非阻塞
- 同步和异步:调用者必须循环去查看事件是否发生,这是同步,调用者不用自己查看事件是否发生,而是等待着注册在事件上的回调函数通知自己,这是异步;
29. socket编程的send(),recv(),accept(),socket()函数
send函数用来向TCP连接的另一端发送数据。客户端一般用send函数向服务器发送请求,而服务器则通常用send函数来向客户端发送应答,send的作用是将要发送的数据拷贝到缓冲区,协议负责传输.recv函数用来从TCP连接的另一端接收数据,当应用程序调用recv函数时,recv先等待发送缓冲区的数据被协议传送完毕,然后从缓冲区读取接收到的内容给应用层,accept函数用来接收一个连接,内核维护了一个半连接队列和一个已完成连接队列,当队列为空时,accept函数阻塞,不为空时,accept函数从队列中取出一个已完成连接,返回文件描述符.
30. http协议会话结束标志怎么截出来
看tcp连接是否断开四步挥手阶段
务器发送请求,而服务器则通常用send函数来向客户端发送应答,send的作用是将要发送的数据拷贝到缓冲区,协议负责传输.recv函数用来从TCP连接的另一端接收数据,当应用程序调用recv函数时,recv先等待发送缓冲区的数据被协议传送完毕,然后从缓冲区读取接收到的内容给应用层,accept函数用来接收一个连接,内核维护了一个半连接队列和一个已完成连接队列,当队列为空时,accept函数阻塞,不为空时,accept函数从队列中取出一个已完成连接,返回文件描述符.
30. http协议会话结束标志怎么截出来
看tcp连接是否断开四步挥手阶段