网络开发套接字以及UDP、TCP协议

本文深入探讨了网络编程中的Socket套接字,详细阐述了TCP与UDP的区别和应用场景,包括TCP的三次握手、四次挥手、可靠性和拥塞控制,以及UDP的无连接特性和数据报机制。通过Java API介绍了数据报套接字和流套接字的编程模型,并总结了TCP协议的关键特点和面试常见问题。
摘要由CSDN通过智能技术生成

目录

一、Socket 套接字

1、Socket 套接字的概念

2、Socket 套接字分类 

3、Java数据报套接字通信模型 

4、Java流套接字通信模型 

5、Socket编程注意事项 

 二、UDP数据报套接字编程

1、DatagramSocket API

​2、DatagramPacket API

​3、InetSocketAddress API

4、相关示例代码 

三、TCP 流套接字编程 

1、ServerSocket API

 2、Socket API

 3、TCP中的长短连接

4、相关代码示例

四、TCP协议简介

1、TCP的概念

2、TCP的可靠性 

3、TCP原理 

(1)确认应答机制

(2)超时重发机制  

■没有收到数据,所以没应答

■收到数据,也应答了,但还没有传回来

4、TCP的缓冲区 

5、TCP的连接以及连接管理

经典四次挥手

 6、 CLOSE_WAIT 状态

特点

 常考面试题

7、TIME_WAIT状态

特点

面试题1

8、TCP协议和应用层不同的观察现象

挥手阶段总结

9、TCP中的异常

10、收到异常的标志位 —— RST

11、流量控制

接收窗口

 12、拥塞控制

 整体步骤

面向字节流特性

13、总结部分

TCP segment Header部分总结讲解

14、滑动窗口何时变化 

连接阶段的一些机制 

忽略ack丢失

立即重传

更新接收窗口 

延迟应答/捎带应答

TCP协议手动设置边界

五、UDP的简介 

1、UDP的概念

2、UDP的特点

3、传输层的UDP

4、UDP的工作机制

5、UDP接收缓冲区 

6、基于UDP的应用层协议 

7、UDP小结 

(1)发送

(2)接收 


一、Socket 套接字

1、Socket 套接字的概念

      Socket套接字,是由系统提供用于网络通信的技术,是基于TCP/IP协议的网络通信的基本操作单元。基 于Socket套接字的网络程序开发就是网络编程。

2、Socket 套接字分类 

●流套接字:使用传输层TCP协议、

●数据报套接字:使用传输层UDP协议

●原始套接字 原始套接字用于自定义传输层协议,用于读写内核没有处理的IP协议数据。

3、Java数据报套接字通信模型 

对于UDP协议来说,具有无连接,面向数据报的特征,即每次都是没有建立连接,并且一次发送全部数 据报,一次接收全部的数据报。

java中使用UDP协议通信,主要基于 DatagramSocket 类来创建数据报套接字,并使用 DatagramPacket 作为发送或接收的UDP数据报。对于一次发送及接收UDP数据报的流程如下:

 以上只是一次发送端的UDP数据报发送,及接收端的数据报接收,并没有返回的数据。也就是只有请 求,没有响应。对于一个服务端来说,重要的是提供多个客户端的请求处理及响应,流程如下:

4、Java流套接字通信模型 

5、Socket编程注意事项 

 ●客户端和服务端:开发时,经常是基于一个主机开启两个进程作为客户端和服务端,但真实的场 景,一般都是不同主机。

●注意目的IP和目的端口号,标识了一次数据传输时要发送数据的终点主机和进程

●Socket编程我们是使用流套接字和数据报套接字,基于传输层的TCP或UDP协议,但应用层协议, 也需要考虑,这块我们在后续来说明如何设计应用层协议。

●关于端口被占用的问题 

 二、UDP数据报套接字编程

1、DatagramSocket API

DatagramSocket 是UDP Socket,用于发送和接收UDP数据报。

DatagramSocket 类简介 : 负责 UDP 数据的发送和接收 , 该类没有合并到 Socket API 中 , 因为在 Socket 协议中 , 必须要存在服务器端与客户端 , 在 UDP 中 , DatagramSocket 既是服务器又是客户端 , 其不需要监听端口 , 也不需要建立连接 。

