• 层4 传输层


    1.传输层协议和应用层协议之间的关系

    说明:常用的应用层协议使用的端口有http=TCP+80https=TCP+443RDP=TCP+3389ftp=TCP+21、共享文件夹=TCP+445SMTP=TCP+25PoP3=TCP+110telnet=TCP+23DNS=UDP+53。这里相关的服务与应用层协议之间的关系是一个侦听的关系。当数据被发送到接收端的时候,接收端相应启动的服务会进行侦听。服务使用TCPUDP的端口侦听客户的请求,客户端使用IP地址定位服务器,使用目标端口定位服务,可以在服务器网卡上设置只开放必要的端口,实现服务器的网络安全。一些命令:
    • 查看服务侦听的端口netstat -anb
    • 产看建立的会话netstat -n
    • 查看建立会话的进程netstat -nb
    • 测试连接远程计算机某个端口是否打开telnet 192.168.80.100 3389

    2 传输层功能

    为相互通信的应用进程提供了逻辑通信

    说明:传输层为应用进程之间提供端到端的逻辑通信(但网络层是为主机之间提供逻辑通信),还要对收到的报文进行差错检测,提供面向连接和无连接的服务。

    3 传输层的端口

    说明:

    TCP的端口:使用一个16位端口号进行标志,具有本地意义,即端口号只是为了标志本计算机应用层中的各进程。在Internet中不同计算机的相同端口号是没有联系的。

    3.传输层协议TCP

     3.1.使用:

    socket通信:我们可以将socket理解为服务端和客户端之间的一条通道

     1 客户端:
     2 //必须先启动服务器后连接
     3 public class MyClient {
     4     public static void main(String[] args) throws UnknownHostException, IOException {
     5         //1、创建客户端,必须指定服务器+端口,此时就在连接,如果不启动服务器则会报异常
     6         Socket socket = new Socket("localhost", 8888);
     7         //2.接收数据
     8         /*BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
     9         String message = br.readLine();//阻塞式方法,在读取数据时必须要有行结束符*/
    10         DataInputStream dis = new DataInputStream(socket.getInputStream());
    11         String message = dis.readUTF();
    12         System.out.println(message);
    13     }
    14 }
    15 
    16 服务端:
    17 public class MyServer {
    18     
    19     public static void main(String[] args) throws IOException {
    20         //1、创建服务端,指定端口,这里可以指定端口为8888,即使客户端也是用8888,因为不同协议端口可以重复
    21         ServerSocket serverSocket = new ServerSocket(8888);
    22         //2、接收客户端的连接,阻塞式的
    23         Socket socket = serverSocket.accept();
    24         System.out.println("一个客户端建立连接");//当运行程序,然后在浏览器访问此端口,则会打印
    25         
    26         //3.发送数据和接收数据
    27         String message = "欢迎使用";
    28         /*
    29         //输出流
    30         BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
    31         bw.write(message);
    32         bw.newLine();//向流中添加一个行结束符
    33         bw.flush();
    34         //不要关闭
    35         */
    36         DataOutputStream dos = new DataOutputStream(socket.getOutputStream());
    37         dos.writeUTF(message);
    38         dos.flush();    
    39     }
    40 }
    View Code

     3.2三次握手

    Sequenece Number:用来标识从TCP发送端向TCP接收端的数据字节流。

    Acknowledgment Number:32位确认序号包发送确认的一端所期望收到的下一个序号,因此,确认需要应该是上次已成功收到数据字节序号+1,不过只有当标志位中的ACK标志(下面介绍)为1时该确认序列号的字段才有效。主要用来解决不丢包的问题。

    4.传输层协议UDP

    UDP以数据为中心,不安全,非面向连接,数据可能丢失,但是效率较高。

    4.1 类DatagramSocket和DatagramPacket

    使用步骤:

    • 1、客户端
      (1)创建客户端DatagramSocket类 + 指定端口
      (2)准备数据 必须使用字节数组
      (3)打包DatagramPacket+服务器的地址和端口
      (4)发送
      (5)释放资源

    • 2、服务器端
      (1)创建服务端DatagramSocket类+ 指定端口
      (2)准备接收的容器(字节数组),封装DatagramPacket
      (3)使用包接收数据
      (4)分析数据
      (5)释放资源

    • 3、注意
      发送的数据一定要转换成字节数组,同时udp不是面向连接的,就算服务端没有开启,客户端这边运行也不会报错。

     1 客户端:
     2 //注意:要先开启服务端,但是先开启客户端也不会报错,但是数据会丢失。因为不是面向连接的
     3 public class MyClient {
     4     public static void main(String[] args) throws IOException {
     5         //1、创建客户端+端口
     6         DatagramSocket client = new DatagramSocket(6666);//注意和服务端的端口不要冲突
     7         //2、准备数据,数据必须是字节数组
     8         String message = "udp编程";
     9         
    10         //double 类型,需要将double类型转换为字节数组
    11         double num = 89.12;
    12         
    13         //byte[] data = message.getBytes();
    14         byte[] data = convert(num);
    15         
    16         //3、将数据打包, 需要发送地址和端口
    17         DatagramPacket packet = new DatagramPacket(data, data.length, new InetSocketAddress("localhost", 8888));
    18         //4、发送数据
    19         client.send(packet);
    20         //5、释放资源
    21         client.close();
    22     }
    23     //double-->字节数组
    24     public static byte[] convert(double num) throws IOException{
    25         byte[] data = null;
    26         ByteArrayOutputStream bos = new ByteArrayOutputStream();
    27         DataOutputStream dos = new DataOutputStream(bos);
    28         dos.writeDouble(num);
    29         dos.flush();
    30         
    31         //获得数据
    32         data = bos.toByteArray();
    33         dos.close();
    34         
    35         return data;
    36     }
    37 }
    38 
    39 服务端:
    40 public class MyServer {
    41     
    42     public static void main(String[] args) throws IOException {
    43         //1、创建服务器+ 端口
    44         DatagramSocket server = new DatagramSocket(8888);//有可能端口被占用
    45         //2、准备接收容器
    46         byte[] container = new byte[1024];
    47         //3、封装成包,下面这个构造函数是用来接收的
    48         DatagramPacket packet = new DatagramPacket(container, container.length);
    49         //4、接收数据
    50         server.receive(packet);
    51         //5、分析数据
    52         //byte[] data = packet.getData();
    53         
    54         double data = convert(packet.getData());
    55         int len = packet.getLength();
    56         
    57         //System.out.println(new String(data, 0, len));
    58         System.out.println(data);
    59         
    60         //6、释放资源
    61         server.close();
    62     }
    63     
    64     //字节数组-->Data 输入流
    65     public static double convert(byte[] data) throws IOException{
    66         DataInputStream dis = new DataInputStream(new ByteArrayInputStream(data));
    67         double num = dis.readDouble();
    68         dis.close();
    69         return num;
    70     }
    71 }
    View Code


     http://www.52im.net/forum.php?mod=collection&action=view&ctid=3&fromop=all

  • 相关阅读:
    超过5名学生的课
    大的国家
    shell启动时读取的配置文件
    shell中的环境变量
    chisel中pviews命令无法使用
    shell script中的$*和$@
    OS X EI Capitan 10.11.4中sudo无法起作用的解决方法
    如何判断CPU的位数
    block中无法使用C数组变量
    布尔代数
  • 原文地址:https://www.cnblogs.com/ganchuanpu/p/6869589.html
Copyright © 2020-2023  润新知