面试题1. TCP,UDP区别?
- TCP是面向字节流的传输方式,而UDP是面向数据报的传输方式
- TCP是面向连接的,而UDP就不是面向连接的
- TCP是可靠性传输的有很多保证可靠性传输的机制(比如对数据包进行排序、效验和、流量控制、拥塞控制、停止等待协议、超时重传、滑动窗口),而UDP就没有这种机制所以他不是可靠性传输,但是他的传输效率高
- TCP的首部字段20-60字节,而UDP的首部字段只有8个字节
面试题2. 三次握手、四次挥手过程?为什么是三次和四次?
(1)三次握手的过程:
- 第一次建立握手首先是客户端先向服务器端进行请求的报文,发送报文首部SYN=1(TCP规定SYN=1的报文段不能携带数据,但是需要消耗掉一个序号)、seq=x 的初始序列号
- 第二次是服务器端向客户端进行回应的报文,SYN=1,ACK=1,seq=y(表示我服务器初始化序号y开始给你发数据),ack=x+1(表示对第一次的序号为x的数据进行确认,我已经收到了,请你客户端下一次从序号x+1开始发送)
- 第三次是客户端向服务器端发送确认报文ACK=1,ack=y+1(表示我客户端已经收到了你上次从y开始发送的数据),seq=x+1(表示自己的序列号),此时TCP连接建立完成,可以发送数据。TCP规定,ACK报文段可以携带数据,但是如果不携带数据则不消耗序号
(2)四次挥手的过程:
- 第一次是客户端向服务器端进行发送一个FIN=1(表示我客户端想要结束连接,相当于分手信),其序列号为seq=u(等于前面已经传送过来的数据的最后一个字节的序号加1)== TCP规定,FIN报文段即使不携带数据,也要消耗一个序号。==
- 第二次是服务器端对第一次进行回应发送确认报文,ACK=1,ack=u+1(表示对上一次你发送的我收到了,希望下次你从序号u+1开始发送),然后带上我自己的序号从seq=v,到这里相当于客户端---->服务器端的通道就被关闭了,但是服务器---->客户端的通道还咩有关闭,如果服务器再给客户端发数据他还可以收到数据.
- 第三次是服务器开始向客户端请求断开连接(服务器不爱客户端了,我以后再也不联系你了),FIN=1,ack=u+1(表示你上一次发我的我都收到了),seq=w(服务器自己的发送序号),然后等待客户端回应。
- 第四次就是客户端向服务器端进行确认回应,ACK=1,ack=w+1(表示我也收到了你给我发送的w开始的信息),seq=u+1,注意:此时连接还没有真正释放,必须经过2MSL(最长报文寿命)之后,整个双方的连接才会释放,因为如果不存在TIME_WAITE状态的话,如果服务器端由于某些原因收不到客户端最后发的确认ack的话,服务器端会重发FIN的请求关闭报文(如果超过2MSL的话,这个数据报就会在网络中消失)
(3)那么为什么TIME_WAITE的时间设置为2MSL(2分钟))呢?
第一,为了保证A发送的最后一个ACK报文能够到达B。这个ACK报文段有可能丢失,因而使处在LAST-ACK状态的B收不到对已发送的FIN+ACK报文段的确认。B会超时重传这个FIN+ACK报文段,而A就能在2MSL时间内收到这个重传的FIN+ACK报文段。如果A在TIME-WAIT状态不等待一段时间,而是在发送完ACK报文段后就立即释放连接,就无法收到B重传的FIN+ACK报文段,因而也不会再发送一次确认报文段。这样,B就无法按照正常的步骤进入CLOSED状态。
第二,A在发送完ACK报文段后,再经过2MSL时间,就可以使本连接持续的时间所产生的所有报文段都从网络中消失。这样就可以使下一个新的连接中不会出现这种旧的连接请求的报文段。
(4)为什么建立连接是三次握手,关闭连接确是四次挥手呢?
建立连接的时候, 服务器在LISTEN状态下,收到建立连接请求的SYN报文后,把ACK和SYN放在一个报文里发送给客户端。
而关闭连接时,服务器收到对方的FIN报文时,仅仅表示对方不再发送数据了但是还能接收数据,而自己也未必全部数据都发送给对方了,所以服务器端可以立即关闭,也可以发送一些数据给对方后,再发送FIN报文给对方来表示同意现在关闭连接,因此,服务器端的ACK和FIN一般都会分开发送,从而导致多了一次。
面试题3. 挥手的6个状态?作用?fin_wait1 、fin_wait2半关闭状态、time_wait2msl时间close_wait、last_ack、closed
面试题3. tcp/ip传输数据,如果有数据丢失会怎么样。
- 如果客户端向服务器端发送的数据丢失,对方服务器端没有收到数据包,就不会进行确认,然后客户端会进行重新发送刚刚丢失的数据包。称为自动重传请求ARQ。
面试题4. GET和POST的区别(消息体,用途,URL,书签,传输格式,长度限制)
- 从用途方面说:GET请求一般用于一些安全性不太高的请求场景,而POST用于表单提交比较多,安全性比较高
- 消息体方面说:GET是直接把请求的URL的放到请求头当中,直接在标签栏看到,而POST请求而是直接把请求的 信息放到了请求体中,用户看不到
- 传输格式来说:GET只能进行url编码,而POST可以指定任意编码格式进行请求
- 长度限制方面来说:GET请求在URL栏中有固定的长度限制,不能大于2K,而POST请求的长度基本上没有长度限制
- 从URL方面来说:GET请求的地址可以直接保存为书签,但是在POST请求中就不能使用书签保存
面试题5. http和https的区别(后者要先通过SSL层的非对称握手过程获得协定的对称密钥,用于后续会话的加/解密)
- 首先的区别就是在http的基础上的http通讯接口部分使用SSL协议代替来进行加密传输协议
- http和https使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。
- https还可以使用CA数字证书签名,但是一般的第三方数字证书认证机构都是需要收费用的。
面试题6. TCP粘包拆包解决?
粘包问题博客:https://blog.csdn.net/zhangxinrun/article/details/6721495
面试题7. 说说跨站脚本攻击(XSS攻击)、跨站请求伪造(CSRF攻击)?
- XSS攻击是属于一种被动攻击:其实就是在存在安全漏洞的Web网站内,在用户的浏览器内运行非法的HTML标签或者是JS进行的一种攻击,能够导致用户的cookie被盗取,导致个人用户信息被窃取,或者是非法显示一些图片等等。
- CSRF攻击属于一种被动攻击:他是一种攻击者通过故意设置一种陷阱,让用户点击,当用户点击的时候就使用户带着自己的cookie去访问目的网站进行一些恶意操作。
面试题9. 网络状态码?以 2、3、4、5 开头的代表什么意思。
以1XXX开头的:表示信息行的状态码,代表请求正在处理
以2XXX开头的:表示成功的状态码,代表正常请求处理完毕
- 状态码200表示请求成功,并成功返回数据。
- 状态码204表示请求处理成功,但是没有资源可返回
- 状态码206表示客户端进行范围请求,但是只返回了部分成功的数据
以3XXX开头的:表示重定向的状态码
4. 状态码301:表示永久重定向,表示请求的资源已经被重新分配了新的URI
5. 状态302:表示临时重定向,请求的资源已经分配了新的URI,希望本次请求能使用新的URI
6. 状态303:表示临时重定向,请求的资源已经分配了新的URI,希望本次请求能使用新的URI,并且会把POST请求变为GET请求
7. 状态304:跟重定向没有关系,表示允许客户端请求,但是服务器没有满足你的请求的资源
8. 状态307:表示零食重定向,和302代表的意思一样,但是他不会把POST请求变为GET请求
以4XXX开头的:表示客户端错误
9. 状态400:表示客户端的请求错误,或者请求报文的语法格式不合法
10. 状态401:表示客户端没有进行认证
11. 状态403;表示服务器端拒绝客户端的请求
12. 状态404:表示客户端请求的资源服务器没有对应的资源
以5XXX开头的:表示服务器错误
- 状态500:表示服务器内部在执行请求时,发生错误
- 状态503:表示服务器正在处于超负载或者是停机维护,无法进行处理请求
面试题10. 什么叫字节流?什么叫数据报?tcp用哪种?
- 字节流:在TCP进行传输的过程中,都是按照字节为最小单位来进行传输的
- 数据报:UDP就是是基于报文为最小的传输单位的,报文和报文之间是不会合并的,如果缓冲区的大小小于报文的大小的话,就会丢弃多出部门的该报文
面试题11. 粘包怎么解决?两种方法 总体来说,循环处理缓冲区的包,根据格式或头部长度来区分数据包
https://blog.csdn.net/zhangxinrun/article/details/6721495
面试题12. close_wait状态大量存在的原因?1.调用shutdown进行半关闭 2.程序忙于其他事情,没时间发fin包?
面试题13. tcp有哪些机制?校验和、序列号、确认机制、超时重传(默认1s)、窗口机制、流量控制、拥塞控制
- 校验和:TCP 将保持它首部和数据的检验和。这是一个端到端的检验和,目的是检测数据在传输过程中的任何变化。如果收到段的检验和有差错,TCP 将丢弃这个报文段和不确认收到此报文段。
- 序列号:就是在传输过程中TCP发送的每一个数据包进行编号,接收方对接收到的数据包进行排序,也保证了可靠性传输
- 确认机制:就是当发送方发送分组,接收方在规定时间内收到,并且回复确认.发送方再次发送
- 超时重传:就是在发送方发送完数据包之后,就会启动一个超时计时器,如果在计时器结束之后再到达,就需要发送方需要重新对该数据包进行重新发送。
- 滑动窗口机制:其实就是为了防止发送方过快的发送数据包给接受方,导致接收方也不能及时的处理这些数据包的一个机制,在发送方和接收方都有一个缓冲窗口,滑动窗口的大小意味着接收方还有多大的缓冲区可以用于接收数据。发送方可以通过滑动窗口的大小来确定应该发送多少字节的数据。当滑动窗口为 0 时,发送方一般不能再发送数据报,但有两种情况除外,一种情况是可以发送紧急数据,例如,允许用户终止在远端机上的运行进程。另一种情况是发送方可以发送一个 1 字节的数据报来通知接收方重新声明它希望接收的下一字节及发送方的滑动窗口大小
- 流量控制:流量控制就是利用滑动窗口机制来进行完成的,控制发送方发送速率,保证接收方来得及接收,接收方发送的确认报文中的窗口字段可以用来控制发送方窗口大小,从而影响发送方的发送速率。将窗口字段设置为 0,则发送方不能发送数据。
- 拥塞控制:拥塞控制就是为了防止过多的数据注入到网络中,这样就可以使网络中的路由器或链路不致过载。为了进行拥塞控制,TCP 发送方要维持一个 拥塞窗口(cwnd) 的状态变量。拥塞控制窗口的大小取决于网络的拥塞程度,并且动态变化。发送方让自己的发送窗口取为拥塞窗口和接收方的接受窗口中较小的一个。它采用了几种算法:慢开始 、 拥塞避免 、快重传 和 快恢复。
面试题14. TCP的拥塞控制
面试题15. 一个数据包大小怎么确定?mss在三次握手时确认?
面试题16. HTTP1.0 HTTP 1.1 HTTP 2.0主要区别?,长连接和短连接的区别?
HTTP1.0 HTTP 1.1主要区别:
- 长连接:在1.0的时候需要使用keep-alive参数来告知服务器端要建立一个长连接,但是在http1.1的时候是默认支持长连接的
- Host域:在1.0的时候是一个主机通过IP+端口绑定,但是在1.1之后新增加了一个host域,可以在一台服务器上共享多个虚拟主机
- 带宽优化:在1.0的时候如果你只是想要某个对象的一部分资源,他也会给你全部的资源,但是在1.1之后新加了一个range头域,如果你需要一部分资源,服务器只会给你返回一部分资源,而且成功之后的状态码是206
- 新增了一些状态码:比如新增加的409(当前请求的资源和资源的当前状态发生冲突),或者是410,请求资源永久性删除
HTTP1.1 HTTP 2.0主要区别:
- 、多路复用:在1.1传输数据的时候只能是有序的一个一个的数据包进行发送,但是在2.0的时候采用了二进制分帧的机制实现,这些封装好的帧可以乱序的发送,发送完成之后,会对帧首部的流标识符进行重新组装
- 首部压缩:利用报文头部压缩
- 请求优先级;就是每个流可以有0-31bit的优先级,这个可以在客户端那边进行设置
- 服务端推送:
Http2.0的缺点:
- 如果TCP的一个包丢了之后,会导致整个连接阻塞,那么后面所有的包都会受到影响
面试题17. 为什么tcp有首部长度而udp没有?
面试题18. tcp字节流导致哪些问题?不实时、无边界可能会粘包?tcp包的长度怎么算?
面试题19. 说一下Tcp 保活功能?
如果一个给定的连接,在两个小时内没有任何的动作,则服务器就向客户发送一个探测报文段,客户主机必须处于以下四个状态之一:
1)客户主机依然正常运行,并从服务器可
达,客户的 tcp 响应正常,而服务器也知道对方是正常的,服务器在两个小时后将保活定时
器复位。
2)客户主机已经崩溃,并且关闭或正在重新启动。在任何一种情况下,客户的 tcp都没有响应,服务器不能收到对探测的响应,并在 75s 后超时,服务器总共发送 10 个这样的探测,每个间隔 75s。若服务器没有收到一个响应,他就认为客户主机已经关闭,并终止连接。
3)客户主机崩溃并已重新启动,服务器将收到一个对其保活探测的响应,这个效应是一个复位,使得服务器终止这个链接。
4)客户机正常运行,但服务器不可达,和 2)类似
面试题20、说一下https的连接步骤?
- 客户端发起请求:当客户端通过https对服务器发起请求的时候,https的默认端口是443而不是http的默认80端口
- 服务器端进行配置:其实就是服务器端需要有一对证书,这对证书中包含了公钥和密钥(密钥相当于是钥匙,公钥相当于是一把锁谁都能看到但是没有钥匙的话就打不开),证书的话是可以自己制作也可以向机构申请(需要付费),区别的话就是自己制作的证书需要客户端验证通过之后才可以使用,而后者的话是不需要用户进行验证的。
- 传送证书: 这个证书其实就是公钥,只是包含了很多信息,如证书的颁发机构,过期时间等等。
- 客户端解析证书:首先客户端收到证书会先对证书进行验证(是由客户端的SSL/TLS来完成的),看证书是不是有效(里面包含的有证书的颁发机构,过期时间等),如果无效的话,会弹出一个警示框,如果有效的话,就会生成一个随机值,然后通过证书(也就是公钥)对这个生成的随机值进行加密,这样就相当于把随机值用锁头锁起来,这样除非有钥匙,不然看不到被锁住的内容。
- 传送加密信息:然后把第四步的这个加密之后的随机值,进行发送给服务器端,如果服务器端有对应的密钥(钥匙),他就可以进行查看里面的信息。
- 服务端解密信息: 服务端用私钥解密后,得到了客户端传过来的随机值,然后把内容通过该随机值进行对称加密,将信息和私钥通过某种算法混合在一起,这样除非知道私钥,不然无法获取内容,而正好客户端和服务端都知道这个私钥,所以只要加密算法够彪悍,私钥够复杂,数据就够安全。
- 传输加密后的信息:然后把加密的消息一并发送给客户端
- 客户端解密信息:客户端用之前生产的私钥解密服务端传过来的信息,于是获取了解密后的内容。整个过程第三方即使监听到了数据,也束手无策。
面试题21. HTTP请求报文与响应报文格式(或者问请求头部字段的)?
请求头报文大都分为四部分:
- 请求行
- 请求的首部字段
- 通用首部字段
- 实体首部字段
响应报文大都分为四部分:
二次网络学习记录:
(1)网络中是如何进行发送数据的和如何准备?
(2)发送一个文件再网络过程中的整个发送流程和就收数据包的流程?
(3)网络层的几个协议
(4) 传输层:UDP的特点:
(5)传输层:(2)TCP的特点:
(6)传输层:(3)如何保证TCP传输是可靠传输:
- 超时重传的停等待协议:
- 为了提高停等协议效率,就得提高信道利用率,Td是发送数据包的时间,RTT是发送和确认接收数据包的整个流程时间,Ta就是接受确认数据包的时间,其实通过公式可以看出提高信道利用率,只需要提高Td(也就是发送数据包的时间就行了),就是通过不停的发送在滑动窗口中的数据包,然后批量确认接收滑动窗口中的数据包就可以了,其实就是流水线传输
- TCP中的在进行对滑动窗口确认的时候使用的是累计确认机制,不会等到滑动窗口中中的数据包过来一个进行确认一个,如果累计确认的过程中中间的3数据包丢失了,那么会确认到2的位置,表示2后面的3和4、5都没有收到
(7)传输层:TCP的首部报文格式
这里的文件中的序号是指把文件拆分为很多个数据包,然后会把这些数据包排序放到TCP缓存中,但是在进行传输的时候会从TCP缓存中再去取不固定长度的多个数据包,来组成要发送的数据段图中的长方形中的数据就是这个多个数据包中的第一个数据包的序号,其实这个序号也就是TCP中要发送的ACK的那个序号
通过客户端向服务器端发送一个http的get请求网页,产生的一次交互的数据报
(8)传输层:如何通过TCP滑动窗口技术实现可靠传输?
- 滑动窗口实现可靠传输
- TCP的流量控制,会通过控制滑动窗口的大小来进行控制传输速率
(9)传输层:为什么需要三次进行握手建立连接,而不是二次?
- 是因为当客户A向服务器发送连接请求的时候,有可能会出现一种情况,A先发了一个同步的连接数据包,但是由于这个数据包在网络中传输的路线比较远时间比较久,然后A等了一会没反应,就立刻又发了一个同步报文A2,这次很快就得到了B的回复,但是此时B才收到A发的第一个报文,所以他还是会给A在发一个确认报文
- 此时B给A回复完第一次A发的同步数据包的时候,B就开始等着A给他发送数据,这个时候就会占用服务B器的资源,如果出现过多这种情况的话,那么B服务器就崩了,所以为了避免这种情况出现,所以是必须需要第三次握手的目的就是,如果服务器回复完A的同步报文之后,等一段时间()后,如果等不到A给B的第三次握手,那就不等了,所以也就不会浪费服务器B的资源了
- 还有一个作用是防止已失效的连接重新建立
TCP建立的几个状态的变换: