前端——面试(苏小妍)

1.自我介绍
2.介绍一下nodejs搭建服务器,可以搭建TCP服务吗?

  • HTTP模块:引入模块—创建服务—监听请求—启动服务
    在这里插入图片描述
  • Express框架
    在这里插入图片描述

3.讲一下TCP和UDP的区别

  • TCP是面向连接的,UDP是无连接,发送数据之前不需要建立连接
  • TCP是可靠传输,无差错,不丢失,不重复,UDP是尽最大努力交付
  • TCP是面向字节流的,UDP是面向报文的
  • TCP是一对一,UDP是一对一或者一对多
  • TCP首部是20字节,UDP首部是8字节

4.TCP如何保证可靠传输的呢?

  • 检验和、序列号、确认应答、超时重传、连接管理、流量控制、拥塞控制
  • 过程
    • 为了保证数据包的可靠传递,发送方必须把已发送的数据包保留在缓存区;
    • 并为每个已发送的数据包启动一个超时定时器;
    • 如在定时器超时之前收到了了对方发来的应答信息(可能是对本包的应答,也可以是对本包后续包的应答),则释放该数据包占用的缓冲区;
    • 否则,重传该数据包,直到收到应答或重传次数超过规定的最大次数为止。
    • 接收方收到数据包后,先进行CRC校验,如果正确则把数据交给上层协议,然后给发送方发送一个累计应答包,表明该数据已收到,如果接收方正好也有数据要发给发送方,应答包也可在数据包中捎带过去。

5.讲一下TCP三次握手和四次挥手

  • 【问题1】为什么连接的时候是三次握手,关闭的时候却是四次握手?
    答:因为当Server端收到Client端的SYN连接请求报文后,可以直接发送SYN+ACK报文。其中ACK报文是用来应答的,SYN报文是用来同步的。但是关闭连接时,当Server端收到FIN报文时,很可能并不会立即关闭SOCKET,所以只能先回复一个ACK报文,告诉Client端,“你发的FIN报文我收到了”。只有等到我Server端所有的报文都发送完了,我才能发送FIN报文,因此不能一起发送。故需要四步握手。
  • 【问题2】为什么TIME_WAIT状态需要经过2MSL(最大报文段生存时间)才能返回到CLOSE状态?
    答:虽然按道理,四个报文都发送完毕,我们可以直接进入CLOSE状态了,但是我们必须假象网络是不可靠的,有可以最后一个ACK丢失。所以TIME_WAIT状态就是用来重发可能丢失的ACK报文。在Client发送出最后的ACK回复,但该ACK可能丢失。Server如果没有收到ACK,将不断重复发送FIN片段。所以Client不能立即关闭,它必须确认Server接收到了该ACK。Client会在发送出ACK之后进入到TIME_WAIT状态。Client会设置一个计时器,等待2MSL的时间。如果在该时间内再次收到FIN,那么Client会重发ACK并再次等待2MSL。所谓的2MSL是两倍的MSL(Maximum Segment Lifetime)。MSL指一个片段在网络中最大的存活时间,2MSL就是一个发送和一个回复所需的最大时间。如果直到2MSL,Client都没有再次收到FIN,那么Client推断ACK已经被成功接收,则结束TCP连接。
  • 【问题3】为什么不能用两次握手进行连接?
    答:3次握手完成两个重要的功能,既要双方做好发送数据的准备工作(双方都知道彼此已准备好),也要允许双方就初始序列号进行协商,这个序列号在握手过程中被发送和确认。现在把三次握手改成仅需要两次握手,死锁是可能发生的。作为例子,考虑计算机S和C之间的通信,假定C给S发送一个连接请求分组,S收到了这个分组,并发 送了确认应答分组。按照两次握手的协定,S认为连接已经成功地建立了,可以开始发送数据分组。可是,C在S的应答分组在传输中被丢失的情况下,将不知道S 是否已准备好,不知道S建立什么样的序列号,C甚至怀疑S是否收到自己的连接请求分组。在这种情况下,C认为连接还未建立成功,将忽略S发来的任何数据分 组,只等待连接确认应答分组。而S在发出的分组超时后,重复发送同样的分组。这样就形成了死锁。
  • 【问题4】如果已经建立了连接,但是客户端突然出现故障了怎么办?
    TCP还设有一个保活计时器,显然,客户端如果出现故障,服务器不能一直等下去,白白浪费资源。服务器每收到一次客户端的请求后都会重新复位这个计时器,时间通常是设置为2小时,若两小时还没有收到客户端的任何数据,服务器就会发送一个探测报文段,以后每隔75秒钟发送一次。若一连发送10个探测报文仍然没反应,服务器就认为客户端出了故障,接着就关闭连接。

