参考
网络编程释疑之:TCP连接拔掉网线后会发生什么 Tcp编程常见问题及解决方法总结(粘包,拆包) netty4粘包/拆包/断包 解决方案 TCP粘包问题分析和解决(全) https://www.nowcoder.com/discuss/393011?type=all&order=time&pos=&page=2&channel= 抓包工具tcpdump用法说明1、OSI七层模型:
物理层、数据链路层、网络层、传输层、会话层、表示层和应用层。2、TCP/IP五层网络模型
物理层,数据链路层,网络层,传输层,应用层3、TCP/IP四层网络模型
物理接口层,网络层,运输层,应用层4、问了tcp拔掉网线之后还需要重连吗
如果网线断开的时间短暂,在SO_KEEPALIVE设定的探测时间间隔内,并且两端在此期间没有任何针对此长连接的网络操作。当连上网线后此TCP连接可以自动恢复,继续进行正常的网络操作。如果网线断开的时间很长,超出了SO_KEEPALIVE设定的探测时间间隔,或者两端期间在此有了任何针对此长连接的网络操作。当连上网线时就会出现ETIMEDOUT或者ECONNRESET的错误。你必须重新建立一个新的长连接进行网络操作。 所以关键是速度要快,只要重连的速度够快,服务器就发现不了你断开了连接 参考:网络编程释疑之:TCP连接拔掉网线后会发生什么
5、TCP的粘包问题怎么解决的,使用的字符串存下来的,怎么区分两个包
(1)TCP为了保证可靠传输,尽量减少额外开销(每次发包都要验证),因此采用了流式传输,面向流的传输,相对于面向消息的传输,可以减少发送包的数量,从而减少了额外开销。但是,对于数据传输频繁的程序来讲,使用TCP可能会容易粘包。当然,对接收端的程序来讲,如果机器负荷很重,也会在接收缓冲里粘包。这样,就需要接收端额外拆包,增加了工作量。因此,这个特别适合的是数据要求可靠传输,但是不需要太频繁传输的场合(两次操作间隔100ms,具体是由TCP等待发送间隔决定的,取决于内核中的socket的写法)
(2)UDP,由于面向的是消息传输,它把所有接收到的消息都挂接到缓冲区的接受队列中,因此,它对于数据的提取分离就更加方便,但是,它没有粘包机制,因此,当发送数据量较小的时候,就会发生数据包有效载荷较小的情况,也会增加多次发送的系统发送开销(系统调用,写硬件等)和接收开销。因此,应该最好设置一个比较合适的数据包的包长,来进行UDP数据的发送。(UDP最大载荷为1472,因此最好能每次传输接近这个数的数据量,这特别适合于视频,音频等大块数据的发送,同时,通过减少握手来保证流媒体的实时性)
粘包出现原因
简单得说,在流传输中出现,UDP不会出现粘包,因为它有消息边界(参考Windows网络编程)
1.TCP为提高传输效率,发送端需要等缓冲区满才发送出去,造成粘包
2.接收方不及时接收缓冲区的包,造成多个包接收
粘包情况有两种,一种是粘在一起的包都是完整的数据包,另一种情况是粘在一起的包有不完整的包。
不是所有的粘包现象都需要处理,若传输的数据为不带结构的连续流数据(如文件传输),则不必把粘连的包分开(简称分包)。但在实际工程应用中,传输的数据一般为带结构的数据,这时就需要做分包处理。
封包
封包就是给一段数据加上包头,这样一来数据包就分为包头和包体两部分内容了(以后讲过滤非法包时封包会加入"包尾"内容)。包头其实上是个大小固定的结构体,其中有个结构体成员变量表示包体的长度,这是个很重要的变量,其他的结构体成员可根据需要自己定义。根据包头长度固定以及包头中含有包体长度的变量就能正确的拆分出一个完整的数据包。
拆包
利用底层的缓冲区来进行拆包
由于TCP也维护了一个缓冲区,所以我们完全可以利用TCP的缓冲区来缓存我们的数据,这样一来就不需要为每一个连接分配一个缓冲区了。另一方面我们知道recv或者wsarecv都有一个参数,用来表示我们要接收多长长度的数据。利用这两个条件我们就可以对第一种方法进行优化。
对于阻塞SOCKET来说,我们可以利用一个循环来接收包头长度的数据,然后解析出代表包体长度的那个变量,再用一个循环来接收包体长度的数据。
粘包问题的解决策略
由于底层的TCP无法理解上层的业务数据,所以在底层是无法保证数据包不被拆分和重组的,这个问题只能通过上层的应用协议栈设计来解决。业界的主流协议的解决方案,可以归纳如下:
1. TCP提供了强制数据立即传送的操作指令push,TCP软件收到该操作指令后,就立即将本段数据发送出去,而不必等待发送缓冲区满;
2. 发送固定长度的消息,报文大小固定长度,例如每个报文的长度固定为200字节,如果不够空位补空格;
3. 把消息的大小与消息一块发送,接收对等方先接收包体长度,依据包体长度来接收包体
4. 双方约定每次传送的大小
5. 双方约定使用特殊标记来区分消息间隔,例如每条报文结束都添加回车换行符(例如FTP协议)或者指定特殊字符作为报文分隔符,接收方通过特殊分隔符切分报文区分;
6. 标准协议按协议规则处理,如Sip协议
参考:
Tcp编程常见问题及解决方法总结(粘包,拆包) netty4粘包/拆包/断包 解决方案 TCP粘包问题分析和解决(全)6、如果cookie被禁用了,怎么使用session
1. 经常被使用的一种技术叫做URL重写,就是把session id直接附加在URL路径的后面。2. 还有一种技术叫做表单隐藏字段。就是服务器会自动修改form表单,添加一个隐藏字段,以便在表单提交时能够把session id传递回服务器。比如:
<form name=”"testform”" action=”"/xxx”"> <input type=”"hidden”" name=”"jsessionid”" value=”"ByOK3vjFD75aPnrF7C2HmdnV6QZcEbzWoWiBYEnLerjQ99zWpBng!-145788764″”/> <input type=”"text”"> </form>参考:cookie被禁止后怎样使用session的解决方案
7、怎么把项目部署到云服务器上,说一下流程
安装JDK,TomCat, MySQL, Niginx, 然后导出sql数据,用MySQL运行,将项目打包成war包放到tomcat的webapp目录下,配置Nginx,打开浏览器即可访问8、是使用IP加端口号直接访问的吗,如果端口号被禁用了怎么办
修改tomcat的配置文件,把8080修改为80,因为80是Http的端口,一定不会被禁用,修改后可以直接通过ip将项目名即可访问,因为浏览器的默认端口号是809、HTTP劫持
在正常的数据流中插入特定的网络数据报文,让客户端解释错误的数据,并以弹出新窗口的形式向使用者展示小广告或网页内容
步骤:
在TCP连接中标识HTTP协议链接;
改HTTP响应体;
将篡改后的数据包抢先回发到用户,这样后面的数据包在到达后会被直接丢弃。而客户端显示改后的网页
防范:
事前加密:HTTPS,防止明文传输被挟持,(但防不了DNS挟持)
事中加密:拆分HTTP请求数据包,运营商的旁路设备没有完整的TCP/IP协议栈,不能标记,web服务器有完整的TCP/IP协议栈,能把接收到的数据包拼成完整的HTTP请求,不影响服务
事后屏蔽:前端显示HTTP时对内容进行检测,在DOM结构发生变化时触发回调
DNS劫持:通过劫持DNS服务器,获得某域名的解析记录控制权,修改此域名的解析结果。把原来对A域名的访问转入B域名,返回错误的查询结果。可能是一些产品的持续的推广
区别:DNS劫持倾向于持续性,访问一个界面时强行推送广告,HTTP劫持频率多变,劫持过程也非常快,一般多出现于网站小尾巴
HTTPS挟持:伪造证书来进行挟持….
10、跨域
跨域,指的是浏览器不能执行其他网站的脚本。它是由浏览器的同源策略造成的,是浏览器施加的安全限制。
同源:域名,协议,端口均相同
即浏览器只能执行相同协议、相同域名、相同端口下的网站脚本,执行的时候如果网站的脚本不属于现在这个界面,就不会执行
链接:https://www.nowcoder.com/discuss/393011?type=all&order=time&pos=&page=2&channel=
11、HTTP请求响应中断原因
网断了,网络阻塞,请求超时,浏览器出问题,服务器出问
12、ipv4和ipv6的转换。ipv4到ipv6的过渡手段
ipv4和ipv6的过渡是一个循序渐进的过程,在用户体验IPv6带来的好处的同时仍能与网络中其余的IPv4用户通信。
主流技术:1. 双栈策略:(最直接方式)在IPv6结点中加入IPv4协议栈。这种具有双协议栈的结点称作“IPv6/v4结点”,这些结点可以使用IPv4与IPv4结点互通,也可以直接使用IPv6与IPv6结点互通。
2. 隧道技术:(为解决局部纯IPv6网络与IPv4骨干隔离形成的孤岛问题,用隧道技术的方式解决)利用穿越现存IPv4互联网的隧道技术将孤岛连接起来,逐步扩大IPv6的实现范围。在隧道的入口处,路由器将IPv6的数组分组封装进入IPv4中,IPV4分组的源地址和目的地址分别是隧道入口和出口的IPV4地址。在隧道的出口处再将IPV6分组取出转发给目的节点。
隧道技术在实践中有四种具体形式:构造隧道、自动配置隧道、组播隧道以及6to4。
3. 隧道代理TB,Tunnel Broker。(目的是简化隧道的配置,提供自动的配置手段),TB可以看作是一个虚拟的IPv6 ISP,它为已经连接到IPv4网络上的用户提供连接到IPv6网络的手段,而连接到IPv4网络上的用户就是TB的客户。
4. 协议转换技术。其主要思想是在V6节点与V4节点的通信时需借助于中间的协议转换服务器,此协议转换服务器的主要功能是把网络层协议头进行V6/V4间的转换,以适应对端的协议类型。
5. SOCKS64。
在客户端里引入SOCKS库,它处于应用层和socket之间,对应用层的socket API和DNS域名解析API进行替换。
另一种是SOCKS网关。
6. 传输层中继
与SOCKS64的工作机理相似,只不过是在传输层中继器进行传输层的“协议翻译”
7. 应用层代理网关(ALG)
类似。在应用层进行协议翻译。
13、网页卡顿原因
网速慢、带宽不足、硬件配置低、内存被占满。
JS脚本过大,阻塞了页面的加载。
网页资源过多、接受数据时间长、加载某个资源慢。
DNS解析速度。
一般怎么检查
硬件问题:检查网线或者无限网卡有没有插好,有没有连上路由器,就是底层是不是联通状态;
软件问题:查看是否有对应的驱动,服务器好不好,DNS对不对,或者可能是代理没关
当网页加载很慢的时候,应如何分析其原因并解决问题?
http请求次数太多
资源过大,资源过多
JS脚本过大
网速慢
14、抓包工具tcpdump用法说明
tcpdump采用命令行方式对接口的数据包进行筛选抓取,其丰富特性表现在灵活的表达式上。不带任何选项的tcpdump,默认会抓取第一个网络接口,且只有将tcpdump进程终止才会停止抓包。所以常用的选项也就这几个:
- tcpdump -D
- tcpdump -c num -i int -nn -XX -vvv
-D:列出可用于抓包的接口。将会列出接口的数值编号和接口名,它们都可以用于"-i"后。
-c:指定要抓取的包数量。
-i interface:指定tcpdump需要监听的接口。
-n:对地址以数字方式显式,否则显式为主机名,也就是说-n选项不做主机名解析。 -nn:除了-n的作用外,还把端口显示为数值,否则显示端口服务名。
-X:输出包的头部数据,会以16进制和ASCII两种方式同时输出。
-XX:输出包的头部数据,会以16进制和ASCII两种方式同时输出,更详细。
-v:当分析和打印的时候,产生详细的输出。 -vv:产生比-v更详细的输出。 -vvv:产生比-vv更详细的输出。
参考:抓包工具tcpdump用法说明