简介 TCP 和 UDP 区别,他们位于哪一层?
TCP --- 传输控制协议,提供的是面向连接、可靠的字节流服务。当客户和服务器彼此交换数据前,必须先在双方之间建立一个TCP连接,之后才能传输数据。TCP提供超时重发,丢弃重复数据,检验数据,流量控制等功能,保证数据能从一端传到另一端。 理想状态下,TCP连接一旦建立,在通信双方中的任何一方主动关闭连接前,TCP 连接都将被一直保持下去。断开连接时服务器和客户端均可以主动发起断开TCP连接的请求
UDP --- 用户数据报协议,是一个无连接的简单的面向数据报的运输层协议。UDP不提供可靠性,它只是把应用程序传给IP层的数据报发送出去,但是并不能保证它们能到达目的地。由于UDP在传输数据报前不用在客户和服务器之间建立一个连接,且没有超时重发等机制,故而传输速度很快
位于 OSI 七层模型的第四层(由下往上)传输层
路由器和交换机的工作原理大概是什么,他们分别用到什么协议,位于哪一层?
交换机主要基于网桥技术,用于组建局域网,局域网中的终端与终端可以进行数据交换;路由器主要基于路由选择技术,用于将数据路由到上层网路的正确路径中。
交换机工作在数据链路层(7层网络协议的第二层);路由器工作在网络层(7层网络协议的第三层)。
交换机识别的是MAC地址;路由器识别的是IP地址。
描述TCP 协议三次握手,四次释放的过程。
第一次握手:客户端发送syn包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确认;
第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态;
第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。
四次握手关闭连接:
(客户端):我要关闭连接了。
(服务端):你那边的连接可以关闭了。
(服务端):我这边也要关闭连接了。
(客户端):你那边的连接可以关闭了。
由于连接是双向的,所以双方都要主动关闭自己这一侧的连接。
TCP 协议是如何进行流量控制,拥塞控制的?
1、通信开始时,发送方的拥塞窗口大小为 1。每收到一个 ACK 确认后,拥塞窗口翻倍。
2、由于指数级增长非常快,很快地,就会出现确认包超时。
3、此时设置一个“慢启动阈值”,它的值是当前拥塞窗口大小的一半。
4、同时将拥塞窗口大小设置为 1,重新进入慢启动过程。
5、由于现在“慢启动阈值”已经存在,当拥塞窗口大小达到阈值时,不再翻倍,而是线性增加。
6、随着窗口大小不断增加,可能收到三次重复确认应答(发送方意识到接收方没收到数据,所以重发),进入“快速重发”阶段。
7、这时候,TCP 将“慢启动阈值”设置为当前拥塞窗口大小的一半,再将拥塞窗口大小设置成阈值大小(也有说加 3)。
8、拥塞窗口又会线性增加,直至下一次出现三次重复确认应答或超时。
为什么建立连接时是三次握手,两次行不行?如果第三次握手失败了怎么处理
根据一般的思路,我们可能会觉得只要两次握手就可以了,第三步确认看似是多余的。那么 TCP 协议为什么还要费力不讨好的加上这一次握手呢?
这是因为在网络请求中,我们应该时刻记住:“网络是不可靠的,数据包是可能丢失的”。假设没有第三次确认,客户端向服务端发送了 SYN,请求建立连接。由于延迟,服务端没有及时收到这个包。于是客户端重新发送一个 SYN 包。回忆一下介绍 TCP 首部时提到的序列号,这两个包的序列号显然是相同的。
假设服务端接收到了第二个 SYN 包,建立了通信,一段时间后通信结束,连接被关闭。这时候最初被发送的 SYN 包刚刚抵达服务端,服务端又会发送一次 ACK 确认。由于两次握手就建立了连接,此时的服务端就会建立一个新的连接,然而客户端觉得自己并没有请求建立连接,所以就不会向服务端发送数据。从而导致服务端建立了一个空的连接,白白浪费资源。
在三次握手的情况下,服务端直到收到客户端的应答后才会建立连接。因此在上述情况下,客户端会接受到一个相同的 ACK 包,这时候它会抛弃这个数据包,不会和服务端进行第三次握手,因此避免了服务端建立空的连接。
关闭连接时,第四次握手失败怎么处理?
实际上,在第三步中,客户端收到 FIN 包时,它会设置一个计时器,等待相当长的一段时间。如果客户端返回的 ACK 丢失,那么服务端还会重发 FIN 并重置计时器。假设在计时器失效前服务器重发的 FIN 包没有到达客户端,客户端就会进入 CLOSE 状态,从而导致服务端永远无法收到 ACK 确认,也就无法关闭连接。
你怎么理解分层和协议?
HTTP 请求中的GET 和 POST 的区别,Session 和 Cookie 的区别。
GET 请求通常用于查询、获取数据,而 POST 请求则用于发送数据,除了用途上的区别,它们还有以下这些不同:
GET 请求可以被缓存,可以被收藏为书签,但 POST 不行。
GET 请求会保留在浏览器的历史记录中,POST 不会。
GET 请求的长度有限制(不同的浏览器不一样,大约在几 Kb 左右),URL 的数据类型只能是 ASCII 字符,POST 请求没有限制。
GET 请求的参数在 URL 中,因此绝不能用 GET 请求传输敏感数据。POST 请求数据则写在 HTTP 的请求头中,安全性略高于 GET 请求。
注意:
POST 请求仅比 GET 请求略安全一点,它的数据不在 URL 中,但依然以明文的形式存放于 HTTP 的请求头中。
cookie 、session 这两者的根本性区别在于,cookie 保存在客户端上,而 session 则保存在服务器中。由此我们还可以拓展出以下结论:
1、cookie 相对来说不安全,浏览器可以分析本地的 cookie 进行 cookie 欺骗。
2、session 可以设置超时时间,超过这个时间后就失效,以免长期占用服务端内存。
3、单个 cookie 的大小有限制(4 Kb),每个站点的 cookie 数量一般也有限制(20个)。
4、客户端每次都会把 cookie 发送到服务端,因此服务端可以知道 cookie,但是客户端不知道 session。
5、当服务器接收到 cookie 后,会根据 cookie 中的 SessionID 来找到这个客户的 session。如果没有,则会生成一个新的 SessionID 发送给客户端。
谈谈你对 HTTP 1.1,2.0 和 HTTPS 的理解。
HTTPS是安全的HTTP