TCP/UDP协议与Socket

> Socket的TCP UDP通信,TCP、UDP网路协议;

Android Socket编程(tcp)初探- https://www.jianshu.com/p/2ee8d427d011
Android Socket编程(udp)初探- https://www.jianshu.com/p/ccbc727fd8f4
Android socket高级用法(自定义协议和Protocol Buffer使用)- https://www.jianshu.com/p/173aea6dc9b7?utm_source=oschina-app
 在 Java 中,与 UDP 相关的类有 DatagramSocket、DatagramPacket 等。 Socket.setTcpNoDelay(true)
 在 Android 端应用 UDP 和 TCP 的场景是一个手机连接另一个手机的热点,二者处在同一局域网中。在二者并不知道对方的存在时,怎么才能发现彼此呢?通过心跳包的方式,双方都每隔一段时间发一个 UDP 包,如果对方接收到了,那就能知道对方的 ip,建立起通信了。
https://github.com/itsMelo/AndroidSocket
https://github.com/itsMelo/UDPSocketDemo

-- TCP和UDP优缺点
  -TCP:
  优点:可靠、稳定
TCP的可靠体现在TCP在传输数据之前,会有三次握手来建立连接,而且在数据传递时,有确认、窗口、重传、拥塞控制机制,在数据传完之后,还会断开连接用来节约系统资源
  缺点:慢,效率低,占用系统资源高,易被攻击
在传递数据之前要先建立连接,这会消耗时间,而且在数据传递时,确认机制、重传机制、拥塞机制等都会消耗大量时间,而且要在每台设备上维护所有的传输连接。然而,每个链接都会占用系统的CPU、内存等硬件资源。因为TCP有确认机制、三次握手机制,这些也导致TCP容易被利用,实现DOS、DDOS、CC等攻击

  -UDP:
  优点:快,比TCP稍安全
UDP没有TCP拥有的各种机制,是一个无状态的传输协议,所以传递数据非常快,没有TCP的这些机制,被攻击利用的机制就少一些,但是也无法避免被攻击
  缺点:不可靠,不稳定
因为没有TCP的那些机制,UDP在传输数据时,如果网络质量不好,就会很容易丢包,造成数据的缺失

  -适用场景:
TCP:当对网络通讯质量有要求时,比如HTTP、HTTPS、FTP等传输文件的协议, POP、SMTP等邮件传输的协议
UDP:对网络通讯质量要求不高时,要求网络通讯速度要快的场景

-- A simple Android app demo for learning tcp and udp- https://github.com/zhangpzh/Anjay

- TCP使用的是流的方式发送,UDP是以包的形式发送。
 1.构建tcp客户端的关键类: Socket; PrintWriter;InputStream;DataInputStream;
     Socket socket = new Socket("192.168.1.32", 1989);
     // 创建一个InputStream用户读取要发送的文件。
     InputStream inputStream = new FileInputStream("e://a.txt");
     // 获取Socket的OutputStream对象用于发送数据。
     OutputStream outputStream = socket.getOutputStream();
     // 创建一个byte类型的buffer字节数组,用于存放读取的本地文件
      byte buffer[] = new byte[4 * 1024];
      int temp = 0;
      // 循环读取文件
       while ((temp = inputStream.read(buffer)) != -1) {
           // 把数据写入到OuputStream对象中
           outputStream.write(buffer, 0, temp);
       }
       // 发送读取的数据到服务端
       outputStream.flush();

 2.构建UDP客户端的关键类: DatagramSocket; DatagramPacket; InetAddress
      //创建DatagramSocket对象并指定一个端口号,注意,如果客户端需要接收服务器的返回数据,
      //还需要使用这个端口号来receive,所以一定要记住
      DatagramSocket  socket = new DatagramSocket(1985);
      //使用InetAddress(Inet4Address).getByName把IP地址转换为网络地址  
      InetAddress serverAddress = InetAddress.getByName("192.168.1.32");
      //Inet4Address serverAddress = (Inet4Address) Inet4Address.getByName("192.168.1.32");  
      String str = "[2143213;21343fjks;213]";//设置要发送的报文  
      byte data[] = str.getBytes();//把字符串str字符串转换为字节数组  
      //创建一个DatagramPacket对象,用于发送数据。  
      //参数一:要发送的数据  参数二:数据的长度  参数三:服务端的网络地址  参数四:服务器端端口号 
      DatagramPacket packet = new DatagramPacket(data, data.length ,serverAddress ,10025);  
      socket.send(packet);//把数据发送到服务端。

