广播是TCP还是UDP协议? UDP协议
TCP与UDP区别总结:
1、TCP面向连接(如打电话要先拨号建立连接);UDP是无连接的,即发送数据之前不需要建立连接
2、TCP提供可靠的服务。也就是说,通过TCP连接传送的数据,无差错,不丢失,不重复,且按序到达;UDP尽最大努力交付,即不保 证可靠交付
3、TCP面向字节流,实际上是TCP把数据看成一连串无结构的字节流;UDP是面向报文的
UDP没有拥塞控制,因此网络出现拥塞不会使源主机的发送速率降低(对实时应用很有用,如IP电话,实时视频会议等)
4、每一条TCP连接只能是点到点的;UDP支持一对一,一对多,多对一和多对多的交互通信
5、TCP首部开销20字节;UDP的首部开销小,只有8个字节
6、TCP的逻辑通信信道是全双工的可靠信道,UDP则是不可靠信道
TCP协议
1.网络分层
网络分为5层:
- 应用层
- 传输层
- 网络层
- 数据链路层
- 物理层
其中:
网络层:是根据提供的ip地址端口号,找到对应的主机和应用;
传输层:通过端口号将数据传输到主机的进程,来实现进程之间的通讯的;
2.端口号:
- 0~1023:分配给系统进程之间使用的,普通应用不能使用;
- 1024~49151:登记端口主要让第三应用使用的
- 49152~65535:短暂端口号,是留给客户选择暂时使用的,一个进程使用完可以供其他进程使用;
也就是说TCP能使用的端口号为1024~65535;
3.客户端和服务端结构(client & server)
- 定义:即客户端/服务器结构,是软件系统体系结构
- 作用:充分利用两端硬件环境的优势,将任务合理分配到Client端和Server端来实现,降低了系统的通讯开销。
Socket正是使用这种结构建立连接的,一个套接字接客户端,一个套接字接服务器。
-
可以看出,Socket的使用可以基于TCP或者UDP协议。相当于Socket是数据的封装,TCP和UDP就是传输工具;
4.TCP协议:
4.1定义:TCP传输控制协议,是一种传输层的通信协议;
特点:
- 面向连接:使用TCP传输数据之前先建立连接,传输完成后释放链接。类似打电话,拨号,接通,交流,挂机;
- 全双工通信:一旦建立TCP连接,双方在任何时候向对方发送数据;
- 可靠性:传输数据无差错,不丢失,不重复,并且按顺序到大;
- 面向字节流:流,指的是流入到进程或从进程流出的字符序列。简单来说,虽然有时候要传输的数据流太大,TCP报文长度有限制,不能一次传输完,要把它分为好几个数据块,但是由于可靠性保证,接收方可以按顺序接收数据块然后重新组成分块之前的数据流,所以TCP看起来就像直接互相传输字节流一样,面向字节流。
4.2握手:
TCP三次握手:
TCP是主机对主机层的传输控制协议,提供可靠的连接服务,采用三次握手确认建立一个连接:位码即tcp标志位,有6种标示:SYN(synchronous建立联机) ACK(acknowledgement 确认) PSH(push传送) FIN(finish结束) RST(reset重置) URG(urgent紧急)Sequence number(顺序号码) Acknowledge number(确认号码)
- 第一次握手:主机A发送位码为syn=1,随机产生seq number=1234567的数据包到服务器,并进入SYN_SEND状态等待服务器确认,主机B由SYN=1知道,A要求建立联机;
- 第二次握手:主机B收到请求后要确认联机信息,向A发送ack number=(主机A的seq+1),syn=1,ack=1,随机产生seq=7654321的包;
- 第三次握手:主机A收到后检查ack number是否正确,即第一次发送的seq number+1,以及位码ack是否为1,若正确,主机A会再发送ack number=(主机B的seq+1),ack=1,主机B收到后确认seq值与ack=1则连接建立成功。
PS:
- 三次握手期间任何一次出现问题都有要从头再来;
- 最后后一次握手完后,CS都会进入已经建立连接状态ESTABLISHED状态;
为什么要进行三次握手呢???
因为双发发送的数据不知道对象什么时候收到,比如Client发送请求第一次握手,但是相应超时了,client已经释放这次请求了,但是网络很差,延迟很高,Server很迟才收到这个请求,然后在向Client发送相应,Client收到后检查到已经失效的相应后,这次请求就作废了;在第二次握手是网络很糟糕,client接受server的相应很迟,client在作出相应,server已经释放了这次请求的话,那么就要从头开始了。A-->B-->A ,B-->A-->B很快的请求和相应,搞好三次握手;
5.Socket和Http的对比:
Socket
属于传输层,因为TCP / IP
协议属于传输层,解决的是数据如何在网络中传输的问题HTTP
协议 属于 应用层,解决的是如何包装数据
由于二者不属于同一层面,所以本来是没有可比性的。但随着发展,默认的Http里封装了下面几层的使用,所以才会出现Socket
& HTTP
协议的对比:(主要是工作方式的不同):
-
Http
:采用 请求—响应 方式。- 即建立网络连接后,当 客户端 向 服务器 发送请求后,服务器端才能向客户端返回数据。
- 可理解为:是客户端有需要才进行通信
-
Socket
:采用 服务器主动发送数据 的方式- 即建立网络连接后,服务器可主动发送消息给客户端,而不需要由客户端向服务器发送请求
- 可理解为:是服务器端有需要才进行通信
6.基本使用
// 步骤1:创建客户端 & 服务器的连接
// 创建Socket对象 & 指定服务端的IP及端口号
Socket socket = new Socket("192.168.1.32", 1989);
// 判断客户端和服务器是否连接成功
socket.isConnected());
// 步骤2:客户端 & 服务器 通信
// 通信包括:客户端 接收服务器的数据 & 发送数据 到 服务器
<-- 操作1:接收服务器的数据 -->
// 步骤1:创建输入流对象InputStream
InputStream is = socket.getInputStream()
// 步骤2:创建输入流读取器对象 并传入输入流对象
// 该对象作用:获取服务器返回的数据
InputStreamReader isr = new InputStreamReader(is);
BufferedReader br = new BufferedReader(isr);
// 步骤3:通过输入流读取器对象 接收服务器发送过来的数据
br.readLine();
<-- 操作2:发送数据 到 服务器 -->
// 步骤1:从Socket 获得输出流对象OutputStream
// 该对象作用:发送数据
OutputStream outputStream = socket.getOutputStream();
// 步骤2:写入需要发送的数据到输出流对象中
outputStream.write(("Carson_Ho"+"\n").getBytes("utf-8"));
// 特别注意:数据的结尾加上换行符才可让服务器端的readline()停止阻塞
// 步骤3:发送数据到服务端
outputStream.flush();
// 步骤3:断开客户端 & 服务器 连接
os.close();
// 断开 客户端发送到服务器 的连接,即关闭输出流对象OutputStream
br.close();
// 断开 服务器发送到客户端 的连接,即关闭输入流读取器对象BufferedReader
socket.close();
// 最终关闭整个Socket连接
UDP协议
一、UDP协议全称是用户数据报协议 ,在网络中它与TCP协议一样用于处理数据包,是一种无连接的协议。
1、UDP是一个无连接协议,传输数据之前源端和终端不建立连接;
2、不维护连接状态,包括收发状态等,因此一台服务机可同时向多个客户机传输相同的消息;
3、UDP信息包的标题很短,8个字节,对于TCP的20个字节信息包的额外开销很小;
4、吞吐量不受拥挤控制算法的调节,只受应用软件生成数据的速率、传输带宽、源端和终端主机性能的限制;
5、不保证可靠交付;
6、UDP是面向报文的。
二、UDP的代码编程需要用到DatagramSocket类,Java使用DatagramSocket代表UDP协议的Socket
server服务端(接收数据方)创建步骤
1、生成DatagramSocket对象,参数为端口号
1 |
|
2、byte数组用来接收数据
1 |
|
3、DatagramPackage以包形式装载byte数组
1 |
|
4、使用DatagramPacket的receive方法接收发送方所发送的数据,是一个阻塞的方法
1 |
|
5、接收到的数据转变化成可读字符串
1 |
|
client客户端(发送数据方)创建步骤
1、生成DatagramSocket对象,参数为端口号
1 |
|
2、创建一个InetAddress对象,用于确定server客户端(数据接收方),参数为IP地址,如我的IP地址为192.168.1.103
1 |
|
3、需要发送的数据转化为byte数组
1 2 |
|
4、生成一个DatagramPacket对象,包含需要发送的byte数组,byte数组长度,已设置IP地址的serverAddress,和服务端一致的端口号(这里是8888)
1 |
|
5、发送数据,调用DatagramSocket对象的send方法
1 |
|