Udp、Tcp、Http Socket
2016-07-26 00:00
344 查看
摘要: adnroid 网络编程
面向连接的协议
需要三次握手建立连接
需要四次挥手断开连接
TCP报头最小长度:20字节
服务器回复:SYN = 1, ACK = X + 1, SEQ = Y
客户端发送:ACK = Y + 1, SEQ = X + 1
确认应答信号ACK = 收到的SEQ + 1。 连接建立中,同步信号SYN始终为1。连接建立后,同步信号SYN=0。
B收到,ACK = 1
B向A提出停止连接请求,FIN = 1
A收到,ACK = 1
优点:
可靠,稳定 1、传递数据前,会有三次握手建立连接 2、传递数据时,有确认、窗口、重传、拥塞控制 3、传递数据后,会断开连接节省系统资源
缺点:
传输慢,效率低,占用系统资源高 1、传递数据前,建立连接需要耗时 2、传递数据时,确认、重传、拥塞等会消耗大量时间以及CPU和内存等硬件资源
易被攻击 1、因为有确认机制,三次握手等机制,容易被人利用,实现DOS 、DDOS攻击
如何保证接收的顺序性:
TCP协议使用SEQ和ACK机制保证了顺序性 TCP的每个报文都是有序号的。确认应答信号ACK=收到的SEQ+1
面向无连接的协议
UDP报头只有8字节
简介:
传输数据之前源端和终端不建立连接,当它想传送时就简单地去抓取来自应用程序的数据,并尽可能快的把它扔到网络上
在发送端,UDP传送数据的速度仅仅是受应用程序生成数据的速度、计算机的能力和传输带宽的限制
在接收端,UDP把每个消息段放在队列中,应用程序每次从队列中读一个消息段
由于传输数据不建立连接,因此也就不需要维护连接状态,包括收发状态等,因此一台服务机可同时向多个客户机传输相同的消息
UDP信息包的标题很短,只有8个字节,相对于TCP的20个字节信息包的额外开销很小
吞吐量不受拥挤控制算法的调节,只受应用软件生成数据的速率、传输带宽、源端和终端主机性能的限制
UDP使用尽最大努力交付,即不保证可靠交付,因此主机不需要维持复杂的链接状态表。
UDP是面向报文的。发送方的UDP对应用程序交下来的报文,在添加首部后就向下交付给IP层。既不拆分,也不合并,而是保留这些报文的边界,因此,应用程序需要选择合适的报文大小。
使用“ping”命令来测试两台主机之间TCP/IP通信是否正常,其实“ping”命令的原理就是向对方主机发送UDP数据包,然后对方主机确认收到数据包,如果数据包是否到达的消息及时反馈回来,那么网络就是通的。
优点:
传输速率快 1、传输数据前,不需要像TCP一样建立连接 2、传输数据时,没有确认、窗口、重传、拥塞控制等机制
较安全 1、由于没有了TCP的一些机制,被攻击者利用的漏洞就少了
缺点:
不可靠,不稳定 1、由于没有了TCP的机制,在数据传输时如果网络不好,很可能丢包
用UDP协议通讯时怎样得知目标机是否获得了数据包
仿造TCP的做法,每发一个UDP包,都在里面加一个SEQ序号,接收方收到包后,将SEQ序号回复给发送方。如果发送方在指定时间以内没有收到回应,说明丢包了。
为什么UDP比TCP快
TCP需要三次握手
TCP有拥塞控制,控制流量等机制
为什么TCP比UDP可靠
TCP是面向有连接的,建立连接之后才发送数据;而UDP则不管对方存不存在都会发送数据。
TCP有确认机制,接收端每收到一个正确包都会回应给发送端。超时或者数据包不完整的话发送端会重传。UDP没有。因此可能丢包。
什么时候使用TCP
当对网络通讯质量有要求的时候,比如:整个数据要准确无误的传递给对方,这往往用于一些要求可靠的应用,比如HTTP、HTTPS、FTP等传输文件的协议,POP、SMTP等邮件传输的协议。 在日常生活中,常见使用TCP协议的应用如下: 浏览器,用的HTTP FlashFXP,用的FTP Outlook,用的POP、SMTP Putty,用的Telnet、SSH QQ文件传输
什么时候应该使用UDP:
当对网络通讯质量要求不高的时候,要求网络通讯速度能尽量的快,这时就可以使用UDP。 比如,日常生活中,常见使用UDP协议的应用如下: QQ语音 QQ视频 TFTP
TCP无边界,UDP有边界
TCP无边界
客户端分多次发送数据给服务器,若服务器的缓冲区够大,那么服务器端会在客户端发送完之后一次性接收过来,所以是无边界的;
UDP有边界
客户端每发送一次,服务器端就会接收一次,也就是说发送多少次就会接收多少次,因此是有边界的。
简单快速:客户向服务端请求服务时,只需传送请求方式和路径。
灵活:允许传输任意类型的数据对象。由Content-Type加以标记。
无连接:每次响应一个请求,响应完成以后就断开连接。
无状态:服务器不保存浏览器的任何信息。每次提交的请求之间没有关联。
流水线:不必等到收到服务器的回应就发送下一个报文。
非流水线:发出一个报文,等到响应,再发下一个报文。类似TCP。
Post直接以键值对的形式放到消息体中传递。
但两者的效率差距很小很小
是由SSL+Http协议构建的可进行加密传输、身份认证的网络协议。
服务器端
读取输入流
特别感谢 GeniusVJR 整理:
1.TCP与UDP
面向报文的传输方式是应用层交给UDP多长的报文,UDP就照样发送,即一次发送一个报文。因此,应用程序必须选择合适大小的报文。若报文太长,则IP层需要分片,降低效率。若太短,会是IP太小。UDP对应用层交下来的报文,既不合并,也不拆分,而是保留这些报文的边界。这也就是说,应用层交给UDP多长的报文,UDP就照样发送,即一次发送一个报文。 面向字节流的话,虽然应用程序和TCP的交互是一次一个数据块(大小不等),但TCP把应用程序看成是一连串的无结构的字节流。TCP有一个缓冲,当应用程序传送的数据块太长,TCP就可以把它划分短一些再传送。如果应用程序一次只发送一个字节,TCP也可以等待积累有足够多的字节后再构成报文段发送出去。TCP协议
Transmission Control Protocol,传输控制协议面向连接的协议
需要三次握手建立连接
需要四次挥手断开连接
TCP报头最小长度:20字节
三次握手的过程:
客户端发送:SYN = 1, SEQ = X, 端口号服务器回复:SYN = 1, ACK = X + 1, SEQ = Y
客户端发送:ACK = Y + 1, SEQ = X + 1
确认应答信号ACK = 收到的SEQ + 1。 连接建立中,同步信号SYN始终为1。连接建立后,同步信号SYN=0。
四次挥手过程
A向B提出停止连接请求,FIN = 1B收到,ACK = 1
B向A提出停止连接请求,FIN = 1
A收到,ACK = 1
优点:
可靠,稳定 1、传递数据前,会有三次握手建立连接 2、传递数据时,有确认、窗口、重传、拥塞控制 3、传递数据后,会断开连接节省系统资源
缺点:
传输慢,效率低,占用系统资源高 1、传递数据前,建立连接需要耗时 2、传递数据时,确认、重传、拥塞等会消耗大量时间以及CPU和内存等硬件资源
易被攻击 1、因为有确认机制,三次握手等机制,容易被人利用,实现DOS 、DDOS攻击
如何保证接收的顺序性:
TCP协议使用SEQ和ACK机制保证了顺序性 TCP的每个报文都是有序号的。确认应答信号ACK=收到的SEQ+1
UDP协议
User Data Protocol,用户数据包协议面向无连接的协议
UDP报头只有8字节
简介:
传输数据之前源端和终端不建立连接,当它想传送时就简单地去抓取来自应用程序的数据,并尽可能快的把它扔到网络上
在发送端,UDP传送数据的速度仅仅是受应用程序生成数据的速度、计算机的能力和传输带宽的限制
在接收端,UDP把每个消息段放在队列中,应用程序每次从队列中读一个消息段
由于传输数据不建立连接,因此也就不需要维护连接状态,包括收发状态等,因此一台服务机可同时向多个客户机传输相同的消息
UDP信息包的标题很短,只有8个字节,相对于TCP的20个字节信息包的额外开销很小
吞吐量不受拥挤控制算法的调节,只受应用软件生成数据的速率、传输带宽、源端和终端主机性能的限制
UDP使用尽最大努力交付,即不保证可靠交付,因此主机不需要维持复杂的链接状态表。
UDP是面向报文的。发送方的UDP对应用程序交下来的报文,在添加首部后就向下交付给IP层。既不拆分,也不合并,而是保留这些报文的边界,因此,应用程序需要选择合适的报文大小。
使用“ping”命令来测试两台主机之间TCP/IP通信是否正常,其实“ping”命令的原理就是向对方主机发送UDP数据包,然后对方主机确认收到数据包,如果数据包是否到达的消息及时反馈回来,那么网络就是通的。
优点:
传输速率快 1、传输数据前,不需要像TCP一样建立连接 2、传输数据时,没有确认、窗口、重传、拥塞控制等机制
较安全 1、由于没有了TCP的一些机制,被攻击者利用的漏洞就少了
缺点:
不可靠,不稳定 1、由于没有了TCP的机制,在数据传输时如果网络不好,很可能丢包
用UDP协议通讯时怎样得知目标机是否获得了数据包
仿造TCP的做法,每发一个UDP包,都在里面加一个SEQ序号,接收方收到包后,将SEQ序号回复给发送方。如果发送方在指定时间以内没有收到回应,说明丢包了。
TCP与UDP的区别
TCP面向有链接的通信服务 | UDP面向无连接的通信服务 |
TCP提供可靠的通信传输 | UDP不可靠,会丢包 |
TCP保证数据顺序 | UDP不保证 |
TCP数据无边界 | UDP有边界 |
TCP速度快 | UDP速度慢 |
TCP面向字节流 | UDP面向报文 |
TCP一对一 | UDP可以一对一,一对多 |
TCP报头至少20字节 | UDP报头8字节 |
TCP有流量控制,拥塞控制 | UDP没有 |
TCP需要三次握手
TCP有拥塞控制,控制流量等机制
为什么TCP比UDP可靠
TCP是面向有连接的,建立连接之后才发送数据;而UDP则不管对方存不存在都会发送数据。
TCP有确认机制,接收端每收到一个正确包都会回应给发送端。超时或者数据包不完整的话发送端会重传。UDP没有。因此可能丢包。
什么时候使用TCP
当对网络通讯质量有要求的时候,比如:整个数据要准确无误的传递给对方,这往往用于一些要求可靠的应用,比如HTTP、HTTPS、FTP等传输文件的协议,POP、SMTP等邮件传输的协议。 在日常生活中,常见使用TCP协议的应用如下: 浏览器,用的HTTP FlashFXP,用的FTP Outlook,用的POP、SMTP Putty,用的Telnet、SSH QQ文件传输
什么时候应该使用UDP:
当对网络通讯质量要求不高的时候,要求网络通讯速度能尽量的快,这时就可以使用UDP。 比如,日常生活中,常见使用UDP协议的应用如下: QQ语音 QQ视频 TFTP
TCP无边界,UDP有边界
TCP无边界
客户端分多次发送数据给服务器,若服务器的缓冲区够大,那么服务器端会在客户端发送完之后一次性接收过来,所以是无边界的;
UDP有边界
客户端每发送一次,服务器端就会接收一次,也就是说发送多少次就会接收多少次,因此是有边界的。
2.Http协议
默认端口:80Http协议的主要特点
支持客户/服务器模式简单快速:客户向服务端请求服务时,只需传送请求方式和路径。
灵活:允许传输任意类型的数据对象。由Content-Type加以标记。
无连接:每次响应一个请求,响应完成以后就断开连接。
无状态:服务器不保存浏览器的任何信息。每次提交的请求之间没有关联。
非持续性和持续性
HTTP1.0默认非持续性;HTTP1.1默认持续性持续性
浏览器和服务器建立TCP连接后,可以请求多个对象非持续性
浏览器和服务器建立TCP连接后,只能请求一个对象非流水线和流水线
类似于组成里面的流水操作流水线:不必等到收到服务器的回应就发送下一个报文。
非流水线:发出一个报文,等到响应,再发下一个报文。类似TCP。
POST和GET的区别
Post一般用于更新或者添加资源信息 | Get一般用于查询操作,而且应该是安全和幂等的 |
---|---|
Post更加安全 | Get会把请求的信息放到URL的后面 |
Post传输量一般无大小限制 | Get不能大于2KB |
Post执行效率低 | Get执行效率略高 |
为什么POST效率低,Get效率高
Get将参数拼成URL,放到header消息头里传递Post直接以键值对的形式放到消息体中传递。
但两者的效率差距很小很小
Https
端口号是443是由SSL+Http协议构建的可进行加密传输、身份认证的网络协议。
3.Socket
使用TCP
客户端Socket socket = new Socket("ip", 端口); InputStream is = socket.getInputStream(); DataInputStream dis = new DataInputStream(is); OutputStream os = socket.getOutputStream(); DataInputStream dos = new DataOutputStream(os);
服务器端
ServerSocket serverSocket = new ServerSocket(端口); Socket socket = serverSocket.accept(); //获取流的方式与客户端一样
读取输入流
byte[] buffer = new byte[1024]; do{ int count = is.read(buffer); if(count <= 0){ break; } else{ // 对buffer保存或者做些其他操作 } } while(true);
使用UDP
客户端和服务器端一样的DatagramSocket socket = new DatagramSocket(端口); InetAddress serverAddress = InetAddress.getbyName("ip"); //发送 DatagramPackage packet = new DatagramPacket(buffer, length, host, port); socket.send(packet); //接收 byte[] buf = new byte[1024]; DatagramPacket packet = new DatagramPacket(buf, 1024); Socket.receive(packet);
特别感谢 GeniusVJR 整理:
相关文章推荐
- java-模拟tomcat服务器
- Linux socket 初步
- RPC failed; result=22, HTTP code = 411
- HTTP Header 属性列表
- nginx中http核心模块的配置指令2
- nginx中http核心模块的配置指令3
- nginx中http核心模块的配置指令4
- nginx中http的fastcgi模块的配置指令1
- java socket 注意的地方
- java socket 注意的地方
- 如何在 Linux 中快速地通过 HTTP 提供文件访问服务
- 深入HTTP head的使用详解
- Ruby程序中发送基于HTTP协议的请求的简单示例
- ASP 中使用 HTTP 协议发送参数详解
- C#基于UDP实现的P2P语音聊天工具
- C#基于socket模拟http请求的方法