【计算机网络】TCP和UDP学习总结

一、TCP:传输控制协议(Transmission Control Protocol)

  1. 主要作用:把数据流分割成适当长度的报文段之后进行传输
  2. 工作机制:紧小细微型。它是面向连接的运输层协议。在使用TCP之前,应用程序必须先建立TCP连接(三次握手建立连接),然后传输数据,这里通过停止等待协议,连续ARQ(自动重传请求)协议等确保可靠,然后断开TCP连接(四次挥手)。
  3. 优势:可靠性好
  4. TCP如何实现可靠性:劣势:速度慢,占用系统资源高,容易被攻击
    • 首先,发送方和接收方都维持一个发送窗口/接收窗口,发送窗口内的数据是允许发送的(发送窗口内的数据又可以分为"已发送但未收到确认"和"允许发送但未发送"),接收窗口代表了接收方接受数据包的能力大小。当发送方发送一段数据之后,等待接收方的确认,如果在规定时间内收到确认了,发送窗口后移,已发送但未收到确认的窗口长度变小,允许发送但尚未发送的窗口长度变大;如果没有在规定时间内收到确认,则重发。当接收方接收到期待收到的连续数据包会发送给发送方确认。
    • TCP将保持它首部和数据的检验和。这是一个端到端的检验和,目的是检测数据在传输过程中的任何变化。如果收到段的检验和有差错,TCP将丢弃这个报文段和不确认收到此报文段(希望发端超时并重发)
    • 既然TCP报文段作为IP数据报来传输,而IP数据报的到达可能会失序,因此TCP报文段的到达也可能会失序。如果必要,TCP将对收到的数据进行重新排序,将收到的数据以正确的顺序交给应用层。
    • TCP的接收端必须丢弃重复的数据
    • 流量控制。TCP连接的每一方都有固定大小的缓冲空间。TCP的接收端只允许另一端发送接收端缓冲区所能接纳的数据。这将防止较快主机致使较慢主机的缓冲区溢出。
  5. 应用:当对网络通讯质量有要求的时候,比如:整个数据要准确无误的传递给对方,这往往用于一些要求可靠的应用,比如HTTP、HTTPS、FTP等传输文件的协议,POP、SMTP等邮件传输的协议。 在日常生活中,常见使用TCP协议的应用如下: 浏览器,用的HTTP FlashFXP,用的FTP Outlook,用的POP、SMTP Putty,用的Telnet、SSH QQ文件传输 …………TCP在传递数据之前,要先建连接,这会消耗时间,而且在数据传递时,确认机制、重传机制、拥塞控制机制等都会消耗大量的时间。 由于在每台设备上都需要维护所有的传输连接,而每个连接都会占用系统的CPU、内存等硬件资源。 此外,由于TCP有确认机制、三次握手机制,这些也导致TCP容易被人利用,实现DOS、DDOS、CC等攻击。

 

二、UDP:用户数据报协议(User Datagram Protocol)

  1. 主要作用:将网络数据压缩成数据包的形式(数据包:一个二进制数据的传输单位)
  2. 工作机制:蛮干型。它是在IP数据报服务商添加了复用、分用、差错检测的功能。它想传送时就简单地去抓取来自应用程序的数据,并尽可能快地把它扔到网络上。因此,在发送端,UDP传送数据的速度仅仅是受应用程序生成数据的速度、计算机的能力和传输带宽的限制;在接收端,UDP把每个消息段放在队列中,应用程序每次从队列中读一个消息段。
  3. 优势:速度快,比较安全
    • 与TCP协议相比,UDP协议排除了信息可靠传递机制,也就是减少了TCP协议中提供数据包分组、组装和排序的过程需要的时间消耗。其次,UDP是一个无状态的传输协议,所以它在传递数据时非常快。没有TCP的这些机制,UDP较TCP被攻击者利用的漏洞就要少一些。
  4. 劣势:不可靠
    • UDP协议是一种无连接的传输协议,排除信息可靠传递机制带来速度优势的同时,显然降低了可靠性的需求,也就是UDP协议无法得知其是否安全完整到达的。
  5. 应用:
    • 因为UDP协议的控制选项较少,在数据传输过程中延迟小、数据传输效率高,适合对可靠性要求不高的应用程序,或者可以保障可靠性的应用程序,如DNS、TFTP、SNMP等。
      在生活中音频、视频和普通数据都可以采用UDP协议来进行数据传输,比如腾讯QQ这些社交软件也多采用UDP。

