java.net.SocketException: No buffer space available

  • It certainly sounds like you are leaking Sockets somehow in your app. 这句话意思就是开了socket,没有关

  • Check that your code always closes the Sockets it opens … even in the event of some exception; i.e. do the close in a finally block.

state 介绍

  • TIME_WAIT:表示主动关闭,通过优化系统内核参数可容易解决。
  • CLOSE_WAIT:表示被动关闭,需要从程序本身出发。
  • ESTABLISHED:表示正在通信

解决办法

下次出现这种情况的时候,
netstat -apn | grep java
netstat -apn | grep 8983
netstat -nap | grep pid
检查一下本机java程序占用了多少端口,主要是跟8983的连接还是5000的连接?

端口占用状态

某次的结果

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
tcp        0      0 127.0.0.1:63342         0.0.0.0:*               LISTEN      8959/java
tcp 0 0 127.0.0.1:6942 0.0.0.0:* LISTEN 8959/java
tcp 0 0 0.0.0.0:54152 0.0.0.0:* LISTEN 8959/java
tcp6 0 0 127.0.0.1:7983 :::* LISTEN 23705/java
tcp6 0 0 :::8080 :::* LISTEN 32668/java listen状态,是本地tomcat启动的项目,监听8080
tcp6 0 0 :::8983 :::* LISTEN 23705/java listen状态,是本地jetty启动的solr,监听8983端口
tcp6 0 0 :::53056 :::* LISTEN 9342/java
tcp6 0 0 127.0.0.1:8005 :::* LISTEN 32668/java
tcp6 0 0 :::8009 :::* LISTEN 32668/java
tcp6 1 0 127.0.0.1:36061 127.0.0.1:8983 CLOSE_WAIT 32668/java tomcat启动的项目,向solr发送socket连接
tcp6 1 0 127.0.0.1:36060 127.0.0.1:8983 CLOSE_WAIT 32668/java
tcp6 1 0 127.0.0.1:36062 127.0.0.1:8983 CLOSE_WAIT 32668/java
tcp6 0 0 9.186.100.11:57211 151.101.40.215:80 ESTABLISHED 9342/java
tcp6 0 0 9.186.100.11:46481 151.101.44.215:80 ESTABLISHED 9342/java
tcp6 0 0 9.186.100.11:46483 151.101.44.215:80 ESTABLISHED 9342/java

tcp6 0 0 9.186.100.11:46482 151.101.44.215:80 ESTABLISHED 9342/java

tcp6 0 0 9.186.100.11:46484 151.101.44.215:80 ESTABLISHED 9342/java

某次的结果

1
2
3
4
5
6
7
8
9
10
11
12
13
tcp6       0      0 :::8080                 :::*                    LISTEN      75106/java
tcp6 0 0 :::8983 :::* LISTEN 74867/java

tomcat启动的项目,向solr发送socket连接,怎么变这么多了?
会存在多个线程采用同一个单例,向solr发送socket连接
tcp6 1 0 127.0.0.1:48876 127.0.0.1:8983 CLOSE_WAIT 75106/java close的socket连接
tcp6 1 0 127.0.0.1:45752 127.0.0.1:8983 CLOSE_WAIT 75106/java close的socket连接
tcp6 1 0 127.0.0.1:48925 127.0.0.1:8983 CLOSE_WAIT 75106/java
tcp6 1 0 127.0.0.1:48729 127.0.0.1:8983 CLOSE_WAIT 75106/java
tcp6 1 0 127.0.0.1:48714 127.0.0.1:8983 CLOSE_WAIT 75106/java
tcp6 1 0 127.0.0.1:48924 127.0.0.1:8983 CLOSE_WAIT 75106/java
tcp6 1 0 127.0.0.1:48763 127.0.0.1:8983 CLOSE_WAIT 75106/java
tcp6 1 0 127.0.0.1:48764 127.0.0.1:8983 CLOSE_WAIT 75106/java

过一段时间会有变化,下面标红色的,是新增的两个socket连接,

