一份tcp、http面试指南

news/2024/5/17 15:51:10 标签: tcp, http

一、TCP

要说http就绕不开tcp,TCP协议对应于传输层,而HTTP协议对应于应用层,从本质上来说,二者没有可比性。但是,http是基于tcp协议的。

TCP/IP 协议分层模型

  • 物理层:将二进制的0和1和电压高低,光的闪灭和电波的强弱信号进行转换

  • 链路层:代表驱动

  • 网络层

    • 使用 IP 协议,IP 协议基于 IP 转发分包数据

    • IP 协议是个不可靠协议,不会重发

    • IP 协议发送失败会使用ICMP 协议通知失败

    • ARP 解析 IP 中的 MAC 地址,MAC 地址由网卡出厂提供

    • IP 还隐含链路层的功能,不管双方底层的链路层是啥,都能通信

  • 传输层

    • TCP 协议面向有连接,能正确处理丢包,传输顺序错乱的问题,但是为了建立与断开连接,需要至少7次的发包收包,资源浪费

    • UDP 面向无连接,不管对方有没有收到,如果要得到通知,需要通过应用层

    • 通用的 TCP 和 UDP 协议

  • 会话层以上分层

    • TCP/IP 分层中,会话层,表示层,应用层集中在一起

    • 网络管理通过 SNMP 协议

二、TCP三次握手和四次挥手

划重点了啊(面试最常问的啊),被问烂了的问题了。

三次握手:

  • 客户端–发送带有SYN标志的数据包–一次握手–服务端

  • 服务端–发送带有SYN/ACK标志的数据包–二次握手–客户端

  • 客户端–发送带有带有ACK标志的数据包–三次握手–服务端

四次挥手:

  • 客户端-发送一个FIN,用来关闭客户端到服务器的数据传送

  • 服务器-收到这个FIN,它发回一个ACK,确认序号为收到的序号加1 。和SYN一样,一个FIN将占用一个序号

  • 服务器-关闭与客户端的连接,发送一个FIN给客户端

  • 客户端-发回ACK报文确认,并将确认序号设置为收到序号加1

三、TCP和UDP的区别

仔细阅读上面传输层里写的内容,懂了吗?(不懂?不懂背下来啊!)举一个我们微信聊天时候经常会有这种情况:

 

https://imgconvert.csdnimg.cn/aHR0cHM6Ly9tbWJpei5xcGljLmNuL21tYml6LzhLS3JISzVpYzZYQjJaTlFiTHgzZVQzNVh1QTFUdUdpYVN0bGo0amFqSjd5eVJqNzVhb2ZMNGJVQnJpYjYzRHRHZGozSmdmbGdpYzdmQjJDRXJhcjdBM1poUS82NDA?x-oss-process=image/format,png" width="393" />

