目录
前言
一、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=1,ACK=0表示是一个链接请求,若对方同意建立连接,则响应报文段为SYN=1,ACK=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();
}
}
服务端文章来源:https://www.toymoban.com/news/detail-406124.html
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适用于哟求通信速度快(如音频、视频等)文章来源地址https://www.toymoban.com/news/detail-406124.html
到了这里,关于TCP协议与UDP协议的区别的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!