两种套接字类型

流格式套接字(SOCK_STREAM)

面向连接的套接字

特征:

  • 数据在传输过程中不会消失;

  • 数据是按照顺序传输的;

  • 数据的发送和接收不是同步的(也称“不存在数据边界”)。

高质量的数据传输的原因是使用了 TCP 协议(The Transmission Control Protocol,传输控制协议),TCP 协议会控制你的数据按照顺序到达并且没有错误

IP(Internet Protocol,网络协议)用来控制数据如何从源头到达目的地,也就是常说的“路由”。

流格式套接字的内部有一个缓冲区(也就是字符数组) 接收端在收到数据后并不一定立即读取,只要数据不超过缓冲区的容量,接收端有可能在缓冲区被填满以后一次性地读取,也可能分成好几次读取。

例子::浏览器所使用的 http 协议就基于面向连接的套接字,因为必须要确保数据准确无误,否则加载的 HTML 将无法解析

数据报格式套接字(SOCK_DGRAM)

“无连接的套接字”

计算机只管传输数据,不作数据校验,如果数据在传输中损坏,或者没有到达另一台计算机,是没有办法补救的。

也就是说,数据错了就错了,无法重传。

特征:

  • 强调快速传输而非传输顺序;

  • 传输的数据可能丢失也可能损毁;

  • 限制每次传输的数据大小;

  • 数据的发送和接收是同步的(有的教程也称“存在数据边界”)。

数据的发送和接收是同步的,也就是接收次数应该和发送次数相同。

数据报套接字是一种不可靠的、不按顺序传递的、以追求速度为目的的套接字。

它不使用 TCP 协议,而是使用 UDP 协议(User Datagram Protocol,用户数据报协议)。

SOCK_DGRAM 没有想象中的糟糕,不会频繁的丢失数据,数据错误只是小概率事件。

例子: QQ 视频聊天和语音聊天就使用 SOCK_DGRAM 来传输数据,因为首先要保证通信的效率,尽量减小延迟,而数据的正确性是次要的,即使丢失很小的一部分数据,视频和音频也可以正常解析,最多出现噪点或杂音,不会对通信质量有实质的影响。

 

如果数据包发出去了,一段时间以后仍然没有得到接收端的回应,那么发送端会重新再发送一次,直到得到接收端的回应。

预先建立好的路径被称为“虚电路”,就是一条虚拟的通信电路

除了源端口和目的端口,面向连接的套接字还包括序号、确认信号、数据偏移、控制标志(通常说的 URG、ACK、PSH、RST、SYN、FIN)、窗口、校验和、紧急指针、选项等信息;而无连接的套接字则只包含长度和校验和信息。

有连接的数据包比无连接大很多,这意味着更大的负载和更大的带宽。

 

  • 无连接套接字传输效率高,但是不可靠,有丢失数据包、捣乱数据的风险;

  • 有连接套接字非常可靠,万无一失,但是传输效率低,耗费资源多。

两种套接字的特点决定了它们的应用场景,有些服务对可靠性要求比较高,必须数据包能够完整无误地送达,那就得选择有连接的套接字(TCP 服务),比如 HTTP、FTP 等;而另一些服务,并不需要那么高的可靠性,效率和实时才是它们所关心的,那就可以选择无连接的套接字(UDP 服务),比如 DNS、即时聊天工具

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值