是不是感同身受,这种情况就是对方用了TCP协议来聊天,要经过--在吗?--在--巴拉巴拉,才能成功的传递信息。而如果对方使用UDP,则会有事直接说,不管我收没收到。(以后找我请用UDP协议,着急直接打电话!

四、HTTP简介

Http协议是建立在TCP协议基础之上的,当浏览器需要从服务器获取网页数据的时候,会发出一次Http请求。Http会通过TCP建立起一个到服务器的连接通道,当本次请求需要的数据完毕后,Http会立即将TCP连接断开,这个过程是很短的。所以Http连接是一种短连接,是一种无状态的连接。

所谓的无状态,是指浏览器每次向服务器发起请求的时候,不是通过一个连接,而是每次都建立一个新的连接。如果是一个连接的话,服务器进程中就能保持住这个连接并且在内存中记住一些信息状态。而每次请求结束后,连接就关闭,相关的内容就释放了,所以记不住任何状态,成为无状态连接。

1、http传输流

发送端在层与层间传输数据时,没经过一层都会被加上首部信息,接收端每经过一层都会删除一条首部

https://imgconvert.csdnimg.cn/aHR0cHM6Ly9tbWJpei5xcGljLmNuL21tYml6LzhLS3JISzVpYzZYQjJaTlFiTHgzZVQzNVh1QTFUdUdpYVNKSTdDREJSZEQyU0ZyREx5UUdvTlR1bTZuaGhhcGJWenNQSmlhMTQyTHh3UVQ1QmljMlVUMFhZQS82NDA?x-oss-process=image/format,png" />

2、HTTP的英文全称

又来划重点了啊!开玩笑的,这个显然不是重点,但是不排除有人会去问,还是要知道的:超文本传输协议(HyperText Transfer Protocol)

五、状态码

状态码就那些,常用的记住就行了:

2XX 成功

  • 200 OK,表示从客户端发来的请求在服务器端被正确处理

  • 204 No content,表示请求成功,但响应报文不含实体的主体部分

  • 206 Partial Content,进行范围请求

3XX 重定向

  • 301 moved permanently,永久性重定向,表示资源已被分配了新的 URL

  • 302 found,临时性重定向,表示资源临时被分配了新的 URL

  • 303 see other,表示资源存在着另一个 URL,应使用 GET 方法定向获取资源

  • 304 not modified,表示服务器允许访问资源,但因发生请求未满足条件的情况

  • 307 temporary redirect,临时重定向,和302含义相同

4XX 客户端错误

  • 400 bad request,请求报文存在语法错误

  • 401 unauthorized,表示发送的请求需要有通过 HTTP 认证的认证信息

  • 403 forbidden,表示对请求资源的访问被服务器拒绝

  • 404 not found,表示在服务器上没有找到请求的资源

5XX 服务器错误

  • 500 internal sever error,表示服务器端在执行请求时发生了错误

  • 503 service unavailable,表明服务器暂时处于超负载或正在停机维护,无法处理请求

六、HTTP协议格式

HTTP的请求和响应的消息协议是一样的,分为三个部分,起始行消息头消息体。这三个部分以CRLF作为分隔符。最后一个消息头有两个CRLF,用来表示消息头部的结束。

 

https://imgconvert.csdnimg.cn/aHR0cHM6Ly9tbWJpei5xcGljLmNuL21tYml6LzhLS3JISzVpYzZYQjJaTlFiTHgzZVQzNVh1QTFUdUdpYVNpYm9iajFWT05WUWFBeWlhaWNDZVRjajNsZE9KNndHUTdFMWszV3ZNdzQza21HaWEyYmliQ3B4ZGljbEEvNjQw?x-oss-process=image/format,png" />

HTTP请求的起始行称为请求行,形如GET /index.html HTTP/1.1

HTTP响应的起始行称为状态行,形如200 ok

消息头部有很多键值对组成,多个键值对之间使用CRLF作为分隔符,也可以完全没有键值对。形如Content-Encoding: gzip 消息体是一个字符串,字符串的长度是由消息头部的Content-Length键指定的。如果没有Content-Length字段说明没有消息体,譬如GET请求就是没有消息体的,POST请求的消息体一般用来放置表单数据。GET请求的响应返回的页面内容也是放在消息体里面的。我们平时调用API返回的JSON内容都是放在消息体里面的。

七、HTTP的无状态性

所谓HTTP协议的无状态性是指服务器的协议层无需为不同的请求之间建立任何相关关系,它特指的是协议层的无状态性。但是这并不代表建立在HTTP协议之上的应用程序就无法维持状态。

应用层可以通过会话Session来跟踪用户请求之间的相关性,服务器会为每个会话对象绑定一个唯一的会话ID,浏览器可以将会话ID记录在本地缓存LocalStorage或者Cookie,在后续的请求都带上这个会话ID,服务器就可以为每个请求找到相应的会话状态

八、输入url到页面加载都发生了什么事情?(最最常问的来了

  • 输入地址

  • 浏览器查找域名的 IP 地址 这一步包括 DNS 具体的查找过程,包括:浏览器缓存->系统缓存->路由器缓存...

  • 浏览器向 web 服务器发送一个 HTTP 请求

  • 服务器的永久重定向响应(从 http://example.com 到 http://www.example.com)

  • 浏览器跟踪重定向地址

  • 服务器处理请求

  • 服务器返回一个 HTTP 响应

  • 浏览器显示 HTML

  • 浏览器发送请求获取嵌入在 HTML 中的资源(如图片、音频、视频、CSS、JS等等)

  • 浏览器发送异步请求

参考原文:juejin.im/post/5ad4094e6fb9a028d7011069


http://www.niftyadmin.cn/n/922431.html

相关文章

常见的查找文件命令--find、locate、where、which、type

我们经常需要在系统中查找一个文件,那么在Linux系统中我们如何准确高效的确定一个文件在系统中的具体位置呢?下面我总结了在linux系统中常见的查找文件的几个命令。 一、find命令 find是最常用也是最强大的查找命令,它可以查找任何类型的文…

操作系统引导常用概念详解(一)

大硬盘和WIN8系统,让我们从传统的BIOSMBR模式升级到UEFIGPT模式,现在购买的主流电脑,都是预装WIN8系统,为了更好的支持2TB硬盘,更快速的启动win8,预装系统都采取了GPT分区的格式,并且主板bios支…

jmeter分布式csv_jmeter目录结构

熟练掌握工具的使用之前,我们首先要深入了解这个工具,不仅要了解工具的体系结构和工作原理,还要知道他的目录结构,知道他哪个目录下放什么东西,是做什么用的,哪个配置文件在哪个目录下边,这样在…

VMware中CentOS7网络设置

很多小伙伴在使用VMware安装好CentOS7以后,发现并没有网络的功能,ping啥都显示 ping命令不认识,接下来的文章就为大家讲解如何在安装完CentOS7后进行网络配置。 一、VMware下有三种网络连接模式 1、birdged(桥接) 桥…

yum安装nginx时报错:No package nginx available. Error: Nothing to do

晚上有空,又在VMware虚拟机上安装了CentOS 7.7版本,在配置好网络后,在安装nginx时出现以下错误: 问题原因: 在百度上查了一下,出现这个的原因是因为本地yum源中没有我们想要的nginx,那么我们就…

protobuf c++ 序列化为string_高效的序列化/反序列化数据方式 Protobuf

高效的序列化/反序列化数据方式 Protobuf一. protocol buffers 序列化上篇文章中其实已经讲过了 encode 的过程,这篇文章以 golang 为例,从代码实现的层面讲讲序列化和反序列化的过程。举个 go 使用 protobuf 进行数据序列化和反序列化的例子&#xff0c…

拼装机器人感想_机器人学习心得

2016全新精品资料-全新公文范文-全程指导写作–独家原创1/7机器人学习心得今后还有机器人课程的学习,我将更加认真的完成,争取更深入地了解机器人的构造,编写更加优化的机器人程序!下面是为大家收集整理的机器人学习心得&#xff…

linux每天自动创建以当天日期命名的文件

一、创建一个shell脚本 vim /data/date/date.sh#/bin/bash DATE1$(date %F) cd /data/date echo $DATE1 >> /data/date/date.log mkdir $DATE1 二、对脚本赋予执行权限 cd /data/date chmod ux date.sh #使脚本具有执行权限 ./date.sh #执行脚本 ##变绿代表拥有执行…