注意:使用DatagramSocket(int port)可能会出现端口被占用的情况

 一旦通信双方在逻辑意义上有了通信线路,双方的地位就平等了(谁都可以是发送方和接收方),注意在通信结束后调用close方法进行资源的回收

 2、DatagramPacket API

DatagramPacket类就是通信过程中的数据抽象

DatagramPacket是UDP Socket发送和接收的数据报。

获取对方的ip和端口号,getData方法是给接收者使用可以拿到对方进程发送的应用层数据 

 3、InetSocketAddress API

构造UDP发送的数据报时,需要传入 SocketAddress ,该对象可以使用 InetSocketAddress 来创 建。

4、相关示例代码 

rocket_class_ds_web: javaweb的相关笔记都会在这里记录哦!!! - Gitee.comhttps://gitee.com/ren-xiaoxiong/rocket_class_ds_web/tree/master/src/webDevelopment/

三、TCP 流套接字编程 

1、ServerSocket API

ServerSocket 是创建TCP服务端Socket的API。

 2、Socket API

Socket 是客户端Socket,或服务端中接收到客户端建立连接(accept方法)的请求后,返回的服务端 Socket。

不管是客户端还是服务端Socket,都是双方建立连接以后,保存的对端信息,及用来与对方收发数据的。

 服务器的Socket对象是在accept()中获取到的,所以只有客户端的Socket对象需要手动化实例,这个构造方法就是提供给客户端使用的,传入服务器的ip+port就可以。

 输入流就是给接收方使用的,输出流就是给发送方使用的

■关于输入流的使用:

  ● 如果直接进行二进制读取

          byte[] buf=new byte[1024];  int n=inputStream.read(buf);

  ● 如果进行读取文本数据,建议直接使用Scanner封装InputStream后在使用

          Scanner sc=new Scanner(inputStream,"UTF-8");

          s.nextLine()...

■关于输出流的使用

    ●如果直接进行二进制的输出

           outputStream.write(buf,offset,length);

    ●如果进行的是文本输出,建议OutputStream封装成OutStreamWriter再封装成PrintWriter

          OutputStreamWriter osWriter=new OutputStreamWriter(outputStream,"UTF-8");

          PrinterWriyer writer=new PrintWrirter(osWriter);

          writer.println(...);/writer.print(...);/writer.printf(format,...);

     ●最后记得刷新缓存区(flush)。

 3、TCP中的长短连接

TCP发送数据时,需要先建立连接,什么时候关闭连接就决定是短连接还是长连接:

●短连接:每次接收到数据并返回响应后,都关闭连接,即是短连接。也就是说,短连接只能一次收发数 据。

●长连接:不关闭连接,一直保持连接状态,双方不停的收发数据,即是长连接。也就是说,长连接可以 多次收发数据。

对比以上长短连接,两者区别如下:

●建立连接、关闭连接的耗时:短连接每次请求、响应都需要建立连接,关闭连接;而长连接●只需要 第一次建立连接,之后的请求、响应都可以直接传输。相对来说建立连接,关闭连接也是要耗时 的,长连接效率更高。

●主动发送请求不同:短连接一般是客户端主动向服务端发送请求;而长连接可以是客户端主动发送 请求,也可以是服务端主动发。

●两者的使用场景有不同:短连接适用于客户端请求频率不高的场景,如浏览网页等。长连接适用于 客户端与服务端通信频繁的场景,如聊天室,实时游戏等。

4、相关代码示例

四、TCP协议简介

1、TCP的概念

TCP:传输控制协议

TCP,即Transmission Control Protocol,传输控制协议。人如其名,要对数据的传输进行一个详细的 控制。

2、TCP的可靠性 

●TCP会尽自己所能,尽量发送数据给对方,但并不能保证100%发送给对方。

●TCP会在数据不能发送给对方的情况给应用层一个错误通知。

●TCP可以保障接收方严格按照发送时的数据顺序接收。

●TCP保障数据不会出现无意间的损坏(UDP也可以做到)。

●TCP尽可能在维护网络质量。

3、TCP原理 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值