• 网络面试知识


    客户端与服务端的网络通信

    • 1、socket函数
      在网络编程中所需要进行的第一件事情就是创建一个socket,无论是客户端还是服务器端,都需要创建一个socket,该函数返回socket文件描述符,类似于文件描述符。
    • 2、connect函数
      客户端创建了socket后,需要和服务器端建立连接,此时使用connect函数和服务器端进行连接。
      connect返回失败后,该套接字不再可用,必须关闭,不能对这样的套接字再次调用connect。
    • bind函数
      把一个本地协议地址和套接口绑定,比如把本机的2222端口绑定到套接口。注意:为什么在上图中客户端不需要调用bind函数?这是因为如果没有调用bind函数绑定一个端口的话,当调用connect函数时,内核会为该套接口临时选定一个端口,因此可以不用绑定。而服务器之所以需要绑定的原因就是,所以客户端都需要知道服务器使用的哪个端口,所以需要提前绑定。
    • listen函数
      当socket创建后,它通常被默认为是主动套接口,也就是说是默认为要马上调用connect函数的,而作为服务器是需要被动接受的,所以需要调用linsten函数将主动套接口转换成被动套接口。调用linsten函数后,内核将从该套接口接收连接请求。
    • accept函数
      此函数返回已经握手完成的连接的套接口。注意:此处的套接口不同于服务器开始创建的监听套接口,此套接口是已经完成连接的套接口,监听套接口只是用来监听。

    客户端

    int socket (int family ,int type ,int protocol)
    int connect (int sockfd , const struct sockaddr *servaddr , socklen_t addrlen)	// 自动绑定在了一个临时的端口上,并触发3次握手
    int close (int sockfd);​
    
    • 1
    • 2
    • 3

    服务器

    int socket (int family ,int type ,int protocol)
    int bind (int sockfd,const struct sockaddr *myaddr,socklen_t addrlen)	// 绑定在一个众所周知的端口上
    int listen(int sockfd, int backlog);	// 把主动套接口转为被动套接口
    int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);	// 阻塞,直到连接建立,返回一个连接套接字
    int close (int sockfd);
    
    • 1
    • 2
    • 3
    • 4
    • 5

    在这里插入图片描述
    参考:
    Linux的TCP接口介绍
    linux网络编程之二TCP套接口编程

    TCP三次握手

    由客户端调用connect函数触发,TCP的三次握手。

    三次握手

    在这里插入图片描述
    假设 A 为客户端,B 为服务器端。
    首先 B 处于 LISTEN(监听)状态,等待客户的连接请求。

    • A 向 B 发送连接请求报文,SYN=1,ACK=0,选择一个初始的序号 x。
    • B 收到连接请求报文,如果同意建立连接,则向 A 发送连接确认报文,SYN=1,ACK=1,确认号为 x+1,同时
      也选择一个初始的序号 y。
    • A 收到 B 的连接确认报文后,还要向 B 发出确认,确认号为 y+1,序号为 x+1。B 收到 A 的确认后,连接建立。

    三次握手的原因

    在这里插入图片描述
    第三次握手是为了防止失效的连接请求到达服务器,让服务器错误打开连接。
    客户端发送的连接请求如果在网络中滞留,那么就会隔很长一段时间才能收到服务器端发回的连接确认。客户端等待一个超时重传时间之后,就会重新请求连接。但是这个滞留的连接请求最后还是会到达服务器,如果不进行三次握手,那么服务器就会打开两个连接。如果有第三次握手,客户端会忽略服务器之后发送的对滞留连接请求的连接确认,不进行第三次握手,因此就不会再次打开连接。

    TCP四次挥手

    在这里插入图片描述

    • 1.第一次挥手:Client发送一个FIN,用来关闭Client到Server的数据传送,Client进入FIN_WAIT_1状态。
    • 2.第二次挥手:Server收到FIN后,发送一个ACK给Client,确认序号为收到序号+1(与SYN相同,一个FIN占用一个序号),Server进入CLOSE_WAIT状态。
    • 3.第三次挥手:Server发送一个FIN,用来关闭Server到Client的数据传送,Server进入LAST_ACK状态。
    • 4.第四次挥手:Client收到FIN后,Client进入TIME_WAIT状态,接着发送一个ACK给Server,确认序号为收到序号+1, Server进入CLOSED状态,完成四次挥手。
      在这里插入图片描述

    其他

    浏览器地址栏输入网站按回车后发生了什么?

    在这里插入图片描述
    1:解析网址,生成 HTTP 请求信息
    2:根据 DNS 服务器查询真实请求的 IP 地址,如果本地服务器有缓存则直接返回
    3:得到了 IP 以后,向服务器发送 TCP 连接,TCP 连接经过三次握手。
    4:接受 TCP 报文后,对连接进行处理,对 HTTP 协议解析
    5:服务器返回响应
    6:浏览器接受响应,显示页面,渲染页面

    HTTP和HTTPS的区别

    HTTP(HyperText Transfer Protocol)和 HTTPS(HyperText Transfer Protocol Secure)是用于在客户端和服务器之间传输数据的协议,它们之间的主要区别在于安全性:

    HTTPS增加了【证书认证+加密传输】

    数据传输安全性:

    HTTP:数据传输是明文的,不加密,容易被拦截和窃听。
    HTTPS:数据传输通过 SSL/TLS 加密,保障数据的安全性和机密性,防止拦截和窃听。
    协议和端口:

    HTTP:使用的是 80 端口。
    HTTPS:使用的是 443 端口。
    证书和身份验证:

    HTTP:不需要证书,不进行身份验证。
    HTTPS:需要使用 SSL/TLS 证书,服务器端的证书用于验证服务器的身份,保证通信双方的身份和数据的完整性。

    https的请求过程?

    参考:常见网络编程面试题以及答案(网络面试30题)

    GET/POST的区别

    数据位置:

    GET:数据附加在 URL 查询字符串中,例如:http://example.com/page?param1=value1¶m2=value2
    POST:数据包含在请求的消息体中,不可见于 URL。
    数据长度限制:

    GET:由于数据附加在 URL 中,长度受限于 URL 长度限制,不适合传输大量数据。
    POST:没有固定的数据长度限制,适合传输大量数据。
    安全性:

    GET:因为数据暴露在 URL 中,不适合传输敏感数据,如密码。
    POST:数据在请求体中,更适合传输敏感数据。
    可书签化:

    GET:由于数据在 URL 中,可以被书签保存。
    POST:不适合被书签保存,因为数据不在 URL 中。
    幂等性:

    GET:通常是幂等的,多次请求不会引起状态变化。
    POST:不一定是幂等的,多次请求可能引起状态变化,比如向服务器提交表单。
    浏览器行为:

    GET:请求会被浏览器缓存,如果用户刷新页面,浏览器会直接使用缓存。
    POST:浏览器不会缓存 POST 请求,刷新页面会重新发送请求。
    用途:

    GET:用于获取数据,不应该对服务器端数据产生副作用。
    POST:用于提交数据,可以修改服务器端数据。
    总的来说,GET 适合获取数据,而 POST 适合提交数据,根据具体的需求和情况选择合适的请求方法。

    User
    HTTP和HTTPS的区别
    ChatGPT
    HTTP(HyperText Transfer Protocol)和 HTTPS(HyperText Transfer Protocol Secure)是用于在客户端和服务器之间传输数据的协议,它们之间的主要区别在于安全性:

    数据传输安全性:

    HTTP:数据传输是明文的,不加密,容易被拦截和窃听。
    HTTPS:数据传输通过 SSL/TLS 加密,保障数据的安全性和机密性,防止拦截和窃听。
    协议和端口:

    HTTP:使用的是 80 端口。
    HTTPS:使用的是 443 端口。
    证书和身份验证:

    HTTP:不需要证书,不进行身份验证。
    HTTPS:需要使用 SSL/TLS 证书,服务器端的证书用于验证服务器的身份,保证通信双方的身份和数据的完整性。
    速度和性能:

    HTTP:由于不需要加密和解密过程,通常比 HTTPS 更快一些。
    HTTPS:由于加密和解密的过程,相对于 HTTP 会稍微慢一些。
    SEO(搜索引擎优化):

    HTTP:在搜索引擎中可能会受到一定的影响,因为搜索引擎越来越倾向于支持安全的网站。
    HTTPS:在搜索引擎中有一定的优势,对于 SEO 有一定的好处。
    总之,HTTPS 提供了更高的安全性和隐私保护,特别是在涉及用户隐私信息的网站上,使用 HTTPS 是非常重要的。

  • 相关阅读:
    【数据结构】七大排序算法详解
    区服分析丨更透彻的游戏营运数据解读,助力高效增长
    python 文创产品商城推荐网上购物系统设计与实现vue
    综述 | 关于点云配准的全面综述(一)
    一本通1084;幂的末尾
    oracle 如何使用脚本实现访问控制(无需额外插件)
    基于因果化评论的可解释推荐方法
    生日与性格查询易语言代码
    【鸿蒙(HarmonyOS)】List列表、ArkUI资源组数据类型
    护眼灯防蓝光什么意思?2022最新的护眼效果最好的led护眼灯推荐
  • 原文地址:https://blog.csdn.net/tanxuan231/article/details/128112456