1
2
3
4
5
6
7
8
tcp6       1      0 127.0.0.1:48925         127.0.0.1:8983          CLOSE_WAIT  75106/java
tcp6 1 0 127.0.0.1:48729 127.0.0.1:8983 CLOSE_WAIT 75106/java
tcp6 1 0 127.0.0.1:56303 127.0.0.1:8983 CLOSE_WAIT 75106/java 新增的socket连接
tcp6 1 0 127.0.0.1:48714 127.0.0.1:8983 CLOSE_WAIT 75106/java
tcp6 1 0 127.0.0.1:48924 127.0.0.1:8983 CLOSE_WAIT 75106/java
tcp6 1 0 127.0.0.1:48763 127.0.0.1:8983 CLOSE_WAIT 75106/java
tcp6 1 0 127.0.0.1:56302 127.0.0.1:8983 CLOSE_WAIT 75106/java 新增的socket连接
tcp6 1 0 127.0.0.1:48764 127.0.0.1:8983 CLOSE_WAIT 75106/java

solrSearch.query(queryParameters); 会建立连接 默认采用GET方式发送请求
还是 new HttpSolrClient(URL) 的尚未建立连接,只是做了一下config。

update的时候
solr.add(doc) send the SolrInputDocument to the Solr update request handler over HTTP.

概念

什么是网络编程?
传输层以下,一般在操作系统内核中执行。通常所说的网络编程,基本等价于socket编程,以及socket之上的编程?

网络层也有对应的api,应该。

应用编程接口(TCP/IP详解 1.15节)

使用TCP/IP协议的应用程序通常采用两种应用编程接口(API):socket和TLI(运输层接口: Transport Layer Interface)。前者有时称作“Berkeley socket”,表明它是从伯克利版发展而来的。后者起初是由 AT & T开发的,有时称作 X T I( X / O p e n运输层接口),

socket编程能干嘛?有什么是socket编程搞不定的,必须要改内核的?

能干嘛

  • 代理,比如shadowsocks
  • vpn是吗?貌似vpn工作在底层,不算socket编程。vpn是通过编写一套网卡驱动并注册到操作系统实现的虚拟网卡。
  • 猎豹wifi也是虚拟出一张网卡

Overview

  • 目录名参考 java.net包, javax.net包
  • 目的:

怎样算得上熟悉 TCP/IP 协议编程?

能进行网络编程

一般书上只讲解了OSI模型中的七层模型,实验也只是socket通信。怎样算得上熟悉 TCP/IP 协议编程?

  1. 如果你说你会select,epoll,iocp模型,那会让对方觉得更靠谱
  2. 如果你说出你做过im,下载之类那会让对方来兴趣.
  3. 如果你说设计了通讯协议,会让对方觉得更贴切
  4. 如果你说做过,熟悉, ftp http snmp smtp 这些简单的老古董协议,会加分,但不大.
  5. 如果你说熟悉bt,emule,udt等协议,那会对你很有好感.
  6. 如果你说你破解过某大牌 qq,360内某通讯协议,那会对你加分很大

参考知乎:https://www.zhihu.com/question/20795067/answer/16259037

问题集

  • 现在可以写代码看到传输层的信息。 已经看到了http header, smtp header, 怎样打印tcp header?
  • 可以看到更底层的报文吗? 怎样打印更底层的header?通过java、python可以看到更底层的header吗?
  • 公司的网络截断是怎样做的?猜测就是wireshark的封装,监听通过网卡的每个连接。

待学习资料

  • 计算机网络自顶向下方法,其中有python的学习代码

未分类信息

CRLF

CRLF命令
它表示键盘上的”Enter”键(可以用来模拟回车键)。
CRLF注入
就是说黑客能够将CRLF命令注入到系统中。它不是系统或服务器软件的漏洞,而是网站应用开发时,有些开发者没有意识到此类攻击存在的可能而造成的。
针对这个漏洞黑客能够做什么?
就算黑客发现网站存在CRLF注入,他们仍然受到应用结构和这个缺陷的严重程度的限制。
对有些站点它将非常严重,而有些站点它只是很小的bug。
HTTP Header CRLF Injection
许多网络协议,包括HTTP也使用CRLF来表示每一行的结束。这就意味着用户可以通过CRLF注入自定义HTTP header,导致用户可以不经过应用层直接与Server对话。
HTTP header的定义就是基于这样的”Key: Value”的结构,用CRLF命令表示一行的结尾。
“Location:”头用来表示重定向的URL地址,”Set-Cookie:”头用来设置cookies。
如果用户的输入经过验证,其中存在CRLF的字符就可以被用来达到欺骗的目的。

dfd

虚拟私有云VPC

随着网络规模的不断扩大,ARP欺骗、广播风暴、主机扫描等网络安全问题越来越严重,为了解决这些问题,出现了各种网络隔离技术,比如虚拟局域网(VLAN)、VPC等。虽然VLAN技术可以将网络的用户进行隔离,但是VLAN的数量最大只能支持到4096个,无法支撑公有云的巨大用户量。