三、补充

  1.TCP和UDP的报文头

 

2.基于TCP的协议:HTTP/HTTPS,Telnet,FTP,SMTP。

基于UDP的协议:DHCP,DNS,SNMP,TFTP,BOOTP。

 

 

四、Java的TCP、UDP支持

1.UDP通信:

 1.1DatagramPacket类,该类用来封装UDP通信中发送或者接收的数据。(集装箱)

 构造方法:

DatagramPacket(byte[] buf,int length)
/*buf 为封装数据的字节数组的大小,length是数据的长度,该构造方法只能应用于接收端,因为没有设置IP地址和端口号*/
DatagramPacket(byte[] buf,int length,InetAddress address,int port)

常用方法:

InetAddress getAddress()//返回IP地址,从数据包将要发送到的那个机器得到
int getPort()//返回端口
byte[] getData()//返回数据缓冲区
int getLength()//返回数据长度

 1.2 DatagramSocket:发送或接受DatagramPacket数据包。(码头)

构造方法:

DatagramSocket()//系统会自动分配一个没有被其他网络程序使用的端口号
DatagramSocket(int port)//创建数据包套接字并将其绑定到本地主机上的指定端口

常用方法:

void receive(DatagramPacket p)//用当前创建的DatagramSocket接收Packet的内容
void send(DatagramPacket p)//发送数据包

1.3 案例:

实现UDP和TCP首先要创建一个发送端程序和接收端程序,先运行接收端,再运行发送端。

发送端:

 1 package com.liulei.udp;
 2 
 3 import java.io.IOException;
 4 import java.net.DatagramPacket;
 5 import java.net.DatagramSocket;
 6 import java.net.SocketException;
 7 
 8 public class Receive {
 9     public static void main(String[] args) {
10         DatagramSocket socket = null;
11         try {
12             socket = new DatagramSocket(12345);//建立码头
13             byte[] buf = new byte[1024];//建立缓冲区
14             DatagramPacket packet = new DatagramPacket(buf,buf.length);//建立集装箱
15             socket.receive(packet);
16 
17             byte[] data = packet.getData();
18             System.out.println("数据内容:"+new String(data,0,data.length));
19             System.out.println("数据长度:"+packet.getLength());
20         } catch (SocketException e) {
21             e.printStackTrace();
22         } catch (IOException e) {
23             e.printStackTrace();
24         }finally {
25             socket.close();//记得关闭
26         }
27     }
28 }

 

接收端:

 1 package com.liulei.udp;
 2 
 3 import java.io.IOException;
 4 import java.net.*;
 5 
 6 public class Sender {
 7     public static void main(String[] args) {
 8         DatagramSocket socket = null;
 9         try {
10             socket = new DatagramSocket();//建立码头,由于不需要连接客户端,所以不加端口的参数
11             byte[] buf = "Hello,UDP!".getBytes();
12             InetAddress address = InetAddress.getByName("localhost");
13             DatagramPacket packet = new DatagramPacket(buf,buf.length,address,12345);//建立集装箱
14             socket.send(packet);//通过码头发送集装箱
15         } catch (SocketException e) {
16             e.printStackTrace();
17         } catch (UnknownHostException e) {
18             e.printStackTrace();
19         } catch (IOException e) {
20             e.printStackTrace();
21         }finally {
22             socket.close();
23         }
24     }
25 }

2.TCP连接:

TCP通信同UDP通信一样,都能实现两台计算机之间的通信,通信的两端都需要创建socket对象。

区别在于,UDP中只有发送端和接收端,不区分客户端与服务器端,计算机之间可以任意地发送数据。

而TCP通信是严格区分客户端与服务器端的,在通信时,必须先由客户端去连接服务器端才能实现通信,服务器端不可以主动连接客户端,并且服务器端程序需要事先启动,等待客户端的连接。