6.ACK是什么?FIN,SYN

  • 序列号seq:占4个字节,用来标记数据段的顺序,TCP把连接中发送的所有数据字节都编上一个序号,第一个字节的编号由本地随机产生;给字节编上序号后,就给每一个报文段指派一个序号;序列号seq就是这个报文段中的第一个字节的数据编号。
  • 确认号ack:占4个字节,期待收到对方下一个报文段的第一个数据字节的序号;序列号表示报文段携带数据的第一个字节的编号;而确认号指的是期望接收到下一个字节的编号;因此当前报文段最后一个字节的编号+1即为确认号。
  • 确认ACK:占1位,仅当ACK=1时,确认号字段才有效。ACK=0时,确认号无效
  • 同步SYN:连接建立时用于同步序号。当SYN=1,ACK=0时表示:这是一个连接请求报文段。若同意连接,则在响应报文段中使得SYN=1,ACK=1。因此,SYN=1表示这是一个连接请求,或连接接受报文。SYN这个标志位只有在TCP建产连接时才会被置1,握手完成后SYN标志位被置0。
  • 终止FIN:用来释放一个连接。FIN=1表示:此报文段的发送方的数据已经发送完毕,并要求释放运输连接
  • PS:ACK、SYN和FIN这些大写的单词表示标志位,其值要么是1,要么是0;ack、seq小写的单词表示序号。
  • 握手:SYN和ACK ,挥手:FIN和ACK
  • 字段含义
    • URG 紧急指针是否有效。为1,表示某一位需要被优先处理
    • ACK 确认号是否有效,一般置为1。
    • PSH 提示接收端应用程序立即从TCP缓冲区把数据读走。
    • RST 对方要求重新建立连接,复位。
    • SYN 请求建立连接,并在其序列号的字段进行序列号的初始值设定。建立连接,设置为1
    • FIN 希望断开连接。

7.讲一下HTTP

  • HTTP是应用层协议,是客户端和服务器之间请求和响应的通信协议,是一种无状态协议,不保存每一次的状态,对于事务处理没有记忆能力。

8.HTTP如何保持长连接?

  • Ajax长轮询:浏览器通过JS启动一个定时器,然后以固定的间隔给服务器发送请求,询问服务器有没有新信息。

9.HTTP方法有哪些?

  • GET POST PUT DELETE OPTIONS CONNECT TRACK
    HEAD

10.HTTP请求行和响应行

  • 首部字段:实体首部字段,通用首部字段,请求首部字段,响应首部字段
  • 请求行:方法 URL 协议 版本
  • 响应行:协议 版本 状态码

