ip
| 网卡地址 | |
本机 | 192.168.8.50 | C8-5B-76-03-AC-5B
|
服务器 | 192.168.8.240:81 | 00 0c 29 69 5f 13 |
工具:wireshark(用于监控本地网络请求)
源码:由于JDK提供的源码,只有部分的SUN源码,更深的源码没有提供,需要跟踪代码的需要自行下载jdk对应的源码
发送HTTP请求的代码:
跟踪代码也发现,前面两步都没有进行HTTP连接,到第三步 conn.getInputStream();才进行连接
(只要运行这部分代码才发现wireshark有数据),进行代码跟着也发现到第三步开始使用SocketPermission,
也就是socket进行连接(其实除了使用socket也没有什么可以使用了)。(TIP:关于socket自行百度,很多介绍文章)
下图是监控到的请求:
本机 | 服务器 | |
1 | 发送空数据 | |
2 | 服务器回复空内容 | |
3 | 发送空数据 | |
4 | 发送数据
| |
5 | 服务器响应对应的数据 ,由于数据量大需要分两个包发送 | |
6 | 服务器响应对应的数据 | |
7 | 发送空数据 | |
8 | 发送空数据 |
根据监控的到时3次握手,2次挥手也仅仅是本机挥手。没有服务器响应。猜想是没有我们没有关闭连接导致。
于是修改代码(找了半天没找到关闭连接的方法,要用HttpURLConnection才有关闭的方法
public static void main(String[] args) throws IOException
{
/*上面构造http,Handler,对url的解析*/
URL u = new URL("http://192.168.8.240:81/intfweb/index.html");
/*初始化连接的数据*/
HttpURLConnection conn = (HttpURLConnection) u.openConnection();
//这一步开始连接
InputStream in = conn.getInputStream();
conn.disconnect();
StringBuffer buf = new StringBuffer();
int t =0;
while((t = in.read())!=-1) {
buf.append((char)t);
}
System.out.println(buf.toString());
}
根据修改的代码进行测试:
上图看出,没有进行关闭的时候连接跟之前是一样的
运行关闭代码,如下:(多出4次请求)
总结:
名词解释:
SYN表示建立连接, FIN表示关闭连接, ACK表示响应, PSH表示有 DATA数据传输, RST表示连接重置。
本机 | 服务器 | |
1 | 发送空数据[SYN] 主机A发送位码为syn=1,随机产生seq number=0的数据包到服务器,主机B由SYN=1知道,A要求建立联机 Seq=0 Win=64240 Len=0 MSS=1460 WS=8 SACK_PERM=1 TSV=542732994 TSER=0
| |
2 | 服务器回复空内容[SYN,ACK] 主机B收到请求后要确认联机信息,向A发送ack number=(主机A的seq+1),syn=1,ack=1,随机产生seq=0的包; [SYN, ACK] Seq=0 Ack=1 Win=8192 Len=0 MSS=1460 WS=8 SACK_PERM=1 TSV=67540739 TSER=542732994
| |
3 | 发送空数据[ACK] 主机A收到后检查ack number是否正确,即第一次发送的seq number+1,以及位码ack是否为1,若正确,主机A会再发送ack number=(主机B的seq+1),ack=1,主机B收到后确认seq值与ack=1则连接建立成功。 [ACK] Seq=1 Ack=1 Win=66560 Len=0 TSV=542732995 TSER=67540739
| |
4 | 发送数据[PSH,ACK]
| |
5 | 服务器响应对应的数据 ,由于数据量大需要分两个包发送[ACK] | |
6 | 服务器响应对应的数据[PSH,ACK] | |
7 | 发送空数据[ACK] | |
8 | 发送空数据[FIN] | |
9 | 服务器回复空内容[ACK] | |
10 | 服务器回复空内容[FIN] | |
11 | 发送空数据[ACK] |
从上看出:
根据结果完全附件符合HTTP的3次握手4次挥手.在接受数据完成的时候发生一个ack,告诉服务接收完成
同时也知道使用java URL发送请求的要记得关闭连接诶才算是完整。(其实不关闭应该也没啥)
SYN:同步序列编号(Synchronize Sequence Numbers)。是TCP/IP建立连接时使用的握手信号。在客户机和服务器之间建立正常的TCP网络连接时,客户机首先发出一个SYN消息,服务器使用SYN+ACK应答表示接收到了这个消息,最后客户机再以ACK消息响应。这样在客户机和服务器之间才能建立起可靠的TCP连接,数据才可以在客户机和服务器之间传递。
在TCP/IP协议中,如果接收方成功的接收到数据,那么会回复一个ACK数据。通常ACK信号有自己固定的格式,长度大小,由接收方回复给发送方。
PSH是TCP报头中的一个标志位,发送方在发送数据的时候可以设置这个标志位.当两个应用程序进行交互式的通信时,有时在一端的应用进程希望在键入一个命令后立即就能够收到对方的响应.在这种情况下,TCP可以使用推送(push)操作.这时,发送端TCP将推送比特PSH置为1,并立即创建一个报文段发送出去.接收TCP收到推送比特置1的报文段,就尽快地(即"推送向前")交付给接收应用进程,而不再等到整个缓冲都填满了再向上交互.PSH比特也叫急迫比特.
第一次握手发送的数据,从内容看是使用MAC地址,猜想这里拦截到的数据是数据的报文吧,报头这些东西没有显示出来。没有在深入研究了。