TCP与UDP

广播是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架构
    可以看出,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:采用 请求—响应 方式。

    1. 即建立网络连接后,当 客户端 向 服务器 发送请求后,服务器端才能向客户端返回数据。
    2. 可理解为:是客户端有需要才进行通信
  • Socket:采用 服务器主动发送数据 的方式

    1. 即建立网络连接后,服务器可主动发送消息给客户端,而不需要由客户端向服务器发送请求
    2. 可理解为:是服务器端有需要才进行通信

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

DatagramSocket socket = new  DatagramSocket (8888);

2、byte数组用来接收数据

1

byte data[] = new byte[1024];

3、DatagramPackage以包形式装载byte数组

1

DatagramPacket packet = new DatagramPacket(data, data.length);

4、使用DatagramPacket的receive方法接收发送方所发送的数据,是一个阻塞的方法

1

socket.receive(packet);

5、接收到的数据转变化成可读字符串

1

String result = new String(packet.getData(), packet.getOffset(), packet.getLength());

 client客户端(发送数据方)创建步骤

1、生成DatagramSocket对象,参数为端口号

1

DatagramSocket socket = new  DatagramSocket (8888);

2、创建一个InetAddress对象,用于确定server客户端(数据接收方),参数为IP地址,如我的IP地址为192.168.1.103

1

InetAddress serverAddress = InetAddress.getByName("192.168.1.103");

3、需要发送的数据转化为byte数组

1

2

String sendData= "hello word";

byte data[] = sendData.getBytes();

4、生成一个DatagramPacket对象,包含需要发送的byte数组,byte数组长度,已设置IP地址的serverAddress,和服务端一致的端口号(这里是8888)

1

DatagramPacket packet = new DatagramPacket(data, data.length, serverAddress, 8888);

5、发送数据,调用DatagramSocket对象的send方法

1

socket.send(packet);

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值