--  JDK本身集成了TCP、UDP网路协议,那么Android 完全支持它;Android 也可以使用ServerSocket(服务端)、Socket(客户端),而ServerSocket、Socket是基于TCP/IP协议的网络通信;Android也可以使用DatagramSocket、DatagramPacket、MulticastSocket来建立基于UDP协议的网络通信;同时android也支持JDK提供URL、URLConnection;当然android还内置了HttpClient(这个自从android5.0以后需要自己添加Jar包)。Android与服务器的通信方式主要有两种,一是Http通信,一是Socket通信。
  打洞就是当内网机器A(192.168.0.2,211.11.11.11)发送一条消息到外网机器B(211.22.22.22)时,数据通过A所在的路由器时,路由器会记录数据的发送者的地址和端口,和数据接受者的地址和端口,并分配一个端口用来转发数据。当下次数据从B的相同端口发到这个分配的端口上时,路由器会直接转发给之前记录的内网机器A,这样就完成了打洞。

Socket 通信原理(Android客户端和服务器以TCP&&UDP方式互通)-https://blog.csdn.net/mad1989/article/details/9147661
Android上实现TCP&UDP的客户端和服务端-https://blog.csdn.net/sinat_18882775/article/details/50962956
A Tool about TCP connect- https://github.com/ReCclay/TCPClient

- Android网络编程TCP、UDP(三)——UDP实例:搜索局域网所有的设备- https://blog.csdn.net/a10615/article/details/52427047
* 打包响应报文
     * 协议:$ + packType(1) + data(n)
     *  data: 由n组数据,每组的组成结构type(1) + length(4) + data(length)
     *  type类型中包含name、room类型,但name必须在最前面

* 校验搜索数据
     * 协议:$ + packType(1) + sendSeq(4)
     *  packType - 报文类型
     *  sendSeq - 发送序列

 * 校验确认数据
     * 协议:$ + packType(1) + sendSeq(4) + deviceIP(n<=15)
     *  packType - 报文类型
     *  sendSeq - 发送序列
     *  deviceIP - 设备IP,仅确认时携带

-- 程序员面试被问到“三次握手,四次挥手”怎么办- https://blog.csdn.net/csdnnews/article/details/86570658
  TCP是一种面向连接的单播协议,在发送数据前,通信双方必须在彼此间建立一条连接。所谓的“连接”,其实是客户端和服务器的内存里保存的一份关于对方的信息,如ip地址、端口号等。
  TCP可以看成是一种字节流,它会处理IP层或以下的层的丢包、重复以及错误问题。在连接的建立过程中,双方需要交换一些连接的参数。这些参数可以放在TCP头部。
  TCP提供了一种可靠、面向连接、字节流、传输层的服务,采用三次握手建立一个连接。采用4次挥手来关闭一个连接。
  一个TCP连接由一个4元组构成,分别是两个IP地址和两个端口号。一个TCP连接通常分为三个阶段:启动、数据传输、退出(关闭)。
  一个完整的TCP连接是双向和对称的,数据可以在两个方向上平等地流动。给上层应用程序提供一种双工服务。一旦建立了一个连接,这个连接的一个方向上的每个TCP报文段都包含了相反方向上的报文段的一个ACK。
  序列号的作用是使得一个TCP接收端可丢弃重复的报文段,记录以杂乱次序到达的报文段。因为TCP使用IP来传输报文段,而IP不提供重复消除或者保证次序正确的功能。另一方面,TCP是一个字节流协议,绝不会以杂乱的次序给上层程序发送数据。因此TCP接收端会被迫先保持大序列号的数据不交给应用程序,直到缺失的小序列号的报文段被填满。
  ACK —— 确认,使得确认号有效。 RST —— 重置连接(经常看到的reset by peer)就是此字段搞的鬼。 SYN —— 用于初如化一个连接的序列号。 FIN —— 该报文段的发送方已经结束向对方发送数据。
 
 为什么建立连接是三次握手,而关闭连接却是四次挥手呢?
  这是因为服务端在LISTEN状态下,收到建立连接请求的SYN报文后,把ACK和SYN放在一个报文里发送给客户端。而关闭连接时,当收到对方的FIN报文时,仅仅表示对方不再发送数据了但是还能接收数据,己方是否现在关闭发送数据通道,需要上层应用来决定,因此,己方ACK和FIN一般都会分开发送。
   其实3次握手的目的并不只是让通信双方都了解到一个连接正在建立,还在于利用数据包的选项来传输特殊的信息,交换初始序列号ISN。3次握手是指发送了3个报文段,4次挥手是指发送了4个报文段。注意,SYN和FIN段都是会利用重传进行可靠传输的。

