网络编程入门

2023-10-28

网络编程

网络介绍
	网络设备
	互联网是什么
IP
端口
传输控制协议
	TCP
	UDP
URL
单工
半双工
全双工
综合练习即时聊天系统

网络简介

网络设备

要组成一个局域网,必须要有路由器,每一个连接到路由器上的设备必须有网卡,每一个网卡都会有一个mac地址(物理地址),mac地址是唯一的。

在局域网下,所有的数据传输,都会通过路由器去中转,这样通过路由器组成一个局域网,那么路由器和路由器之间再进行互联,就可以形成一个超大的互联网了。

互联网是什么

互联网就是一个超大的局域网

IP

IP是Internet Protocol(网际互连协议)的缩写,是TCP/IP体系中的网络层协议。设计IP的目的是提高网络的可扩展性:一是解决互联网问题,实现大规模、异构网络的互联互通;二是分割顶层网络应用和底层网络技术之间的耦合关系,以利于两者的独立发展。根据端到端的设计原则,IP只为主机提供一种无连接、不可靠的、尽力而为的数据包传输服务。

IPV4

IPV4的长度是32位,理论上有2^32-1这么多个。格式是有三个点,把ip分成了4个部分,每一个部分的值是0-255;比如:xxx.xxx .xxx.xxx

IP是用来识别网络上的地址使用的,由两部分组成:网络地址和主机地址

ipv4分为了5类

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RcfRZfh0-1681793689891)(网络编程.assets/a.png)]

IPV4因为快要耗尽的原因,开发了IPV6

IPV6

ipv6的长度是128位,可以解决IPV4耗尽的问题

特殊IP

回路IP:127.0.0.1 127开头后面除了全0或者全1都称为回路IP

0.0.0.0 也可以代表本机

255.255.255.0

端口

端口的长度是16位,端口可以理解为进入计算机的门,理论上来说端口有2^16个,取值范围是0-65535,每一个端口只能被一个程序占用,一个程序可以占用多个端口,端口打开的越少越安全。

netstat -ano 可以查看所有的端口监听情况

netstat -ano | findstr 3306 可以查看指定端口的情况

上述的两个命令都可以查看到对应的pid,也就可以结合任务管理器,去关闭对应的程序,释放对应监听的端口

固定端口

80 http协议的缺省端口

443 https协议的缺省端口 相比http加密更安全

21 ftp协议的确认端口

3306 mysql的默认端口

25 smtp 邮件发送服务器占用的端口

110 pop3 邮件接收服务器占用的端口

一般来说,自己的程序需要占用端口的时候,尽可能使用的端口往后一些,避免这个端口被占用

传输控制协议

tcp协议

当使用tcp协议的时候,如果A给B发送消息,B收到消息后会给出反馈,A可以知道对方接收到没有,协议更加可靠

七层理论模型

OSI七层模型

7 应用层  提供应用程序之间的通信
6 表示层  处理数据格式,是应用层和网络层之间的翻译官
5 会话层  建立、维护和管理会话
4 传输层  端到端之间的连接
3 网络层  寻址和路由选择,主要功能就是将网络地址翻译成对应的物理地址,并决定如何将数据从发送方路由到接收方
2 数据链路层  介质访问,链路管理,主要功能就是如何在不可靠的物理线路上进行可靠的数据传递
1 物理层  比特流传输

四层模型

应用层
传输层
网络层
数据链路层

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5tIrw5zv-1681793689892)(网络编程.assets/wps1.png)]

三次握手

建立连接需要三次握手,才可以保证这个连接是可靠的

假设A 给B 发消息

  1. A给B发一个消息 B收到了 B知道A可以发消息,B可以收消息
  2. B 给A 回一个消息 A收到了 A知道B可以发送和接收消息 A知道自己可以发送和接口
  3. A 给B回一个消息 B收到消息 B知道B可以发送消息

这样的连接建立起来才是可靠的

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xpEsJwyo-1681793689892)(网络编程.assets/9d82d158ccbf6c819624f31141341c3332fa40cd.jpeg)]

第一次

第一次握手:建立连接时,客户端发送syn包(seq=j)到服务器,并进入SYN_SENT状态,等待服务器确认;SYN:同步序列编号(Synchronize Sequence Numbers)。

第二次

