当前位置:   article > 正文

传输层两大战将TCP、UDP的定位

传输层两大战将TCP、UDP的定位

传输层

定义一些传输数据的协议和端口,传输协议同时进行流量控制,根据接收方的数据吞入熟读,规定适当的发送速率,解决传输效率及能力问题

什么是TCP

TCP/IP即传输控制/网络协议,是面向连接的协议,发送数据前要先建立连接(发送方和接收方的成
对的两个之间必须建 立连接),TCP提供可靠的服务,也就是说,通过TCP连接传输的数据不会丢
失,没有重复,并且按顺序到达

TCP是怎么建立服务端与客户端双向通信可信型通道的

TCP三次握手是建立TCP连接的过程,用于确认客户端和服务器之间的发送和接收功能是否正常。以下是TCP三次握手的具体细节:

  1. 第一次握手:客户端向服务器发送一个SYN包(即同步序列号),并进入SYN_SENT状态,等待服务器的确认。此时,SYN=1,seq=x(seq为客户端发送的序列号),表示客户端请求与服务器建立连接。
  2. 第二次握手:服务器收到客户端发送的SYN包后,会确认客户的ACK(即确认号),ack=x+1,同时自己也发送一个SYN包,即SYN+ACK包,此时服务器进入SYN_RECV状态。SYN=1,ACK=1,seq=y(seq为服务器发送的序列号),ack=x+1,表示服务器已收到客户端的连接请求,并请求客户端确认。
  3. 第三次握手:客户端收到服务器的SYN+ACK包后,会向服务器发送一个确认包ACK,ack=y+1,此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。此时,客户端和服务器都知道彼此有收发能力,可以开始传输数据了。

在三次握手过程中,每个数据包都包含一个序列号(seq)和一个确认号(ack)。序列号用于标识发送方发送的数据包的顺序,而确认号则用于确认接收方已成功接收到的数据包的顺序。通过比较序列号和确认号,双方可以确保数据的正确传输和接收。

此外,值得注意的是,在第二次和第三次握手中,服务器和客户端都会发送SYN和ACK标志位都为1的数据包,这是因为SYN和ACK标志位在不同的阶段有不同的含义。在第二次握手中,服务器的SYN标志位表示它正在请求与客户端建立连接,而ACK标志位则表示它已接收到客户端的连接请求。在第三次握手中,客户端的SYN标志位已不再需要,因为连接已经建立,而ACK标志位则用于确认已接收到服务器的SYN+ACK包。

总之,TCP三次握手是一个非常重要的过程,用于确保客户端和服务器之间的连接是可靠的,并且可以正常地传输数据。通过三次握手,双方可以确认彼此的发送和接收功能是否正常,并建立稳定的连接。

用打电话(IM的信令)来比喻三次握手

甲给乙打电话

 第一次握手  甲拨打乙的电话,乙的手机接收到甲的通话请求    服务器确认客户端发送正常

第二次握手   乙的手机会同步返回一个信令,告诉甲的手机,大哥,我收到了你的信息哦,客户端确认自己发送和接收与服务器发送和接收都正常,此时服务器只知道自己接收正常不知道自己发送是否正常

第三次握手   甲的手机接收到这个信令后,确认了乙的手机可以呼叫的通,继续呼叫(重点是怎么确定是继续呼叫还是第一次呼叫,这也就是那些丢来丢去的数据包做的事情)客户端继续呼叫了,服务器收到它的继续呼叫,说明自己也发送成功了,确认了双方都收发正常,可以建立正常的通讯了

这三次握手是缺一不可的,只要缺少就无法保证双向的接收都正常

 实际上以上就已经是建立了可信型通讯通道了,你实际上通讯的拒接或者收听都是建立在这个通讯通道建立的后续操作了

使用TCP协议的协议

使用TCP(传输控制协议)的协议有很多,以下是一些常见的例子:

  1. HTTP:超文本传输协议,用于在Web浏览器和服务器之间传输数据。
  2. HTTPS:安全超文本传输协议,是HTTP的安全版本,使用SSL/TLS对数据进行加密。
  3. FTP:文件传输协议,用于在客户端和服务器之间传输文件。
  4. POP3:邮局协议,用于从邮件服务器接收电子邮件。
  5. SMTP:简单邮件传输协议,用于发送电子邮件。
  6. Telnet:远程登录协议,允许用户通过终端登录到远程计算机。
  7. SSH:安全外壳协议,用于加密安全登录,替代安全性较差的Telnet协议。

以上只是使用TCP协议的一部分协议,实际上还有很多其他的协议也使用TCP进行数据传输。TCP是一种面向连接的、可靠的、基于字节流的传输层通信协议,广泛应用于各种网络应用中。

