TCP/IP (二) TCP消息的发送

原创 2015年11月20日 19:41:41

上一篇文章一样,带着一些问题来思考TCP的消息发送

 

1.已经建立好的tcp连接,先发送数据包data1,再发送数据包data2,数据包data2会不会比数据包先到达?

2.发送send函数和write函数有什么区别?调用发送函数后内核发生了什么事情?

3.发送方法成功返回时,是否能保证数据已经发送出去,是否能保证对端一定收到?

4.套接字为阻塞或者非阻塞时,发送方法做的事情有何不同?


在发送层面,TCP内核做了哪些操作,借用陶大师的图:



来看看数据发送的步骤:

1.调用send函数

2.数据复制至内核态

3.假设缓冲区满了,非阻塞模式send函数会返回errno ==EAGAIN,意味着数据尚未发送请重试,阻塞模式send函数则会等待

4.send函数返回成功,可能是部分发送成功,可能是全部发送成功,并不意味着数据已经发送到网络上,也不意味着对端收到数据了,只是说明内核试图把数据发送至对端。TCP的可靠性是要求连接对端在接收到数据后发送ACK进行确认,告诉发送端已经接收到了多少字节的数据。所以确保数据的发送成功,是依赖于ACK的抵达,才能确保数据的发送成功。

 

内核中为这个TCP连接分配的内核缓存是有限的,关于缓冲区的大小设置,并不是越大越好也不是越小越好,可以根据业务的特性进行调优。

 

阻塞模式下的send函数并没有超时参数,通过setsockopt()函数设置超时

 

已经建立好的tcp连接,先发送数据包data1,再发送数据包data2,数据包data2会不会比数据包先到达?

TCP并没有数据包的概念,是完全流式的,它会开辟一个缓冲区,每隔一段时间就会发送出去,由于数据在链路层的分片,data1的数据是有可能比data2先达到对端的接收缓冲区,但是如果对端调用接收函数时,是不可能发生先收到data2再收到data1,在下一篇TCP消息的接收将会说明这个问题。

 

send函数和write函数的区别,我们来看看男人是怎么说的,The only difference between send() and write(2) is the presence offlags.  With a zero flags argument,send() is equivalent to write(2).

 

多线程并发对同一个socket连接进行发送数据操作时,是否要加锁?

发送首先会对缓存加锁.通过加锁确保多个进程按序互斥访问插口缓存.(tcp/ip 卷2, page 394,395),也就是说内核会对缓冲区加锁,但是我们要考虑一个问题,当缓冲区不足以装下所有的并发发送数据时,那么数据就可能出现乱序,所有并不建议并发对同一个连接操作。


参考资料:《tcp/ip详解卷1》

参考文章:http://blog.csdn.net/russell_tao/article/details/9370109

 


版权声明:本文为博主原创文章,转载请注明出处。

高性能网络编程(2)----TCP消息的发送 (B)

在上一篇中,我们已经建立好的TCP连接,对应着操作系统分配的1个套接字。操作TCP协议发送数据时,面对的是数据流。通常调用诸如send或者write方法来发送数据到另一台主机,那么,调用这样的方法时,...

tcp客户端和服务端互发消息

tcp客户端和服务端互发消息
  • hoho_12
  • hoho_12
  • 2016年07月30日 12:41
  • 1374

TCP协议发送和接受文本消息

引用总结: 对于TCP协议我不想说太多东西,这属于大学课程,又涉及计算机科学,而我不是“学院派”,对于这部分内容,我觉得作为开发人员, 只需要掌握与程序相关的概念就可以了,不需要做太艰深的研究。 我们...
  • wfx7414
  • wfx7414
  • 2016年02月02日 11:12
  • 1481

TCP/IP (四) TCP连接的关闭

TCP连接的关闭有两个方法close和shutdown,这篇文章将尽量精简的说明它们分别做了些什么。 为方便阅读,我们可以带着以下5个问题来阅读本文: 1、当socket被多进程或者多线程共享时,...

[转]debugdiag调试工具使用汇总

Debugdiag可以用来追踪windows下程序崩溃,卡死(包括死锁),断言等一些疑难问题的原因,对检测程序内存泄漏也有很好的帮助,相对于另外一款windbg调试器来说,是程序员的轻量级武器。 本文...

TCP/IP五层模型消息解/封装仿真

消息封/解装仿真功能要求按照TCP五层模型仿真消息在两台主机之间的通信过程。 1. 在发送端模拟数据从高层到低层的封装过程,在接收端模拟数据从低层到高层的解封装过程。 2. 按照每层的功能对数据填...

Java-TCP/IP编程-03 消息群发功能

Client端 package com.qf.demo10; import java.awt.BorderLayout; import java.awt.Color; import j...

【Java TCP/IP Soket】— 消息边界的问题解决

【Java TCP/IP Soket】— 关于消息边界问题,在TCP套接字处理接收消息中尤为重要,所以大家一定要学会解决它!...

[分布式java]基于JavaAPI实现消息方式的系统间通信:TCP/IP+BIO

最近在读《分布式Java应用基础与实践》,写代码加深一下理解。 基于JavaAPI实现消息方式的系统间通信:TCP/IP+BIO,TCP/IP由Socket实现,BIO即阻塞式的I/O,这个阻塞具体体...
  • mjjmjc
  • mjjmjc
  • 2015年08月22日 00:45
  • 485

[分布式java]基于JavaAPI实现消息方式的系统间通信:TCP/IP+NIO

TCP/IP+BIO的限制: 1、线程池大小限制。 2、为每个连接建立线程,增加系统开销。 3、线程很难保证某些连接的优先级。 4、线程很难保证数据的一致性和高效性。 Java中的TCP/IP+B...
  • mjjmjc
  • mjjmjc
  • 2015年08月27日 12:37
  • 636
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:TCP/IP (二) TCP消息的发送
举报原因:
原因补充:

(最多只允许输入30个字)