第二次握手:服务器收到syn包,必须确认客户端的SYN(ack=j+1),同时自己也发送一个SYN包(seq=k),即SYN+ACK包,此时服务器进入SYN_RECV状态。 [3]

第三次

第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED(TCP连接成功)状态,完成三次握手。

完成三次握手,客户端与服务器开始传送数据,在上述过程中,还有一些重要的概念:

(1)未连接队列

三次握手协议中,服务器维护一个未连接队列,该队列为每个客户端的SYN包(seq=j)开设一个条目,该条目表明服务器已收到SYN包,并向客户发出确认,正在等待客户的确认包。这些条目所标识的连接在服务器处于 Syn_RECV状态,当服务器收到客户的确认包时,删除该条目,服务器进入ESTABLISHED状态。 [3]

(2)Backlog参数

三次握手协议

表示内核为相应套接字排队的最大连接个数。SYN-ACK重传次数服务器发送完SYN-ACK包,如果未收到客户确认包,服务器进行首次重传,等待一段时间仍未收到客户确认包,进行第二次重传,如果重传次数超过系统规定的最大重传次数,系统将该连接信息从半连接队列中删除。注意,每次重传等待的时间不一定相同。 [3]

(3)半连接存活时间

是指半连接队列的条目存活的最长时间,也即服务器从收到SYN包到确认这个报文无效的最长时间,该时间值是所有重传请求包的最长等待时间总和。有时我们也称半连接存活时间为Timeout时间、SYN_RECV存活时间。

四次挥手

断开连接的时候,需要经过四次挥手

  1. A 给B 发送消息需要断开连接
  2. B 给A 回消息 等一等
  3. B 给A 回消息 处理的工作已完成可以断开
  4. A 给B 回收到 断开连接

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fz2bSQDl-1681793689893)(网络编程.assets/d000baa1cd11728bf839be44c8fcc3cec3fd2cbb.png)]

对于一个已经建立的连接,TCP使用改进的四次挥手来释放连接(使用一个带有FIN附加标记的报文段)。TCP关闭连接的步骤如下:

第一步,当主机A的应用程序通知TCP数据已经发送完毕时,TCP向主机B发送一个带有FIN附加标记的报文段(FIN表示英文finish)。 [4]

第二步,主机B收到这个FIN报文段之后,并不立即用FIN报文段回复主机A,而是先向主机A发送一个确认序号ACK,同时通知自己相应的应用程序:对方要求关闭连接(先发送ACK的目的是为了防止在这段时间内,对方重传FIN报文段)。 [4]

第三步,主机B的应用程序告诉TCP:我要彻底的关闭连接,TCP向主机A送一个FIN报文段。 [4]

第四步,主机A收到这个FIN报文段后,向主机B发送一个ACK表示连接彻底释放。

为什么建立连接是三次握手,断开连接是四次挥手

答:因为当Server端收到Client端的SYN连接请求报文后,可以直接发送SYN+ACK报文。其中ACK报文是用来应答的,SYN报文是用来同步的。但是关闭连接时,当Server端收到FIN报文时,很可能并不会立即关闭SOCKET,所以只能先回复一个ACK报文,告诉Client端,“你发的FIN报文我收到了”。只有等到我Server端所有的报文都发送完了,我才能发送FIN报文,因此不能一起发送。故需要四步挥手。

udp协议

当使用udp协议的时候,如果A给B发送消息,B不会给出反馈,A不知道对方接收到没有,协议更快

URL

统一资源定位符

一个正确的url应该包含四个 部分

https://www.baidu.com:443/index.html
https://www.baidu.com
https 协议
www.baidu.com 主机
443 端口
index.html 资源位置

当输入一个URL在浏览器后,点击回车到页面完整显示,中间经历了什么?

当点击回车以后,首先确认传输协议,然后开始解析域名,首先在hosts文件中解析域名,如果解析成功则得到ip,直接去访问,如果没有解析成功则去dns服务器上解析域名,这里一般都能够解析成功,如果没有解析成功则提示无法访问。解析成功后通过路由器转发找到目标服务器,通过指定的端口进入目标服务器找到对应的资源,然后响应给浏览器显示出来。如果没有找到对应的资源则提示404。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-oTg6Xya8-1681793689893)(网络编程.assets/image-20220307144754173.png)]

套接字(socket)

在java中实现网络编程主要通过socket来完成,前面所讲的所有内容,java都封装好了,我们只需要直接使用即可

单工