TCP例子

  1. package com.zxs;
  2. import java.io.IOException;
  3. import java.io.InputStream;
  4. import java.io.OutputStream;
  5. import java.net.ServerSocket;
  6. import java.net.Socket;
  7. public class TCPServer {
  8. public static void main(String[] args) {
  9. try {
  10. ServerSocket server = new ServerSocket(8081);
  11. System.out.println("等待客户端连接...");
  12. while (true) {
  13. Socket socket = server.accept();
  14. System.out.println("客户信息为:" + socket.getRemoteSocketAddress());
  15. InputStream in = socket.getInputStream();
  16. byte[] buffer = new byte[1024];
  17. int len = 0;
  18. while ((len = in.read(buffer)) > 0) {
  19. System.out.println(new String(buffer, 0, len));
  20. }
  21. OutputStream out = socket.getOutputStream();
  22. out.write("1".getBytes());
  23. }
  24. } catch (IOException e) {
  25. e.printStackTrace();
  26. }
  27. }
  28. }

 

  1. package com.zxs;
  2. import java.io.IOException;
  3. import java.io.OutputStream;
  4. import java.net.Socket;
  5. import java.util.Scanner;
  6. public class TCPClient {
  7. public static void main(String[] args) throws IOException {
  8. Socket socket = new Socket("127.0.0.1", 8081);
  9. OutputStream outputStream = socket.getOutputStream();
  10. System.out.println("连接成功请输入:");
  11. while (true) {
  12. byte[] car = new Scanner(System.in).nextLine().getBytes();
  13. outputStream.write(car);
  14. outputStream.flush();
  15. }
  16. }
  17. }

什么是UDP

UDP它是属于TCP/IP协议族中的一种。是无连接的协议,发送数据前不需要建立连接,是没有可
靠性的协议。因为不需要建立连接所以可以在在网络上以任何可能的路径传输,因此能否到达目的
地,到达目的地的时间以及内容的正确性都是不能被保证的。

我只负责公告,能不能收到是你们自己的事情

UDP(User Datagram Protocol)是用户数据报协议,它是OSI(Open System Interconnection,开放式系统互联)参考模型中一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务。UDP协议主要用于不要求分组顺序到达的传输中,分组传输顺序的检查与排序由应用层完成。

UDP协议的主要特点包括:

  1. 面向无连接的协议,速度快但是不可靠。
  2. 只管发送数据,不确认对方是否收到,对方接收到数据之后也不会反馈一个信息给发送方。
  3. 基于数据包(报)传输:将要发送的数据,源和目的地址封装的数据包中。
  4. 数据包大小限制在64k以内。
用公司发送放假通知来比喻UDP的不负责

假如到了年底放假,具体什么时候放假,人事在群里发一个放假通知,你Y的加没加群屏没屏蔽,收没收到不关他的事,他反正是通知了

使用UDP协议的协议

使用UDP(用户数据报协议)的协议主要有:

  1. DNS(域名系统):DNS用于将域名转换为IP地址。由于DNS查询和响应通常较小,且不需要建立持续的连接,因此DNS使用UDP进行通信。
  2. TFTP(简单文件传输协议):这是一种简单的文件传输协议,通常用于嵌入式系统和网络设备的固件更新。TFTP使用UDP进行数据传输。
  3. RIP(路由信息协议):RIP是一种用于在自治系统(AS)内部网关之间传递路由信息的动态路由选择协议。RIP使用UDP进行通信。
  4. DHCP(动态主机配置协议):DHCP用于自动为网络中的主机分配IP地址。DHCP客户端和服务器之间使用UDP进行通信。
  5. SNMP(简单网络管理协议):SNMP用于网络管理系统收集和管理网络设备的信息。SNMP使用UDP进行通信。

此外,还有一些实时性要求较高、数据量较小的应用场景也会使用UDP协议,例如网络视频会议系统、在线视频、网络语音电话等。

需要注意的是,虽然这些协议使用UDP进行通信,但并不意味着它们完全不依赖TCP。在某些情况下,这些协议可能会使用TCP进行辅助通信,例如当需要建立连接或进行可靠的数据传输时。

UDP例子

  1. package com.zxs;
  2. import java.io.IOException;
  3. import java.net.DatagramPacket;
  4. import java.net.DatagramSocket;
  5. //UDP协议Socket:服务端
  6. public class UDPServer {
  7. public static void main(String[] args) {
  8. try {
  9. DatagramSocket socket = new DatagramSocket(8082);
  10. System.out.println("服务端准备中...");
  11. while (true) {
  12. byte[] car = new byte[1024];
  13. DatagramPacket packet = new DatagramPacket(car, car.length);
  14. socket.receive(packet);
  15. int length = packet.getLength();
  16. System.out.println("接收到的数据:" + new String(car, 0, length));
  17. System.out.println("UDP协议Socket接受成功");
  18. }
  19. } catch (IOException e) {
  20. e.printStackTrace();
  21. }
  22. }
  23. }
  1. package com.zxs;
  2. import java.net.DatagramPacket;
  3. import java.net.DatagramSocket;
  4. import java.net.InetSocketAddress;
  5. import java.util.Scanner;
  6. public class UDPClient {
  7. public static void main(String[] args) {
  8. try {
  9. DatagramSocket socket = new DatagramSocket(2468);
  10. InetSocketAddress address = new InetSocketAddress("127.0.0.1", 8082);
  11. System.out.println("请输入你要公告的信息:");
  12. while (true) {
  13. byte[] car = new Scanner(System.in).nextLine().getBytes();
  14. DatagramPacket packet = new DatagramPacket(car, car.length,
  15. address);
  16. socket.send(packet);
  17. System.out.println("UDP协议的Socket发送成功");
  18. }
  19. } catch (Exception e) {
  20. e.printStackTrace();
  21. }
  22. }
  23. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/172265
推荐阅读
相关标签
  

闽ICP备14008679号