引言:端口探测利用的是TCP的三次握手特性去检测端口的开放与否
1. 本文缘由
计算机网络的课程即将来到尾声,本文根据课程所学的内容,利用TCP的三次握手特性编写简易端口扫描工具。
2.使用软件
3.原理分析及代码
端口扫描的原理,即采用的是TCP的三次握手的特性,当某个端口未开放或隐藏时,客户端向服务器端发出的请求不会得到回应,多次尝试失败后可认定该端口未开放或已经隐藏。以下分析以80端口为例:

当80端口开放时,向服务器发送请求时便能得到服务器的回应,进行三次握手

而当客户端向其他端口发送请求时并未得到回应,因此跳过请求,从而证实端口未开放
本简易端口扫描器采用Java + JavaFX编写,带UI:
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 
 | package application;
 import java.io.IOException;
 import java.net.InetSocketAddress;
 import java.net.Socket;
 import java.net.UnknownHostException;
 import javafx.fxml.FXML;
 import javafx.scene.control.Button;
 import javafx.scene.control.TextField;
 import javafx.scene.control.TextArea;
 public class ViewController {
 @FXML
 private TextArea text;
 @FXML
 private TextField ip;
 @FXML
 private TextField start;
 @FXML
 private TextField stop;
 @FXML
 private Button btn_start;
 private int startport;
 private int stopport;
 private String ipaddress;
 Socket socket;
 public void strat() {
 startport = Integer.parseInt(start.getText());
 stopport = Integer.parseInt(stop.getText());
 ipaddress = ip.getText();
 new Thread() {
 public void run() {
 text.appendText("开始扫描端口,请稍等...\n");
 long starttime = System.currentTimeMillis();
 for(int i= startport;i <= stopport;i++) {
 try {
 socket = new Socket();
 socket.connect(new InetSocketAddress(ipaddress,i), 80);
 text.appendText("扫描到的端口:"+ i + "\n");
 socket.close();
 }catch (UnknownHostException e) {
 } catch (IOException e) {
 }
 }
 long endtime = System.currentTimeMillis();
 text.appendText("耗时:"+ (endtime-starttime)+"\n");
 }
 }.start();
 }
 }
 
 
 | 

该扫描器包含IP地址输入框,扫描开始端口和终止端口的输入框以及端口扫描器抓取的信息
4. 运行过程与结果
确认扫描对象:
本次设定的扫描目标为学校的教务系统,首先通过系统ping:es.bnuz.edu.cn获得目标域名的ip地址。

根据ping到的结果可知,学校教务网站的IP地址并对其进行端口扫描
为了节省时间,本次端口扫描将扫描0-400端口。

由结果可以得出0-400端口中教务系统开放了80网页端口和211未知端口。
5.总结
本文仅提供了扫描端口的思路,但仅仅只是简易的端口扫描器,缺陷还有很多,比如:

代码中超时时间设定为80ms,而对于大部分网站而言这是不合理的,部分网站未开启DCDN之类的分布式缓存,访问时间可能会超过100ms,国外网站的访问更是需要300ms左右,因此需要改进。并且未开启多线程同时搜索端口,当搜索端口的范围扩大时候很容易出现“假死“现象,虽然后台有在运作然而界面并未显现。
 2019/11/24