在JDK中提供了两个类用于实现TCP程序,一个是ServerSocket类,用于表示服务器端,一个是Socket类,用于表示客户端。

通信时,首先创建代表服务器端的ServerSocket对象,该对象相当于开启一个服务,并等待客户端的连接,然后创建代表客户端的Socket对象向服务器端发出连接请求,服务器端响应请求,两者建立连接开始通信。

2.1ServerSocket

构造方法:

ServerSocket(int port)//绑定到指定端口

常用方法:

Socket accept()//侦听并接受到此套接字的连接
InetAddress getInetAddress()//返回此服务器套接字的本地地址

ServerSocket对象负责监听某台计算机的某个端口号,在创建ServerSocket对象后,需要继续调用该对象的accept()方法,接收来自客户端的请求。当执行了accept()方法之后,服务器端程序会发生阻塞,直到客户端发出连接请求,accept()方法才会返回一个Scoket对象用于和客户端实现通信,程序才能继续向下执行。

2.2 Socket

它用于实现客户端。

构造方法:

Socket(String host,int port)//指定主机上的端口
Socket(InetAddress address, int port)//指定IP地址和端口
getInputStream()和getOutputStream()//看下面

//最常用第一个

常用方法:

int getPort() //返回端口
InetAddress getLocalAddress()//返回IP地址
void close()//关闭Socket连接
InputStream getInputStream()//获取输入流。如果该对象由ServerSocket返回,则用于读取客户端发来的信息,否则用于读取服务器端发送的消息
OutputStream getOutputStream()//获取输出流。如果该对象由ServerSocket返回,则用于向客户端发送数据,否则用于向服务端发送数据。

当客户端和服务器建立连接之后,数据以IO流的形式实现交互的。

2.3 案例

服务器:

 1 package com.liulei.tcp;
 2 
 3 import java.io.IOException;
 4 import java.io.OutputStream;
 5 import java.net.ServerSocket;
 6 import java.net.Socket;
 7 
 8 public class TCPServer {
 9     public static void main(String[] args) {
10         ServerSocket serverSocket = null;
11         OutputStream outputStream = null;
12         try {
13             serverSocket = new ServerSocket(8899);//建立服务器
14             Socket client = serverSocket.accept();//接收客户端连接,返回客户端的Socket对象
15             outputStream = client.getOutputStream();//通过客户端返回输出流,用于向客户端发送消息
16             outputStream.write("连接服务器成功...".getBytes());
17         } catch (IOException e) {
18             e.printStackTrace();
19         }finally {
20             try {
21                 outputStream.close();
22                 serverSocket.close();
23             } catch (IOException e) {
24                 e.printStackTrace();
25             }
26         }
27     }
28 }

客户端:

 

 1 package com.liulei.tcp;
 2 
 3 import java.io.IOException;
 4 import java.io.InputStream;
 5 import java.net.Socket;
 6 
 7 public class TCPClient {
 8     public static void main(String[] args) {
 9         Socket socket =null;
10         InputStream inputStream = null;
11 
12         try {
13             socket = new Socket("localhost",8899);//建立客户端
14             inputStream = socket.getInputStream();//获取用于从服务器读数据的输入流
15 
16             byte[] buf = new byte[1024];
17             String str = "";
18             int length =-1;
19             while((length=inputStream.read(buf,0,buf.length))!=-1){
20                 //没有读到尾部
21                 str+=new String(buf,0,length);
22             }
23             System.out.println(str);
24         } catch (IOException e) {
25             e.printStackTrace();
26         }finally {
27             try {
28                 inputStream.close();
29                 socket.close();
30             } catch (IOException e) {
31                 e.printStackTrace();
32             }
33         }
34     }
35 }

 

参考:

https://blog.csdn.net/Tong_jy/article/details/78477634

https://www.cnblogs.com/-wang-cheng/p/5421988.html

https://www.cnblogs.com/xujingyang/p/6486046.html

 

 

 

 

 

转载于:https://www.cnblogs.com/JAVALLiuLei/p/9509815.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值