网络通讯 数据传输 TCP/IP模型 TCP协议 PORT IP
网络通讯 数据传输 TCP/IP模型 PORT IP
网络编程:把分布在不同地理区域的计算机与专门的外部设备用通信线路互连成一个规模大、功能强的网络系统,从而使众多的计算机可以方便地互相传递信息、共享硬件、软件、数据信息等资源。设备之间在网络中进行数据的传输,发送/接收数据。
IP PORT
我们访问网站使用的域名实际上也是IP,域名--DNS解析-->IP
TCP/IP 四层模型:
虽然OSI只是个名义上的标准,虽然我们实际过程中都没有按OSI分为七层,但对我们了解TCP/IP有着指导性的意义。
OSI参考模型 | 对应TCP/IP | 相关协议 | 作用 |
应用层 | 应用层 | DNS HTTP | 为用户的应用提供服务并支持网络访问。 |
表示层 | 负责管理网络中设备之间的通信,解决不同系统之间的通讯问题,提供传输层不具备的连接相关功能。 | ||
会话层 | 自动分包,自动寻址。负责转化数据格式,并处理数据加密和数据压缩。 | ||
传输层 | 传输层 | TCP UDP | 提供应用程序接口,为网络应用程序提供网络访问的途径; |
网络层 | 网络层 | IP IMCP | 传输过程中选择最优路径。实现数据包的选路和转发。解决数据由一个设备的IP如何路由到目标设备的过程规范 |
数据链路层 | 网路接口层 | ARP DARP | 确保数据传输正确。对发送的数据添加错误检查信息、对接收的数据进行数据检验。 |
物理层 | IEEE802.1 | 根据合适的方式调整数据传输,把数据转化为电子流或脉冲的形式在传输介质上传输。 |
不同设备间的数据传输,表面上看是应用层之间通信,实际上需要传输多层,实现数据的封装,拆分
TCP协议
连接是可靠的,三次握手,四次挥手
sequenceDiagram
participant A as 客户端
participant B as 服务器
par
note right of A:建立连接:三次握手
A->>B: 客户端发送请求
activate B
B-->>A: 服务器发回确认包应答
A->>B: 客户端再次发送确认包
deactivate B
end
par
note right of A:释放连接:四次挥手
A->>B: 发送连接释放报文,<br>并停止再发送数据
activate B
B-->>A: 服务器收到连接释放报文段后<br>即发出确认报文段
activate A
B-->>A: 服务器在数据传输完毕后<br>发出连接释放报文段,等待最后确认
deactivate A
A->>B: 收到服务器的连接释放报文段后,<br>对此发出确认报文段
deactivate B
end
UDP协议:不可靠的,数据传输过程中分包传输,容易出现丢包问题
IP PORT
MAC地址
网络适配器地址,能区分我们计算机的唯一的标识,由厂商生产时候就规定了一个复杂的英文串组成。
IP地址
互联网协议地址,在网络中快速路由到目标计算机需要有一套逻辑运算的规则,但MAC地址是一段复杂的字串组成不利于进行逻辑运算,故而而使用ARP协议把MAC地址转换为可以用于逻辑运算的数字IP地址。
域名
一组IP地址数字很不容易记忆,因此为网上的服务器取一个有意义又容易记忆的名字,这个名字的地址就是域名地址(Domain Name Server)。为了让用户更方便记忆所以衍生了DNS的服务,DNS完成了把IP地址转为简单容易记忆的域名地址。当用户输入域名后,浏览器必须要先去一台有域名和IP地址相互对应的数据库的主机中去查询这台计算机的IP地址,这台被查询的主机叫域名服务器(Domain Name Server,DNS)。
InetAddress
封装IP
public class Test {
public static void main(String[] args) throws UnknownHostException {
//不能直接new InetAddress();创建对象,因为InetAddress()被default修饰了。
InetAddress ia = InetAddress.getByName("192.168.253.3");
System.out.println(ia); // /192.168.253.3
InetAddress ia2 = InetAddress.getByName("localhost");//localhost指代的是本机的ip地址
System.out.println(ia2); // localhost/127.0.0.1
InetAddress ia3 = InetAddress.getByName("127.0.0.1");//127.0.0.1指代的是本机的ip地址
System.out.println(ia3); // /127.0.0.1
InetAddress ia4 = InetAddress.getByName("LAPTOP-VUQ1HT6K");//封装计算机名
System.out.println(ia4); // LAPTOP-VUQ1HT6K/192.168.172.135
InetAddress ia5 = InetAddress.getByName("www.bilibili.com");//封装域名
System.out.println(ia5); // www.bilibili.com/117.148.143.200
System.out.println(ia5.getHostName());// www.bilibili.com 获取域名
System.out.println(ia5.getHostAddress());// 117.148.143.200 获取ip地址
}
}
InetSocketAddress
封装IP+PORT
public class Test2 {
public static void main(String[] args) {
InetSocketAddress isa = new InetSocketAddress("localhost",8888);
System.out.println(isa); //localhost/127.0.0.1:8888
System.out.println(isa.getHostName()); //localhost 截取IP
System.out.println(isa.getPort()); //8888 截取PORT
InetAddress ia = isa.getAddress(); // IP封装为InetAddress对象
System.out.println(ia.getHostName()); // localhost
System.out.println(ia.getHostAddress()); // 127.0.0.1
}
}
(); // IP封装为InetAddress对象
System.out.println(ia.getHostName()); // localhost
System.out.println(ia.getHostAddress()); // 127.0.0.1
}
}