层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