计算机网络体系结构中传输层的设计目标是允许源主机和目标主机上的对等实体进行对话,即为两个主机中进程之间的通信提供服务。例如,一台主机上的浏览器进程与另一台主机上的Web服务器进程之间进行通信。
TCP协议与UDP协议都是计算机网络体系结构中传输层中的网络协议,负责在程序之间传输数据(包括文本、图片、视频等数据类型)。
网络协议是指通信双方就通信如何进行所必须共同遵守的约定和通信规则的集合。在网络上通信的双方只有遵守相同的协议,才能正确地交流信息,就像人们交谈时要使用同一种语言一样,如果谈话里使用不同的语言,就会造成双方都不知所云,交流就被迫中断。
TCP是Transport Control Protocol的首字母缩写,称为传输控制协议。传输控制协议(TCP)是Internet一个重要的传输层协议。TCP提供面向连接、可靠、有序、****字节流传输服务。应用程序在使用TCP之前,必须先建立TCP连接。
百度百科
TCP是一种面向广域网的通信协议,目的是在跨越多个网络通信时,为两个通信端点之间提供一条具有下列特点的通信方式:
(1)基于流的方式;
(2)面向连接;
(3)可靠通信方式;
(4)在网络状况不佳的时候尽量降低系统由于重传带来的带宽开销;
(5)通信连接维护是面向通信的两个端点的,而不考虑中间网段和节点。
为满足TCP协议的这些特点,TCP协议做了如下的规定: [10]
①数据分片:在发送端对用户数据进行分片,在接收端进行重组,由TCP确定分片的大小并控制分片和重组;
②到达确认:接收端接收到分片数据时,根据分片数据序号向发送端发送一个确认;
③超时重发:发送方在发送分片时启动超时定时器,如果在定时器超时之后没有收到相应的确认,重发分片;
④滑动窗口:TCP连接每一方的接收缓冲空间大小都固定,接收端只允许另一端发送接收端缓冲区所能接纳的数据,TCP在滑动窗口的基础上提供流量控制,防止较快主机致使较慢主机的缓冲区溢出;
⑤失序处理:作为IP数据报来传输的TCP分片到达时可能会失序,TCP将对收到的数据进行重新排序,将收到的数据以正确的顺序交给应用层;
⑥重复处理:作为IP数据报来传输的TCP分片会发生重复,TCP的接收端必须丢弃重复的数据;
⑦数据校验:TCP将保持它首部和数据的检验和,这是一个端到端的检验和,目的是检测数据在传输过程中的任何变化。如果收到分片的检验和有差错,TCP将丢弃这个分片,并不确认收到此报文段导致对端超时并重发。
TCP数据格式:
标志位说明:
TCP的三次握手是TCP建立连接的过程,在客户和服务器之间交换三个TCP报文段。
前面说过,应用程序在使用TCP之前,必须先建立TCP连接,建立连接就需要经过以下几个步骤:
TCP的四次握手是TCP释放连接的过程。
UDP是User Datagram Protocol的首字母缩写,称为用户数据报协议协议。UDP 为应用程序提供了一种无需建立连接就可以发送封装的 IP 数据包的方法。
百度百科
UDP是OSI参考模型中一种无连接的传输层协议,它主要用于不要求分组顺序到达的传输中,分组传输顺序的检查与排序由应用层完成,提供面向事务的简单不可靠信息传送服务。UDP 协议基本上是IP协议与上层协议的接口。UDP协议适用端口分别运行在同一台设备上的多个应用程序。
UDP提供了无连接通信,且不对传送数据包进行可靠性保证,适合于一次传输少量数据,UDP传输的可靠性由应用层负责。常用的UDP端口号有:53(DNS)、69(TFTP)、161(SNMP),使用UDP协议包括:TFTP、SNMP、NFS、DNS、BOOTP。
UDP报文没有可靠性保证、顺序保证和流量控制字段等,可靠性较差。但是正因为UDP协议的控制选项较少,在数据传输过程中延迟小、数据传输效率高,适合对可靠性要求不高的应用程序,或者可以保障可靠性的应用程序,如DNS、TFTP、SNMP等。
UDP数据报协议:
TCP | UDP | |
---|---|---|
是否可靠 | 可靠传输,使用流量控制和拥塞控制 | 不可靠传输 |
是否连接 | 面向连接(三次握手) | 无连接 |
传输方式 | 面向字节流 | 面向报文 |
连接对象个数 | 一对一 | 一对一,一对多,多对一,多对多 |
首部开销 | 最小20字节,最大60字节,资源占用多 | 8字节,资源占用少 |
适用场景 | 要求可靠传输的应用,如文件传输等 | 适用于实时应用(IP电话、视频会议、直播等) |
Socket编程是网络通信中的一种编程技术,它的实现流程包括以下几步:
Socket编程是Internet中应用最广泛的网络应用编程接口,实现与3种底层协议接口:
下面以TCP为例简单实现服务端与客户端的通信:
public class Server {
public static void main(String[] args) throws Exception {
ServerSocket serverSocket = new ServerSocket(8888);
System.out.println("服务器启动==========");
while(!serverSocket.isClosed()){
Socket socket = serverSocket.accept(); //阻塞,等待连接
System.out.println("与 " + socket.toString() + "连接成功");
try{
// I/O
InputStream inputStream = socket.getInputStream(); //接收数据流
BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream,"UTF-8"));
String message;
while((message = reader.readLine())!= null){
if(message.length() == 0) break;
System.out.println(message);
}
System.out.println("接收到来至:" + socket.toString() + "的数据");
}catch (IOException e){
e.printStackTrace();
}finally {
try {
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
启动服务器端
public class Client {
public static void main(String[] args) throws Exception {
Socket socket = new Socket("localhost",8888);
OutputStream outputStream = socket.getOutputStream();
Scanner scanner = new Scanner(System.in);
System.out.println("输入数据:");
String message = scanner.nextLine();
outputStream.write(message.getBytes("UTF-8")); //将数据转换为字节流并write
scanner.close();
socket.close();
}
}
启动客户端
查看服务器端输出
客户端启动,与服务器端建立连接成功。
客户端发数据
查看服务器端输出
版权说明 : 本文为转载文章, 版权归原作者所有 版权申明
原文链接 : https://blog.csdn.net/weixin_43598687/article/details/122685488
内容来源于网络,如有侵权,请联系作者删除!