数据传输时单向的,不能逆向传输。比如:BB机,打印机

package com.zlt.socket20220307.simplex;

import java.io.IOException;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.Socket;

public class Client {

    public static void main(String[] args) {
        try {
            //对象创建后会自动去连接服务器
            Socket socket = new Socket("127.0.0.1",10000);
            //客户端连接服务器成功
            OutputStream outputStream = socket.getOutputStream();//客户端发送数据到服务器去就是输出
            OutputStreamWriter oow = new OutputStreamWriter(outputStream,"UTF-8");
            oow.write("你好服务器\n");//将数据发送出去
            oow.flush();//刷新流
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
package com.zlt.socket20220307.simplex;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;

public class Server {
    public static void main(String[] args) {
        ServerSocket serverSocket = null;
        try {
            serverSocket = new ServerSocket(10000);//创建一个服务器,监听9999端口
            //阻塞线程等待客户端的连接
            Socket accept = serverSocket.accept();//监听9999端口
            System.out.println("客户端连接成功");
            InputStream inputStream = accept.getInputStream();
            InputStreamReader isr = new InputStreamReader(inputStream,"UTF-8");
            BufferedReader br = new BufferedReader(isr);
            String s = br.readLine();
            System.out.println("客户端对服务器说:" + s);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

半双工

双向发送数据,但是不能同时进行,比如:对讲机

package com.zlt.socket20220307.halfduplex;

import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;

public class Server {
    public static void main(String[] args) {
        ServerSocket serverSocket = null;
        try {
            serverSocket = new ServerSocket(10000);//创建一个服务器,监听9999端口
            //阻塞线程等待客户端的连接
            Socket accept = serverSocket.accept();//监听9999端口
            System.out.println("客户端连接成功");
            while(true){
                //收消息
                InputStream inputStream = accept.getInputStream();
                InputStreamReader isr = new InputStreamReader(inputStream,"UTF-8");
                BufferedReader br = new BufferedReader(isr);
                String s = br.readLine();
                System.out.println("客户端对服务器说:" + s);
                //回消息
                OutputStream outputStream = accept.getOutputStream();//客户端发送数据到服务器去就是输出
                OutputStreamWriter oow = new OutputStreamWriter(outputStream,"UTF-8");
                Scanner scanner = new Scanner(System.in);
                System.out.println("请输入要对客户端说的内容");
                oow.write(scanner.nextLine() + "\n");//将数据发送出去
                oow.flush();//刷新流
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
package com.zlt.socket20220307.halfduplex;

import java.io.*;
import java.net.Socket;
import java.util.Scanner;

public class Client {
    public static void main(String[] args) {
        try {
            //对象创建后会自动去连接服务器
            Socket socket = new Socket("127.0.0.1",10000);
           while(true){
               //客户端连接服务器成功
               OutputStream outputStream = socket.getOutputStream();//客户端发送数据到服务器去就是输出
               OutputStreamWriter oow = new OutputStreamWriter(outputStream,"UTF-8");
               System.out.println("请输入要对服务器说的内容");
               oow.write(new Scanner(System.in).nextLine() + "\n");//将数据发送出去
               oow.flush();//刷新流
               //收消息
               //收消息
               InputStream inputStream = socket.getInputStream();
               InputStreamReader isr = new InputStreamReader(inputStream,"UTF-8");
               BufferedReader br = new BufferedReader(isr);
               String s = br.readLine();
               System.out.println("服务器对客户端说:" + s);
           }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

全双工

有两个通道,发送和接收数据互不影响,可以同时进行 比如:QQ

package com.zlt.socket20220307.fulldeplex;

import java.io.*;
import java.net.Socket;
import java.util.Scanner;

public class Client {
    public static void main(String[] args) {
        try {
            //对象创建后会自动去连接服务器
            Socket socket = new Socket("127.0.0.1",10000);
            Thread thread = new Thread(){
                @Override
                public void run() {
                    super.run();
                    while (true){
                        //收消息
                        //收消息
                        InputStream inputStream = null;
                        try {
                            inputStream = socket.getInputStream();
                            InputStreamReader isr = new InputStreamReader(inputStream,"UTF-8");
                            BufferedReader br = new BufferedReader(isr);
                            String s = br.readLine();
                            System.out.println("服务器对客户端说:" + s);
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                    }
                }
            };
            thread.start();
           while(true){
               //客户端连接服务器成功
               OutputStream outputStream = socket.getOutputStream();//客户端发送数据到服务器去就是输出
               OutputStreamWriter oow = new OutputStreamWriter(outputStream,"UTF-8");
               System.out.println("请输入要对服务器说的内容");
               oow.write(new Scanner(System.in).nextLine() + "\n");//将数据发送出去
               oow.flush();//刷新流
           }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
package com.zlt.socket20220307.fulldeplex;

import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;

public class Server {
    public static void main(String[] args) {
        ServerSocket serverSocket = null;
        try {
            serverSocket = new ServerSocket(10000);//创建一个服务器,监听9999端口
            //阻塞线程等待客户端的连接
            Socket accept = serverSocket.accept();//监听9999端口
            System.out.println("客户端连接成功");
            Thread thread = new Thread(){
                @Override
                public void run() {
                    super.run();
                    while (true){
                        //收消息
                        //收消息
                        InputStream inputStream = null;
                        try {
                            inputStream = accept.getInputStream();
                            InputStreamReader isr = new InputStreamReader(inputStream,"UTF-8");
                            BufferedReader br = new BufferedReader(isr);
                            String s = br.readLine();
                            System.out.println("客户端对服务器说:" + s);
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                    }
                }
            };
            thread.start();
            while(true){
                //回消息
                OutputStream outputStream = accept.getOutputStream();//客户端发送数据到服务器去就是输出
                OutputStreamWriter oow = new OutputStreamWriter(outputStream,"UTF-8");
                Scanner scanner = new Scanner(System.in);
                System.out.println("请输入要对客户端说的内容");
                oow.write(scanner.nextLine() + "\n");//将数据发送出去
                oow.flush();//刷新流
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

网络编程入门 的相关文章

  • 6类典型场景的无线AP选型和部署方案

    你们好 我的网工朋友 前段时间刚给你们来了篇解决无线频繁断网的技术文 解决无线频繁断网 这个办法值得收藏 不少朋友私聊 说想再聊聊无线AP的选型和部署方案 这不就安排上了 无线网络覆盖项目中 无线AP的合理选型和部署非常重要 在设计施工中
  • 浅谈能耗系统在马来西亚连锁餐饮业的应用

    1 背景信息 Background 针对连锁餐饮业能耗高且能源管理不合理的问题 利用计算机网络技术 通讯技术 计量控制技术等信息化技术 实现能源资源分类分项计量和能源资源运行监管功能 清晰描述各分店总的用能现状 实时监测各供电回路的电压 电
  • 【镜像压缩】linux 上 SD/TF 卡镜像文件压缩到实际大小的简单方法(树莓派、nvidia jetson)

    文章目录 1 备份 SD TF 卡为镜像文件 2 压缩镜像文件 2 1 多分区镜像文件的压缩 树莓派 普通 linux 系统等 2 2 单分区镜像文件的压缩 Nvidia Jetson Nano 等 3 还原镜像文件到 SD TF 卡
  • Linux 软件安装以及管理

    本篇主要记录常用的软件安装和管理方式 主要是 yum rpm dnf apt pip 大致都是一样的 主要是部分软件提供了解决依赖的功能 内容不包括源码安装 源码安装情况相对比较复杂 后续有时间再补充 约定 案例所用模板软件均为 pytho
  • 服务器集群是如何提高计算性能的?

    服务器集群是一种将多台服务器连接起来协同工作的技术 通过集群配置 可以提高计算性能 可靠性和可扩展性 以下是服务器集群如何提高计算性能的详细解释 一 并行处理能力 服务器集群的核心优势在于其并行处理能力 通过将多个服务器组成一个集群 可以将
  • 基于成本和服务质量考虑的不确定性下,电动汽车充电网络基础设施需求预测和迭代优化的分层框架研究(Python代码实现)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 2 运行结果 3 参考文献 4 Python代码 数据
  • Jenkins流水线怎么做?

    问CHAT Jenkins流水线怎么做 CHAT回复 Jenkins流水线是一种创建 测试和部署应用程序的方法 以下是为Jenkins创建流水线的步骤 1 安装Jenkins 首先你需要在你的服务器上安装Jenkins 这个过程可能会根据你
  • WEB前端常见受攻击方式及解决办法总结

    一个网址建立后 如果不注意安全问题 就很容易被人攻击 下面讨论一下集中漏洞情况和放置攻击的方法 一 SQL注入 所谓的SQL注入 就是通过把SQL命令插入到web表单提交或输入域名或页面请求的查询字符串 最终达到欺骗服务器执行恶意的SQL命
  • Python自动化操作:简单、有趣、高效!解放你的工作流程!

    今天跟大家分享一套自动化操作流程解决方案 基于 Python语言 涉及 pyautogui pyperclip pythoncom win32com 依赖包 安装命令为 pip install pyautogui pip install p
  • Jenkins 插件下载速度慢、安装失败了!我教你怎么解决!

    Jenkins部署完毕 如果不安装插件的话 那它就是一个光杆司令 啥事也做不了 所以首先要登陆管理员账号然后点击系统管理再点击右边的插件管理安装CI CD必要插件 但是问题来了 jenkins下载插件速度非常慢 而且经常提示下载插件失败 真
  • 2024年金三银四网络安全考试试题

    2023年金三银四网络安全考试试题 1 关于数据使用说法错误的是 A 在知识分享 案例中如涉及客户网络数据 应取敏感化 不得直接使用 B 在公开场合 公共媒体等谈论 传播或发布客户网络中的数据 需获得客户书面授权或取敏感化 公开渠道获得的除
  • 【网安神器篇】——WPScan漏洞扫描工具

    目录 一 Wordpress简介 二 WPScan介绍 三 安装 四 获取token 1 注册账号 2 拿到token 五 使用教程 1 常用选项 2 组合命令 1 模糊扫描 2 指定扫描用户 3 插件漏洞扫描 4 主题漏洞扫描 5 Tim
  • tcpdump抓包

    tcpdump抓包 基本概念 1 类型的关键字 host 指明一台主机 如 host 10 1 110 110 net 指明一个网络地址 如 net 10 1 0 0 port 指明端口号 如 port 8090 2 确定方向的关键字 sr
  • Kubernetes (十二) 存储——Volumes配置管理

    一 卷的概念 官方地址 卷 Kubernetes https v1 24 docs kubernetes io zh cn docs concepts storage volumes 二 卷的类型及使用 emptyDir卷 1 创建编辑文件
  • 国外拨号VPS指南:开启你的全球网络之旅

    在当今数字化时代 互联网已经成为了我们生活的一部分 而要在全球范围内畅通无阻地访问互联网 拥有一个可靠的国外拨号VPS是非常重要的 无论您是为了工作 学习还是娱乐 国外拨号VPS都可以为您提供更广泛的网络体验 本文将为您提供国外拨号VPS的
  • 服务器VPS是什么意思?一文了解其含义与重要性

    在今天的数字时代 服务器扮演着至关重要的角色 它们是网站 应用程序和在线业务的基石 但是 你是否听说过VPS 本文将深入探讨什么是服务器VPS 以及为什么它在今天的互联网世界中如此重要 什么是服务器VPS 服务器的基本概念 在我们深入探讨V
  • UI自动化测试之Jenkins配置

    背景 团队下半年的目标之一是实现自动化测试 这里要吐槽一下 之前开发的测试平台了 最初的目的是用来做接口自动化测试和性能测试 但由于各种原因 接口自动化测试那部分功能整个废弃掉了 其中和易用性有很大关系 另外 也和我们公司的接口业务也有关
  • 为什么我强烈推荐大学生打CTF!

    前言 写这个文章是因为我很多粉丝都是学生 经常有人问 感觉大一第一个学期忙忙碌碌的过去了 啥都会一点 但是自己很难系统的学习到整个知识体系 很迷茫 想知道要如何高效学习 这篇文章我主要就围绕两点 减少那些罗里吧嗦的废话 直接上干货 CTF如
  • DSCA190V 57310001-PK

    DSCA190V 57310001 PK DSCA190V 57310001 PK 具有两个可编程继电器功能 并安装在坚固的 XP 外壳中 DSCA190V 57310001 PK 即可使用 只需最少的最终用户校准 DSCA190V 573
  • 【安全】网络安全态势感知

    文章目录 一 态势感知简介 1 概念 2 形象举例 3 应具备的能力 二 为什么要态势感知 为什么网络安全态势感知很重要 三 态势感知系统的功能 四 如何评估态势感知的建设结果 五 什么是态势感知的三个层级 四 业界的态势感知产品 1 安全

随机推荐