虚拟私有云(VPC:Virtual Private Cloud)与VPN类似,实现VPC也需要利用隧道技术,以及SDN(软件定义网络)。利用VPC技术可以将公有云的网络隔离,每个VPC网络都有一个隧道号,相互之间逻辑上彻底隔离。

客户端

客户端入口-local.py

服务端

服务端入口-

log分析

1
2
3
4
$ sudo python shadowsocks/server.py -p 443 -k password -m rc4-md5
2018-02-03 13:29:32 INFO loading libcrypto from libcrypto.so.1.0.0
2018-02-03 13:29:32 INFO server start with protocol[origin] password [password] method [rc4-md5] obfs [plain] obfs_param []
...

obfs:混淆,针对中国防火墙

与ss区别部分的源代码

Overview

##

ss翻墙有一个必要的前提就是客户端本身必须支持socks5协议(比如浏览器一般都支持soc
ks5配置),这样才能将和客户端本地的shadowsocks socks5代理进程互换数据,不过这
也造成了很多软件是没法通过ss实现翻墙的

调试debug

客户端

客户端入口-local.py

ss-local 总体工作流程如下:

  1. 监听来自本机浏览器的代理请求;
  2. 转发前加密数据;
  3. 转发socket数据到墙外代理服务端;
  4. 把服务端返回的数据转发给用户的浏览器。

服务端

服务端入口-

Shadowsocks 源码分析——协议与结构 https://loggerhead.me/posts/shadowsocks-yuan-ma-fen-xi-xie-yi-yu-jie-gou.html

Shadowsocks 源码分析——UDP 代理 https://loggerhead.me/posts/shadowsocks-yuan-ma-fen-xi-udp-dai-li.html

客户端与服务端共用的方法

socks5

作用?

中继器

给shadowsocks添加中继功能 https://github.com/shadowsocks/shadowsocks/issues/695

利用Socket 实现中继(中转/端口转发)加速。
Shadowsocks利用 iptables 实现中继(中转/端口转发)加速

  • TCPRelay 中继器
  • UDPRelay 中继器
  • 加密方法

-

待看

关于代理设置–SwitchyOmega

为什么HTTP和HTTPS都需要验证(Authentication),而SOCKS4和SOCKS5不需要验证?

Bypass List(默认)

1
2
3
127.0.0.1
[::1]
localhost

如何分析

  1. 路由分析

  2. 抓包分析,好像用不着这么底层

其他

socks5是协议,不是加密算法
采用socks协议的代理服务器就是SOCKS服务器,是一种通用的代理服务器。

HTTPS代理是不是只能访问https的页面?还是代理服务器要求必须要https连接?

SSL是一种国际标准的加密及身份认证通信协议,可作为访问加密网站的代理。
加密网站是指以https://开始的网站。ssl的标准端口为443。

socks4/socks5只是简单地将一端的系统连接到另外一端。socks 4只支持TCP协议而socks 5支持TCP/UDP协议,

参考

https://blog.mimvp.com/article/7443.html

wifi有限的访问权限

原因

一般情况都是说明你只能连接到网关(路由器),但是不能接入互联网,所以叫做“有限访问”。

不会跳转怎么办?

我采用的方法是手动在浏览器输入要跳转到的url

很多时候往往是等录过后一段时间就变成“有限的访问权限”,而且是断断续续的,怎么解决?

关闭windows网络连接状态指示器的活动测试

,点击开始按钮,在运行命令框中输入“gpedit.msc”后按回车,依次打开 计算机配置-》管理模块-》系统-》internet通信设置-》internet通信设置,双击“关闭windows网络连接状态指示器的活动测试”,选择“已禁用”,点击确定按钮退出。

然后再断开连接在重连就好了

关闭windows网络连接状态指示器的活动测试


此策略设置会关闭由 Windows 网络连接状态指示器(NCSI)执行的活动测试,而该测试可以确定
计算机是连接到 Internet 还是连接到受较多限制的网络。

NCSI 作为确定连接级别的一部分,会执行以下两种活动测试之一: 从专用 Web 服务器下载
页面,或对专用地址执行 DNS 请求。

如果启用此策略设置,则 NCSI 将不运行这两种活动测试的任何一种。 这可能会降低 NCSI 以及使用 NCSI 的其他组件确定 Internet 访问的能力。 如果禁用或未配置此策略设置,NCSI 将运行这两种活动测试之一。

禁用DHCP,使用静态IP

重启路由器

##