socket简介
socket是一套不同于主机间通信的API,它工作在我们的TCP/IP 协议栈之上,它的应用场景也非常多:比如浏览器、手机应用,用于服务器管理的SSH客户端,全都是基于socket实现的。
要通过socket与不同主机之间建立通信,我们需要指定主机的IP地址和端口号,
【IP地址用于唯一标识你的网络设备,那为什么还要额外的指定一个端口号呢?】
因为如果没端口号,操作层系统就没有办法区分数据到底应该发送到哪一个应用上:
因此端口主要用于区分主机上的不同应用。
通过socket我们可以建立一条用于不同主机,不同应用之间的数据通道。一个形象的比喻就是将一条数据线链接在不同应用的插槽上,这也是socket这个名称的由来
(我在网上所搜socket的中文翻译成套接字到底是什么鬼?)
被我们所熟熟知的socket有两种类型,TCP和UDP
可以把socket想象成打电话,电话号码就是IP地址,打电话找谁就是端口号,协议就像是你说的是方言还是普通话,tcp就像是你每说一句话,对方都要说一声:"清楚明白"!udp就是,什么都不管,只管说就行了,也不管对方是否明白!tcp连接过程,就像是,打电话之后先说:"喂,你是xxx吗?",对方回答:"我是xxx!",然后你说:"好的,下面开始通话!"
TCP协议是非常可靠的,他的底层会自动检测并回传丢失的数据包,(也就是三次挥手,四次握手)因此对于调用者来说,你发送的数据对方一定会接收到,其次发送和接收到的数据顺序是完全一致的
TCP发送顺序是如何保证一致的?
TCP协议将数据切分成为多个小片段,每个小片段的头部(header)和数据(payload)组成,为了确保抵达数据的顺序,TCP协议给每个片段的头部(header)都分配了序列号,方便后期按照序列号排序。
当某个片段按照顺序发送后,发送方会将已发送的数据片段暂时保存到缓冲区,并为每个已发送的数据设置一个时间区间。
当接收方收到正确的符合顺序的片段后,会优先对数据片段做完整检验,如确认无误,再把数据片段交给上层协议,并发送一个TCP片段反馈信息来告知(ACK acknowledge)发送方:我已经接收到这个片段了。这个TCP片段被称为ACK回复。打个比方:ACK回复发送的第一个片段序列号为T,其对应的ACK回复则为T+1,也就是接收方要接收的下一个发送片段的序列号。
假设在规定时间内发送方收到接收方的TCP片反馈信息,则发送方可以释放缓冲区的数据,如若超时未收到应答,发送方则重新发送数据,直到收到应答,或者重发数据次数到达上限为止。
另外需要注意的是:TCP要求收发数据的双方扮演不同的角色:服务器和客户端。服务器会被动等待客户端的连接,他自己不会主动发起请求
UDP 用户报文协议:
UDP以报文为单位来收发数据,UDP不会自动回传丢失的数据包,因此不保证数据就一定能被对方接收到:
但是同时也正是缺少了这些检查的准备工作,所以UDP通常具有更低的延迟并占用更少的系统资源。它更加适合用于视频语音通话 这种实时性较高的应用场景。