admin 管理员组

文章数量: 1087649

网络的七层模型

网络的七层模型:

主机A主机B各层的解释
应用层<—— 应用层协议  ——>应用层提供应用程序间通信
表示层<—— 表示层协议 ——>表示层处理数据格式、数据加密等
会话层<—— 会话层协议 ——>会话层

建立、维护和管理会话

       传输层        <—— 传输层协议 ——>       传输层        建立端到端连接
网络层<—— 网络层协议 ——>网络层寻址和路由选择
 数据链路层        <—— 数据链路层协议 ——>数据链路层        介质访问、链路连接
物理层<—— 物理层协议 ——>物理层比特流传输

TCP和UDP的区别

维度TCPUDP
可靠性可靠不可靠
速度稍慢更快
通信方式点对点点对点、一对多、多对多
通信内容字节码数据报
应用场景传输文件聊天、视频、语音

三次握手和四次挥手

  三次握手:        

                        第一次握手:客户端发送网络包,服务端收到了。这样服务端就能得出结论:客户端的发送能力、服务端的接收能力是正常的。
                        第二次握手:服务端发包,客户端收到了。
这样客户端就能得出结论:服务端的接收、发送能力,客户端的接收、发送能力是正常的。不过此时服务器并不能确认客户端的接收能力是否正常。
                        第三次握手:客户端发包,服务端收到了。
这样服务端就能得出结论:客户端的接收、发送能力正常,服务器自己的发送、接收能力也正常。

        

        四次挥手:

                        第一次挥手:因为当服务端收到客户端的SYN连接请求报文后,可以直接发送SYN+ACK报文。

                        第二次挥手:因为其中ACK报文是用来应答的,SYN报文是用来同步的。

                        第三次挥手:关闭连接时,当服务端收到FIN报文时,很可能并不会立即关闭SOCKET,所以只能先回复一个ACK报文,告诉客户端,“你发的FIN报文我收到了”。

                        第四次挥手:只有等到我服务端所有的报文都发送完了,我才能发送FIN报文,因此不能一起发送。所以需要四次挥手。

Socket编程

   

    服务端:(ServerSocker类,用于对本机的某个端口进行侦听 )                        

                1.创建               ServerSocket(int port) port是端口号

                2.方法               close() 关闭                   

                                         Socket accept() 接收客户端的Socket,会阻塞线程直到有客户端连接。

        客户端:(Socket类,代表客户端向服务端发送连接,进行网络通知            注意:IO流关闭后,socket会自动关闭 )

                1.创建                Socket(String ip,int port) 通过ip和端口连接服务端

                2.方法                disconnect() 关闭

                                          OutputStream getOutputStream() 获得输出流

                                          InputStream getInputStream() 获得输入流

/*** 服务端*/
public class Server {public static final int PORT = 9999;public void start() {System.out.println("服务器启动了!");//创建服务端Sockettry(ServerSocket serverSocket = new ServerSocket(PORT)){//接收客户端连接while(true) {Socket socket = serverSocket.accept();System.out.println("客户端连接了!" + socket.getInetAddress());//获得输入流,得到客户端发送的消息ObjectInputStream in = new ObjectInputStream(socket.getInputStream());String str = in.readUTF();System.out.println("接收消息:" + str);//获得输出流ObjectOutputStream out = new ObjectOutputStream(socket.getOutputStream());out.writeUTF("服务器给你问好了!!");out.flush();}} catch (IOException e) {e.printStackTrace();}}public static void main(String[] args) {new Server().start();}
}
/*** 客户端*/
public class Client {/*** 发送消息*/public void send(String ip,int port,String msg){//创建连接try(Socket socket = new Socket(ip,port)){//获得输出流ObjectOutputStream out = new ObjectOutputStream(socket.getOutputStream());out.writeUTF(msg);out.flush();//获得输入流ObjectInputStream in = new ObjectInputStream(socket.getInputStream());String s = in.readUTF();System.out.println("服务器回应:" + s);} catch (UnknownHostException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}public static void main(String[] args) {new Client().send("192.168.1.113",9999,"Hello,今天学点什么??");}
}

 UDP 编程(数据报协议,类似广播,属于不可靠的协议,无连接 )

服务端

DatagramSocket(int port) 指定端口获得发送的数据报

客户端

DatagramSocket() 作为客户端使用

主要方法

receive(DatagramPacket) 接收数据包

send(DatagramPacket) 发送数据报

DatagramPacket 包

DatagramPacket(String ip,int port) 发送前指定ip和端口

public class UDPServer {public static final int PORT = 8888;public void start(){System.out.println("启动服务");//创建UDP服务端try {DatagramSocket server = new DatagramSocket(PORT);//接收数据报while(true) {byte[] buff = new byte[1024];DatagramPacket packet = new DatagramPacket(buff,0,buff.length);//将接收的数据放入数据报server.receive(packet);String msg = new String(packet.getData(),0,packet.getLength(),"UTF-8");System.out.println("接收到:" + msg);}} catch (SocketException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}public static void main(String[] args) {new UDPServer().start();}}public class UDPClient {public void send(String ip,int port,String msg){//创建客户端try {DatagramSocket client = new DatagramSocket();//创建数据报byte[] buff = msg.getBytes();DatagramPacket packet = new DatagramPacket(buff,0,buff.length, InetAddress.getByName(ip),port);//发送数据报client.send(packet);} catch (SocketException | UnknownHostException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}public static void main(String[] args) {new UDPClient().send("127.0.0.1",8888,"Hello UDP!!");}
}

本文标签: 网络的七层模型