因为ISN是随机的,所以序列号容易就会超过2^31-1. 而tcp对于丢包和乱序等问题的判断都是依赖于序列号大小比较的。此时就出现了所谓的tcp序列号回绕(sequence wraparound)问题。

  目前,Linux下默认会进行5次重发SYN-ACK包,重试的间隔时间从1s开始,下次的重试间隔时间是前一次的双倍,5次的重试时间间隔为1s, 2s, 4s, 8s, 16s, 总共31s, 称为指数退避,第5次发出后还要等32s才知道第5次也超时了,所以,总共需要 1s + 2s + 4s+ 8s+ 16s + 32s = 63s, TCP才会把断开这个连接。由于,SYN超时需要63秒,那么就给攻击者一个攻击服务器的机会,攻击者在短时间内发送大量的SYN包给Server(俗称SYN flood攻击),用于耗尽Server的SYN队列。对于应对SYN 过多的问题,linux提供了几个TCP参数:tcp_syncookies、tcp_synack_retries、tcp_max_syn_backlog、tcp_abort_on_overflow 来调整应对。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
智慧校园整体解决方案是响应国家教育信息化政策,结合教育改革和技术创新的产物。该方案以物联网、大数据、人工智能和移动互联技术为基础,旨在打造一个安全、高效、互动且环保的教育环境。方案强调从数字化校园向智慧校园的转变,通过自动数据采集、智能分析和按需服务,实现校园业务的智能化管理。 方案的总体设计原则包括应用至上、分层设计和互联互通,确保系统能够满足不同用户角色的需求,并实现数据和资源的整合与共享。框架设计涵盖了校园安全、管理、教学、环境等多个方面,构建了一个全面的校园应用生态系统。这包括智慧安全系统、校园身份识别、智能排课及选课系统、智慧学习系统、精品录播教室方案等,以支持个性化学习和教学评估。 建设内容突出了智慧安全和智慧管理的重要性。智慧安全管理通过分布式录播系统和紧急预案一键启动功能,增强校园安全预警和事件响应能力。智慧管理系统则利用物联网技术,实现人员和设备的智能管理,提高校园运营效率。 智慧教学部分,方案提供了智慧学习系统和精品录播教室方案,支持专业级学习硬件和智能化网络管理,促进个性化学习和教学资源的高效利用。同时,教学质量评估中心和资源应用平台的建设,旨在提升教学评估的科学性和教育资源的共享性。 智慧环境建设则侧重于基于物联网的设备管理,通过智慧教室管理系统实现教室环境的智能控制和能效管理,打造绿色、节能的校园环境。电子班牌和校园信息发布系统的建设,将作为智慧校园的核心和入口,提供教务、一卡通、图书馆等系统的集成信息。 总体而言,智慧校园整体解决方案通过集成先进技术,不仅提升了校园的信息化水平,而且优化了教学和管理流程,为学生、教师和家长提供了更加便捷、个性化的教育体验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值