11.HTTP首部字段中的请求字段都有哪些?

  • Accept:Accept首部可通知服务器,用户代理能够处理的媒体类型及媒体类型的相对优先级 Accept:text/html, application/xhtml+xml, application/xml; q=0.9, /; q=0.8
  • Accept-Charset:用来通知服务器用户代理支持的字符集及字符集的相对优先顺序 Accept-Charset: iso-8859-5,unicode-1-1;q=0.8
  • Accept-Encoding:用来告知服务器用户代理支持的内容编码及内容编码的优先级顺序,Accept-Encoding:gzip,deflate
  • Accept-Language:告知服务器用户代理支持的自然语言集及自然语言集的优先级 Accept-Language:zh-cn,zh;q=0.7,en-us,en;q=0.3
  • Authorization:告知服务器用户代理的认证信息。
  • Expect:客户端使用首部字段Expect字段来告知服务器,期待出现的某种特定行为等待状态码100响应的客户端在发生请求时,需要指定Expect: 100-continue Expect: 100-continue
  • Form:用来告知服务器使用用户代理的用户的电子邮件地址 ,Form:2294*** 272@qq.com
  • Host:用来告知服务器,请求的资源所在的互联网主机名和端口号,Host首部字段在HTTP/1.1规范内唯一一个必须包含在请求内的首部字段 ,Host:www.hacker.jp
  • If-Match形如If-***这种样式的请求首部字段,都可称为条件请求,服务器接收到附带条件的请求后,只有判断指定条件为真时,才会执行请求,服务器会比对If-Match的字段值和资源的ETag值,仅当两者一致时,才会执行请求。 If-Match:“123456”
  • If-Modified-Since:首部字段If-Modified-Since,属附带条件之一,会告知服务器若If-Modified-Since字段值早于资源的更新时间,则希望能处理该请求。而在指定If-Modified-Since字段值的日期之后,如果请求的资源都没有过更新,则返回状态码304 Not Modified的响应。
  • If-None-Match
    首部字段If-None-Match属于附带条件之一,它和首部字段If-Match作用相反,用于指定If-None-Match字段值的实体标记(ETag)值与请求资源的ETag不一致时,就告知服务器处理该请求,可获得最新的资源。
  • If-Range:首部字段If-Range属于附带条件之一,告知服务器若指定的If-Range字段值(ETag值或者时间)和请求资源的ETag值或时间相一致时,则作为范围请求处理,反之,则返回全体资源。 GET /index.html ,If-Range:“123456” ,Range: bytes=5001-10000
  • If-Unmodified-Since:首部字段If-Unmodified-Since和首部字段If-Modified-Since的作用相反,它的作用是告知服务器,指定的请求资源只有在字段内指定的日期之后,未发生更新的情况下,才能处理请求。如果在指定日期后发生了更新,则以状态码412 Precondition Failed作为响应返回 ,If-Unmodified-Since: Thu, 03 Jul 2012 00:00:00 GMT
  • Max-Forwards:以十进制整数形式指定可经过的服务器最大数目。服务器在往下一个服务器转发请求之前,会将Max-Forwards的值减1后重新赋值、当服务器接收到Max-Forwards值为0的请求时,则不再进行转发,而是直接返回响应。
    Max-Forwards:10
  • Proxy-Authorization:接收到代理服务器发来的认证质疑时,客户端会发送包含首部字段Proxy-Authorization的请求,以告知服务器认证所需要的信息。
    这个行为是与客户端和服务器之间的HTTP访问认证相类似的,不同之处在于,认证行为发生在客户端与代理之间,客户端与服务器之间的认证,使用首部字段Authorization可起到相同作用。
  • Range:只获取部分资源的范围请求,包含首部字段Range即可告知服务器资源的指定范围。接收到附带Range首部字段请求的服务器,会在处理请求之后返回状态码为206 Partial Content的响应,无法处理该范围请求时,则会返回状态码200 OK的响应及全部字段。 Range:bytes=5001-10000
  • Referer:=告知服务器请求的原始资源的URI 。
  • TE:告知服务器客户端能够处理响应的传输编码方式及相对优先级,用于传输编码。
    TE:gzip,deflate;q=0.5
  • User-Agent:将创建请求的浏览器和用户代理名称等信息传达给服务器

12.你有什么想问我的?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值