通信协议TCP、UDP笔记

本文详细介绍了通信协议的分类(并行与串行),常见的硬件通讯协议(如SPI、I2C等)以及TCP和UDP两种传输层协议的功能、特点和在网络编程中的应用。重点阐述了TCP的三次握手和UDP的无连接特性,以及两者在实际编程中的实现步骤。
摘要由CSDN通过智能技术生成

1、协议的分类

常见通信协议通常可以分为并行通信协议和串行通信协议。

  • 并行通信:在同一时刻发送多位数据(可以是多根线)。优点:发送速度快;缺点:传输距离短,资源占用多。
  • 串行通信:用一根线在不同的时刻发送8位数据。优点:传输距离远,占用资源少;缺点:发送速度慢。

2,常见硬件通讯协议:SPI、I2C、UART、CAN和USB

3,传输层协议TCP和UDP    

        网络编程有三个要素,分别是IP地址端口号通信协议。TCP和UDP是两种常见的互联网传输协议,它们都是在IP网络上运行的传输层协议。

        TCP(Transmission Control Protocol:传输控制协议)是一种面向连接的可靠协议。它提供数据传输的有序性、完整性、流量控制和拥塞控制

        TCP的通信过程包括三次握手建立连接和四次挥手断开连接。使用TCP时,数据按顺序发送和接收,确保数据可靠地到达目的地。TCP适用于需要准确可靠传输的应用,如网页浏览、文件传输、电子邮件和远程登录

        UDP(User Datagram Protocol:用户数据报协议)则是一种无连接的不可靠协议。它提供了一种简单的、不可靠的传输方式。

        UDP不保证数据传输的有序性、完整性、流量控制和拥塞控制。使用UDP时,数据以数据包的形式发送,接收方不需建立连接,直接接收。UDP适用于实时应用,如音频、视频流传输、在线游戏和广播。

4,OSI参考模型与TCP/IP参考模型

        

 5,TCP编程

        TCP是基于字节流的传输层通信协议,所以TCP编程是基于IO流编程。

        对于客户端,我们需要使用Socket类来创建对象。对于服务器端,我们需要使用ServerSocket来创建对象,通过对象调用accept()方法来进行监听是否有客户端访问。

客户端与服务器端图解:

客户端与服务器端实现步骤:

前提:创建一个项目,在项目中创建两个模块(model),一个模块用来放客户端相关代码,一个模块用来放服务器端相关代码。

客户端:

(1)、创建Socket对象,并指定服务器端应用程序的端口号和服务器端主机的IP地址。

(2)、使用Socket的对象调用getOutputStream()方法来获取字节输出流对象。

(3)、调用字节输出流的write(byte[] buf)或者write(int b)向服务器发送指定数据。

(4)、记得关闭流。

服务器端:

(1)、创建ServerSocket对象,并指定该应用程序的端口号,端口号必须和客户端指定的端口号一样。

(2)、使用ServerSocket对象的accept()方法来监听客户端发送过来的请求,返回值为Socket对象。

(3)、调用Socket对象的getInputStream()方法获取字节输入流对象

(4)、调用字节输入流对象的read(byte[] buf)或read()方法获取数据。

(5)、记得关闭流。

6,UDP编程

UDP使用数据报进行数据传输,没有客户端与服务器端之分,只有发送方与接收方,两者哪个先启动都不会报错,但是会出现数据丢包现象。发送的内容有字数限制,大小必须限制在64k以内。

发送方与接收方实现步骤:

前提:创建一个项目,在项目中创建两个模块(model),一个模块用来放发送方相关代码,一个模块用来放接收方相关代码。

发送方:

1、创建DatagramSocket对象,可以指定应用程序的端口号,也可以不指定。
2、准备需要发送的数据
3、创建DatagramPacket对象,用来对发送的数据进行打包,需要指定发送内容、发送多少、发送到哪里和接收方的端口号四个参数。
4、调用DatagramSocket对象的send()方法发送数据。
5、记得关闭流。

接收方:

1、创建DatagramSocket对象,指定接收方的端口号,这个必须指定。
2、创建一个byte类型数组,用来接收发送方发送过来的数据。
3、创建DatagramPacket对象,准备接收数据。
4、调用DatagramSocket对象的receive()方法用于接收数据。
5、使用String类的构造方法将byte类型的数组中的数据转化成String类型并显示。
6、记得关闭流。

7,三次握手

  • TCP 提供面向有连接的通信传输。面向有连接是指在数据通信开始之前先做好两端之间的准备工作。
  • 所谓三次握手是指建立一个 TCP 连接时需要客户端和服务器端总共发送三个包以确认连接的建立。在socket编程中,这一过程由客户端执行connect来触发。

下面来看看三次握手的流程图

  • 第一次握手:客户端将标志位SYN置为1,随机产生一个值seq=J,并将该数据包发送给服务器端,客户端进入SYN_SENT状态,等待服务器端确认。
  • 第二次握手:服务器端收到数据包后由标志位SYN=1知道客户端请求建立连接,服务器端将标志位SYN和ACK都置为1,ack=J+1,随机产生一个值seq=K,并将该数据包发送给客户端以确认连接请求,服务器端进入SYN_RCVD状态。
  • 第三次握手:客户端收到确认后,检查ack是否为J+1,ACK是否为1,如果正确则将标志位ACK置为1,ack=K+1,并将该数据包发送给服务器端,服务器端检查ack是否为K+1,ACK是否为1,如果正确则连接建立成功,客户端和服务器端进入ESTABLISHED状态,完成三次握手,随后客户端与服务器端之间可以开始传输数据了。

8,四次挥手

  • 四次挥手即终止TCP连接,就是指断开一个TCP连接时,需要客户端和服务端总共发送4个包以确认连接的断开。在socket编程中,这一过程由客户端或服务端任一方执行close来触发。
  • 由于TCP连接全双工的,因此,每个方向都必须要单独进行关闭,这一原则是当一方完成数据发送任务后,发送一个FIN来终止这一方向的连接,收到一个FIN只是意味着这一方向上没有数据流动了,即不会再收到数据了,但是在这个TCP连接上仍然能够发送数据,直到这一方向也发送了FIN。首先进行关闭的一方将执行主动关闭,而另一方则执行被动关闭。

下面来看看四次挥手的流程图:

  • 中断连接端可以是客户端,也可以是服务器端。
  • 第一次挥手:客户端发送一个FIN=M,用来关闭客户端到服务器端的数据传送,客户端进入FIN_WAIT_1状态。意思是说"我客户端没有数据要发给你了",但是如果你服务器端还有数据没有发送完成,则不必急着关闭连接,可以继续发送数据。
  • 第二次挥手:服务器端收到FIN后,先发送ack=M+1,告诉客户端,你的请求我收到了,但是我还没准备好,请继续你等我的消息。这个时候客户端就进入FIN_WAIT_2 状态,继续等待服务器端的FIN报文。
  • 第三次挥手:当服务器端确定数据已发送完成,则向客户端发送FIN=N报文,告诉客户端,好了,我这边数据发完了,准备好关闭连接了。服务器端进入LAST_ACK状态。
  • 第四次挥手:客户端收到FIN=N报文后,就知道可以关闭连接了,但是他还是不相信网络,怕服务器端不知道要关闭,所以发送ack=N+1后进入TIME_WAIT状态,如果Server端没有收到ACK则可以重传。服务器端收到ACK后,就知道可以断开连接了。客户端等待了2MSL后依然没有收到回复,则证明服务器端已正常关闭,那好,我客户端也可以关闭连接了。最终完成了四次握手。

9,TCP和UDP的区别

  • 18
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值