长连接和短链接的区别
TCP/IP
TCP/IP是个协议组,可分为三个层次:⽹络层、传输层和应⽤层。
在⽹络层有IP协议、ICMP协议、ARP协议、RARP协议和BOOTP协议。
在传输层中有TCP协议与UDP协议。
在应⽤层有:TCP包括FTP、HTTP、TELNET、SMTP等协议
UDP包括DNS、TFTP等协议
短连接
连接->传输数据->关闭连接
tcp ip协议中HTTP是⽆状态的,浏览器和服务器每进⾏⼀次HTTP操作,就建⽴⼀次连接,但任务结束就中断连接。
也可以这样说:短连接是指SOCKET连接后发送后接收完数据后马上断开连接。
长连接
连接->传输数据->保持连接 -> 传输数据-> 。。。 ->关闭连接。
长连接指建⽴SOCKET连接后不管是否使⽤都保持连接,但安全性较差。
http的长连接
HTTP也可以建⽴长连接的,使⽤Connection:keep-alive,HTTP 1.1默认进⾏持久连接。HTTP1.1和HTTP1.0相⽐较⽽⾔,最⼤的区别就是增加了持久连接⽀持(貌似最新的 http1.0 可以显⽰的指定 keep-alive),但还是⽆状态的,或者说是不可以信任的。
什么时候⽤长连接,短连接?
长连接多⽤于操作频繁,点对点的通讯,⽽且连接数不能太多情况,。每个TCP连接都需要三步握⼿,这需要时间,如果每个操作都是先连接,再操作的话那么处理速度会降低很多,所以每个操作完后都不断开,次处理时直接发送数据包就OK了,不⽤建⽴TCP连接。例如:数据库的连接⽤长连接,如果⽤短连接频繁的通信会造成socket错误,⽽且频繁的socket 创建也是对资源的浪费。
⽽像WEB⽹站的http服务⼀般都⽤短链接,因为长连接对于服务端来说会耗费⼀定的资源,⽽像WEB⽹
站这么频繁的成千上万甚⾄上亿客户端的连接⽤短连接会更省⼀些资源,如果⽤长连接,⽽且同时有成千上万的⽤户,如果每个⽤户都占⽤⼀个连接的话,那可想⽽知吧。所以并发量⼤,但每个⽤户⽆需频繁操作情况下需⽤短连好。
总之,长连接和短连接的选择要视情况⽽定。
发送接收⽅式
1、异步
报⽂发送和接收是分开的,相互独⽴的,互不影响。这种⽅式⼜分两种情况:
(1)异步双⼯:接收和发送在同⼀个程序中,由两个不同的⼦进程分别负责发送和接收
(2)异步单⼯:接收和发送是⽤两个不同的程序来完成。
2、同步
报⽂发送和接收是同步进⾏,既报⽂发送后等待接收返回报⽂。同步⽅式⼀般需要考虑超时问题,即报⽂发出去后不能⽆限等待,需要设定超时时间,超过该时间发送⽅不再等待读返回报⽂,直接通知超时返回。
在长连接中⼀般是没有条件能够判断读写什么时候结束,所以必须要加长度报⽂头。读函数先是读取报⽂头的长度,再根据这个长度去读相应长度的报⽂。
Socket是什么
Socket是应⽤层与TCP/IP协议族通信的中间软件抽象层,它是⼀组接⼝。在设计模式中,Socket其实就是⼀个门⾯模式,它把复杂的TCP/IP协议族隐藏在Socket接⼝后⾯,对⽤户来说,⼀组简单的接⼝就是全部,让Socket去组织数据,以符合指定的协议。
主机 A 的应⽤程序要能和主机 B 的应⽤程序通信,必须通过 Socket 建⽴连接,⽽建⽴ Socket 连接必须需要底层 TCP/IP 协议来建⽴ TCP 连接。建⽴ TCP 连接需要底层 IP 协议来寻址⽹络中的主机。我们知道⽹络层使⽤的 IP 协议可以帮助我们根据 IP 地址来到⽬标主机,但是⼀台主机上可能运⾏着多个应⽤程序,如何才能与指定的应⽤程序通信就要通过 TCP 或 UPD 的地址也就是端⼝号来指定。这样就可以通过⼀个 Socket 实例唯⼀代表⼀个主机上的⼀个应⽤程序的通信链路了。
建⽴通信链路
当客户端要与服务端通信,客户端⾸先要创建⼀个 Socket 实例,将为这个 Socket 实例分配⼀个没有被使⽤的本地端⼝号,并创建⼀个包含本地和远程地址和端⼝号的套接字,这个数据结构将⼀直保存在系
统中直到这个连接关闭。在创建 Socket 实例的构造函数正确返回之前,将要进⾏ TCP 的三次握⼿协议,TCP 握⼿协议完成后,Socket 实例对象将创建完成,否则将抛出 IOException 错误。
与之对应的服务端将创建⼀个 ServerSocket 实例,ServerSocket 创建⽐较简单只要指定的端⼝号没有被占⽤,⼀般实例创建都会成功,同时操作系统也会为 ServerSocket 实例创建⼀个底层数据结构,这个数据结构中包含指定监听的端⼝号和包含监听地址的通配符,通常情况下都是“*”即监听所有地址。之后当调⽤ accept() ⽅法时,将进⼊阻塞状态,等待客户端的请求。当⼀个新的请求到来时,将为这个连接创建⼀个新的套接字数据结构,该套接字数据的信息包含的地址和端⼝信息正是请求源地址和端⼝。这个新创建的数据结构将会关联到ServerSocket 实例的⼀个未完成的连接数据结构列表中,注意这时服务端与之对应的 Socket 实例并没有完成创建,⽽要等到与客户端的三次握⼿完成后,这个服务端的 Socket 实例才会返回,并将这个 Socket 实例对应的数据结构从未完成列表中移到已完成列表中。所以ServerSocket 所关联的列表中每个数据结构,都代表与⼀个客户端的建⽴的 TCP 连接。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论