TCP协议与UDP协议的区别

目录

前言

一、TCP协议 

1、TCP协议首部组成

2、TCP三次握手和四次挥手

2、1 三次握手

2、2 四次挥手 

3、代码实现

二、UDP协议

1、UDP特点  

2、首部格式 

3、代码实现

三、TCP和UDP的区别 


前言

        在我们的OSI七层模型或者是四层模型中,我们的传输层始终保持不变,传输层负责定义两台主机进程之间的通信,提供数据传输服务,提供端到端的可靠传输,所以我们需要用到的两个主要的协议是:

  • TCP协议:传输控制协议,提供面向连接、可靠的数据传输服务,主要提供完整性服务
  • UDP协议:用户数据协议,提供无连接、尽最大努力交互的服务,不保证数据的可靠性,主要提供及时性服务

一、TCP协议 

1、TCP协议首部组成:

        

源端口和目的端口(4个字节

        源端口是发送端,目的端口是接收方,各自占2个字节

序号(4个字节

        传送的数据的数据流中每一个字节都拥有自己的序号,序号表示本报文段所发送的数据的第一个字节的序号,代表每次数据发送的位置,每发送一次就累加一次该数据字节数的大小,序号是计算机生成的随机数。

确认号(4个字节

        期望收到对方的下一个报文段数据的第一个字节的序号

数据偏移(4位

        表示数据部分距离报文首部的偏移量,“数据偏移”的计算单位是4个字节,数据偏移量是占四位,那么最大表示为1111,最大1111表示15 x 4= 60个字节,即表示TCP首部最大长度为60个字节,因此“选项”部分最多40个字节。

保留字段(4位)一般设置为0

标志位(8位)      

  • 紧急(URG):URG=1表示紧急指针有效,需要尽快传送,不需要排队直接优先传输
  • 确认(ACK):对已接受数据的确认,默认为0,建立连接后,所以传送的报文都必须将ACK置为1,当ACK=1表示确认号字段有效
  • 同步(SYN:在链接建立时使用,SYN=1ACK=0表示是一个链接请求,若对方同意建立连接,则响应报文段为SYN=1ACK=1
  • 推送(PSH):接收 TCP 收到 PSH = 1 的报文段,就尽快地交付接收应用进程,而不再等到整个缓存都填满了后再向上交付。
  • 复位(RST):当 RST = 1 时,表明 TCP 连接中出现严重差错(如由于主机崩溃或其他原因),必须释放连接,然后再重新建立运输连接。
  • 终止(FIN:FIN = 1 表明此报文段的发送端的数据已发送完毕,并要求释放运输连接。

窗口

        窗口值作为接受方让发送方设置其发送窗口的依据,单位为字节(限制是因为接受方的数据缓存空间是有限的)

检验和(2 字节

        检验和字段检验的范围包括首部和数据这两部分。在计算检验和时,要在 TCP 报文段的前面加上 12 字节的伪首部。

紧急指针(16

        指出在本报文段中紧急数据共有多少个字节(紧急数据放在本报文段数据的最前面)。

 2、TCP三次握手和四次挥手

 2、1 三次握手

第一次握手:客户端向服务端发送了一个同步报文段

        SYN=1:表示客户端请求连接

第二次握手:服务端收到了用户端的请求,同意建立连接,然后服务器发送确认报文段给客户端

        SYN=1 ACK=1:表示同意建立连接

第三次握手:客户端收到了服务端同意连接的确认之后,开始发送第一个数据包   

        ACK:表示收到服务器的确认数据包 

2、2 四次挥手 

         

 第一次挥手:客户端向服务端发送连接释放的请求报文,并且停止发送数据

        FIN=1:客户端主动释放客户端到服务端的TCP连接

第二次挥手:服务端收到了客户端的请求释放报文,客户端发送确认报文。从客户端到服务端这个方向上的连接就释放了,TCP连接处于半关闭状态。此时客户端无法发送数据给服务端,但是服务端还可以发送数据给客户端客户端仍可以接收。

        ACK=1:表示同意客户端释放连接请求

第三次挥手:服务端没有数据再发给客户端数据,其应用进程就通知TCP释放连接,并向客户端发送确认报文

        FIN=1 ACK=1:表示服务器释放服务器到客户端的TCP连接

第四次挥手:客户端收到服务端的释放报文段后,给服务端发送同意确认报文 

3、代码实现

        TCP进行数据的传输是基于流进行的

        客户端:使用的是Socket对象发送数据

public static void main(String[] args) {
	try(Socket clientSocket= new Socket("192.168.1.113",8080);) {
		//客户端接收服务端发送的数据
		try(BufferedReader reader = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));) {
			String result = reader.readLine();
			System.out.println(result);
		}
	} catch (Exception e) {
		e.printStackTrace();
	}
}

         服务端:使用的是ServerSocket 对象接受数据

public static void main(String[] args) {
	try(ServerSocket server = new ServerSocket(8080);) {
		//服务器处于阻塞状态,等待客户端的连接
		Socket accept = server.accept();
		System.out.println(accept.getRemoteSocketAddress());
		//服务端向客户端发送数据
		try(BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(accept.getOutputStream()))) {
			writer.write("提货码:"+UUID.randomUUID().toString().substring(0,6).toUpperCase());
			writer.flush();
		}
	} catch (Exception e) {
		e.printStackTrace();
	}
}

二、UDP协议

1、UDP特点  

  • 用户数据报协议UDP(User Datagram Protocol 是传输层的协议,无连接(即发送数据之前不需要建立连接)。
  • UDP 面向报文传输,不保证可靠交付,同时也不使用拥塞控制,适合多媒体通信的要求。
  • UDP 支持一对一、一对多、多对一和多对多的交互通信。
  • UDP 的首部开销小,只有 8 个字节

2、首部格式 

  • UDP的首部没有“序号”字段,因为UDP协议只需要传输一个数据包,所以不需要序号。
  • 用户数据报 UDP 有两个字段:数据字段首部字段。首部字段有 8 个字节,由 4 个字段组成,每个字段都是两个字节。

 

3、代码实现

        UDP进行数据的传输使用的是数据包的方式 

        客户端 

public static void main(String[] args) {
	//设置数据包
	byte[] buff="你好啊!!!".getBytes();
	DatagramPacket packet = new DatagramPacket(buff, buff.length);
	packet.setData(buff);  //将需要的数据写入数据包
	
	//基于UDP的Socket
	//8081是设置自己的端口号
	try(DatagramSocket socket=new DatagramSocket(8081)) {
		//设置接收方的IP和端口
		socket.connect(Inet4Address.getByName("192.168.0.148"),8080);
		//发送数据包
		socket.send(packet);
		
		//接收接收端的回应
		byte[] buf=new byte[64];
		packet.setData(buf);
		socket.receive(packet);
		//接受到的内容
		String result = new String(packet.getData(),packet.getOffset(),packet.getLength());
		System.out.println("服务端发送的内容:"+result);
	} catch (IOException e) {
		e.printStackTrace();
	}
}

         服务端

public static void main(String[] args) {
	//创建数据包用于接收
	byte[] buff = new byte[64];
	DatagramPacket packet = new DatagramPacket(buff, buff.length);
	//监听8080端口
	try(DatagramSocket socket = new DatagramSocket(8080)) {
		
		//接受数据,存入数据包
		socket.receive(packet);
		System.out.println("来自客户端的字节内容:"+Arrays.toString(packet.getData()));
		System.out.println("来自客户端的字节长度:"+packet.getLength());
		System.out.println("来自客户端的字节位置:"+packet.getOffset());
		
		//接受到的内容
		String result = new String(packet.getData(),packet.getOffset(),packet.getLength());
		System.out.println("客户端发送的内容:"+result);
		
		//给发送方进行反馈
		packet.setData("收到了!!!".getBytes());
		socket.connect(Inet4Address.getByName("192.168.0.137"),8081);
		socket.send(packet);
	} catch (Exception e) {
		e.printStackTrace();
	}
}

三、TCP和UDP的区别 

  • 面向连接:TCP协议需要建立连接,仅支持一对一通信;UDP协议无需建立连接,支持一对一、一对多、多对一和多对多的交互通信。
  • 可靠传输:TCP协议通过确认应答、连接管理、流量控制、拥塞控制来确保可靠性传输;UDP不保证可靠性传输。
  • 性能效率:TCP协议传输效率慢,需要较多的资源开销。UDP协议传输效率快,需要较少的资源开销。
  • 首部格式:TCP协议的首部需要20-60个字节,UDP协议需要8个字节。
  • 应用场景:TCP要求通信数据可靠(比如文件传输、邮件传输等),UDP适用于哟求通信速度快(如音频、视频等)

  • 3
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值