socket应用编程接口(API)
socket定义
应用层
传输层
网络层
数据链路层
物理层
sockt 套接字 是在应用层和传输层中间的
WEB /RPC/中间件编程
常见的应用编程接口(API) 有
1、Berkeley UNIX 操作系统定义了一种API,称为套接字接口(socket interface),检测套接字(socket)
2、微软公司在其操作系统中采用了套接字接口API,形成了一个稍微不同的API,并称之为Windows socket interface ,WINSOCK
3、AT&T 为其unix系统V定义了一种API,简称为(Transport Layer Inteface)
一)sockt套接字创建
二)socket 面向TCP /IP的服务类型
TCP 可靠、面向连接(有三次握手和四次挥手)、字节流传输、点对点
UDP 不可靠,无连接、数据报传输
三)soeckt套接字关闭
四)socket的write和read
write方法
调用outputstream方法的write写输出流的时候,该线程会被阻塞,直到所有要发送的字节流全部写入完毕,或者发生异常。通过TCP/IP相关的知识,当消息接收方处理缓慢的时候,将不能及时的从TCP缓冲区读取数据,这将会导致发送方的TCP的windows size不断减少(滑动窗口机制),直至为0,双方处于Keep-Alive 状态,消息发送方将不能在向TCP 缓冲区写入消息,这个时候如果采用的是同步阻塞I/O,write操作将会无限期阻塞,直到TCP 的windows size 大于0 或者发生I/O异常,因为当windows size =0的时候,发送方会定时请求接收方,看这时候是否windows size 已经大于0
TCP 的传输效率
应用进程通过socket套接字把数据传送到TCP的发送缓存中后,剩下的发送任务就是由TCP来控制了,可以用不同的机制来控制TCP报文段的发送时机。
1、维护一个变量,它等于最大报文段长度MSS,只要放入到缓存中的数据达到MSS 字节时,就组装成一个TCP 报文段发送出去
2、第二中机制是由发送方的应用进程指明要求发送的报文段,即TCP支持的推送操作
3、就是发送方的一个计时器期限到了,这时就把当前已有的缓存数据装入报文段(但是长度不能超过MSS)发送出去
粘包和拆包
粘包和拆包定义
通过TCP 编程,无论是服务端还是客户端,当我们读取或者发送消息的时候,都需要考虑TCP底层的粘包和拆包机制,如果是应用层就无需考虑了,通过应用层协议判断改包是否是完整的包。
TCP是个“流”协议,所谓流就是没有界限的一串数据。大家可以想想河里的流水,他们是连成一片的,其中没有分界线,TCP 底层并不了解上层业务数据的具体含义,它会根据TCP缓冲区 的实际情况进行"包的划分",所以在业务上认为,一个完整的包可能会被TCP 拆分成多个包进行发送,也可能会把多个小包封装层一个大的数据包发送,这就是所谓的TCP的粘包和拆包问题。
TCP 粘包和拆包发生的原因
问题产生的原因有三个,分别如下
1、应用程序write写入的字节大小大于套接口发送缓冲区大小
2、进行MSS 大小的TCP 分段
3、以太网帧payload大于MTU进行IP 分片
图解如下所以