网络知识
一、http响应码301和302的区别是什么?
301,302都代表着某个URL发生了转移
区别:
301:代表永久性转移
302:代表暂时性转移
二、简述tcp和udp的区别?
tcp是面向连接的可靠协议,如打电话先拨号建立连接;
udp是无连接的不可靠协议,发送数据前不需要建立连接。
三、TCP三次握手过程
1.客户端向服务器发送一个含有同步序列号的标志位的数据段,向服务器发起建立连接的请求。通过这个数据段,客户端告诉服务器两件事:客户端想要和服务器进行通信以及服务器可以用那个序列号作为起始数据段来回应我。
2.服务器收到客户端的请求后,用一个带有确认应答(ACK)和同步序列号(SYN)标志位的数据段来响应客户端,服务器告诉客户端两件事:成功收到客户端发来的建立连接请求和客户端需要用服务器发送的带标志位的数据段作为起始数据段来回应客户端。
3.客户端收到这个数据段后,会再次发送一个确认应答,确认已成功收到服务器发过来的数据段,然后开始传输数据。
四、TCP为什么要三次握手,两次不行吗?
三次握手是为了实现可靠数据传输,TCP协议的通信双方,都必须维护一个序列号,以标识发送出去的数据包中,哪些是已经被对方接收到的。
三次握手的过程即是上方相互告知序列号起始值,并确认对方已经收到了序列号起始值的必经步骤,如果只是两次握手的话,最多只有连接发起方的起始序列号能被确认,另一方选择的序列号是得不到确认的。
五、get和post请求的区别有哪些?
get请求在回退是是无害的,而post请求会再次提交请求;
get请求只能进行url编码,而post支持多种编码方式;
get请求在参数传送时是有长度限制的,而post没有;
get参数通过url传递,而post放在request body中;
get比post更加地不安全,因为参数直接暴露在URL上,是不能用来传递敏感信息的。
六、TCP中粘包、拆包的问题
粘包拆包问题是处于网络比较底层的问题,在数据链路层、网络层以及传输层都有可能发生。我们日常的网络应用开发大都在传输层进行,由于UDP有消息保护边界,不会发生粘包拆包问题,因此粘包拆包问题只发生在TCP协议中。
什么是粘包、拆包?
假设客户端向服务端连续发送了两个数据包,用packet1和packet2来表示,那么服务端收到的数据可以分为三种,现列举如下:
第一种情况,接收端正常收到两个数据包,即没有发生拆包和粘包的现象,此种情况不在本文的讨论范围内。
在这里插入图片描述
第二种情况,接收端只收到一个数据包,由于TCP是不会出现丢包的,所以这一个数据包中包含了发送端发送的两个数据包的信息,这种现象即为粘包。这种情况由于接收端不知道这两个数据包的界限,所以对于接收端来说很难处理。
在这里插入图片描述
第三种情况,这种情况有两种表现形式,如下图。接收端收到了两个数据包,但是这两个数据包要么是不完整的,要么就是多出来一块,这种情况即发生了拆包和粘包。这两种情况如果不加特殊处理,对于接收端同样是不好处理的。
在这里插入图片描述
为什么会发生TCP粘包、拆包?
发生TCP粘包、拆包主要是由于下面一些原因:
1.应用程序写入的数据大于套接字缓冲区大小,这将会发生拆包。
2.应用程序写入数据小于套接字缓冲区大小,网卡将应用多次写入的数据发送到网络上,这将会发生粘包。
3.进行MSS(最大报文长度)大小的TCP分段,当TCP报文长度-TCP头部长度>MSS的时候将发生拆包。
4.接收方法不及时读取套接字缓冲区数据,这将发生粘包。
粘包、拆包解决办法
TCP本身是面向流的,作为网络服务器,如何从这源源不断涌来的数据流中拆分出或者合并出有意义的信息呢?通常会有以下一些常用的方法:
1、发送端给每个数据包添加包首部,首部中应该至少包含数据包的长度,这样接收端在接收到数据后,通过读取包首部的长度字段,便知道每一个数据包的实际长度了。
2、发送端将每个数据包封装为固定长度(不够的可以通过补0填充),这样接收端每次从接收缓冲区中读取固定长度的数据就自然而然的把每个数据包拆分开来。
3、可以在数据包之间设置边界,如添加特殊符号,这样,接收端通过这个边界就可以将不同的数据包拆分开。