【javatcp-ipsocket】深入剖析socket——数据传输的底层实现-编程开发技术

【javatcp-ipsocket】深入剖析socket——数据传输的底层实现-编程开发技术

ID:30786765

大小:166.63 KB

页数:5页

时间:2019-01-03

【javatcp-ipsocket】深入剖析socket——数据传输的底层实现-编程开发技术_第1页
【javatcp-ipsocket】深入剖析socket——数据传输的底层实现-编程开发技术_第2页
【javatcp-ipsocket】深入剖析socket——数据传输的底层实现-编程开发技术_第3页
【javatcp-ipsocket】深入剖析socket——数据传输的底层实现-编程开发技术_第4页
【javatcp-ipsocket】深入剖析socket——数据传输的底层实现-编程开发技术_第5页
资源描述:

《【javatcp-ipsocket】深入剖析socket——数据传输的底层实现-编程开发技术》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库

1、[JavaTCP/IPSocket]深入剖析socket——数据传输的底层实现・编程开发技术[JavaTCP/IPSocket]深入剖析socket数据传输的底层实现原文出处:兰亭风雨底层数据结构如果不理解套接字的具体实现所关联的数据结构和底层协议的工作细节,就很难抓住网络编程的精妙之处,对于TCP套接字來说,更是如此。套接字所关联的底层的数据结构集包含了特定Socket实例所关联的信息。比附,套接字结构除其他信息外还包含:1、该套接字所关联的本地和远程互联网地址和端口号。2、一个FIFO(FirstImFirstOut)队列,用于存放接收到的等待分配的数据,以及一个用于存放等待传输的数

2、据的队列。3、对于TCP套接字,还包含了与打开和关闭TCP握手相关的额定协议状态信息。►SendQ]ClosedlocalportlocalIPremoteportremoteIPRecvQ字结构图6」套接字关联的数据结构了解这些数据结构,以及底层I办议如何对英进行影响是非常冇用的,因为它们控制了各种Socket对彖行为的各个方面。例如,由于TCP提供了一种可信赖的字节流服务,任何写入Socket和OutpitStream的数据副木都必须保留,直到连接的另一端将这些数据成功接收。向输出流写数据并不意味着数据实际上已经被发送它们只是被复制到了本地缓冲区,就算在Socket的OutputSt

3、rcam上进行flush()操作,也不能保证数据能够立即发送到信道。此外,字节流服务的自身属性决定了其无法保留输入流中消息的边界信息。数据传输的底层实现在使用TCP套接字时,需要记住的最重要的一点是:不能假设在连接的一端将数据写入输出流和在另一端从输入流读出数据之间有任何的一致性。尤其是在发送端由单个输出流的write()方法传输的数据,可能会通过另一端的多个输入流的read()方法获取,而一个read()方法可能会返冋多个write()方法传输的数据。一般來讲,我们可以认为TCP连接上发送的所冇字节序列在某一瞬间被分成了3个FIFO队列:1、SendQ:在发送端底层实现屮缓存的字节,这

4、些字节已经写入输出流,但还没在接收端成功接收。它占用大约37KB内存。2、RecvQ:在接收端底层实现屮缓存的字节,这些字节等待分配到接收程序——即从输入流中读取。它占用大约25KB内存。3、Delivered:接收者从输入流已经读取到的字节。当我们调用Outputstream的write()方法时,将向SendQ追加字节。TCP协议负责将字节按顺序从SendQ移动到RecvQ。这里有重要的一点需要明确:这个转移过程无法由用户程序控制或直接观察到,并且在块屮发生,这些块的大小在一定程度上独立于传递给write()方法的缓冲区大小。接收程序从Socket的InputStrcam读取数据时,

5、字节就从RecvQ移动到Delivered屮,而传移的块的大小依赖丁RecvQ中的数据量和传递给read()方法的缓冲区的大小。示例分析为了展示这种情况,考虑如卜•程序:byte[]bufferO霉newbyteflOOO];byte()bufferl■newbyte(2000];byte(]buffer2«newbyte(5000);■♦•Sockets-newSockettdestAddr.deatPort);OatputStreanout=s.getOQtputStre«i();・•・out.write(bufferO);out.vrite(bufferl);•••out.writ

6、e(buffer2);•・•s.closeO;其中,圆点代表了设置缓冲区数据的代码,但不包含对out.write()方法的调用。这个TCP连接向接收端传输8000字节,在连接的接收端,这8000字节的分组方式取决于连接两端的out.write()方法和in.read()方法的调用时间差,以及提供给in.read()方法的缓冲区的大小。下图展示了3次调用out.write()方法后,另一端调用in.read()方法前,以上3个队列的一种可能状态。不同的阴影效果分别代表了上文屮3次调用write()方法传输的不同数据:发送实现楼收实现接收程序SendQ6500宇节第一次写操作(1000字节)

7、TCP协议1500字节日第二次写操作(2000字节)第三次用操作(S000字』图6・23次调用writeo^法后3个队列的状态现在假设接收者调用read()方法时使用的缓冲区数组大小为2000字节,read()调用则将把RecvQ中的1500字节全部移动到数组中,返回值为1500。注意,这些数据中包含了第一次和第二次调用write()方法时传输的字节,再过一段时间,当TCP连接传完更多数据后,这三部分的状态可能如下图所示:500字节

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。