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

 


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

csharp tcp/ip连接发送消息

public Form6() { client = new TcpClient(); InitializeComponent(); } const int BufferSize = 81...
  • dang_wang
  • dang_wang
  • 2012年02月17日 08:32
  • 1518

《TCP/IP详解卷2:实现》笔记--TCP的输入

当收到的数据报的协议字段指明这是一个TCP报文段时,ipintr(通过协议协议转换表中的pr_input函数)会调用tcp_input 进行处理,tcp_inut在软件中断一级执行。 函数非常长,我们...
  • TODD911
  • TODD911
  • 2015年01月06日 22:45
  • 1767

《TCP/IP详解卷2:实现》笔记--插口层

插口层的主要功能是将进程发送的与协议有关的请求映射到产生插口时指定的与协议有关的实现。下图说明了进程中的插口 接口与内核中的协议实现之间的层次关系。 1.socket结构 插口代表一条通信链路...
  • TODD911
  • TODD911
  • 2014年09月08日 11:31
  • 2258

《TCP/IP详解卷2:实现》笔记--IP选项处理

IP输入函数(ipintr)将在验证分组格式(检验和,长度等)之后,确定分组是否到达目的地之前,对选项进行处理。这表明分组所 遇到的每个路由器以及最终的目的主机都对要分组的选项进行处理。 IP分组内可...
  • TODD911
  • TODD911
  • 2014年07月22日 14:11
  • 2475

TCP/IP Modbus消息体格式

Modbus协议有两种不同的类型:基于串行链路的Modbus和基于TCP/IP的Modbus。 TCP/IP Modbus使用以太网来承载Modbus消息体,Modbus消息体可以作为应用层数据被封装...
  • a1187006940
  • a1187006940
  • 2016年06月03日 10:35
  • 1524

《TCP/IP详解卷一:协议》学习笔记三

一、引言 1、IP是TCP/IP协议族中最为核心的协议。所有的TCP、UDP、ICMP及IGMP数据都以IP数据报格式传输。 2、IP提供不可靠以及无连接的数据包服务  1)、不可靠的意思是它不能...
  • Explorer_day
  • Explorer_day
  • 2017年03月30日 21:32
  • 672

TCP/IP入门--TCP/IP的概念

TCP/IP是一类协议系统,是一套支持网络通信的协议集。 1、网络和协议     网络是多个计算机或类似计算机的设备之间通过常用传输介质进行通信的集合。     网络协议是一套通用的规则,用来帮...
  • u013015642
  • u013015642
  • 2016年01月03日 16:04
  • 680

《TCP/IP详解,卷2:实现》读书笔记-协议控制块

前面讲了很多的铺垫知识,现在终于开始要讲到TCP和UDP了,不过别急,之前会先介绍一个基本和重要的概念:协议控制块。 协议层使用协议控制块存放各UDP和TCP插口所要求的多个信息片。Internet协...
  • stevenmou
  • stevenmou
  • 2007年04月19日 20:04
  • 3071

TCP/IP详解 卷1,2,3详解

大家知道,TCP/IP已成为计算机网络的事实上的标准。在关于TCP/IP的论著中,最有影响的就是两部著作。一部是Douglas E. Comer的《用TCP/IP进行网际互连》,而另一部就是Steve...
  • lg2lh
  • lg2lh
  • 2014年06月25日 11:39
  • 1279

C# TCP/IP 连接实现数据收发 Demo (Visual Studio)

添加using指令集: using System.Net.Sockets; using System.Threading; using System.Net; 添加定义(IP地址 IP接口 berke...
  • lxk7280
  • lxk7280
  • 2015年11月08日 12:25
  • 11033
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:TCP/IP (二) TCP消息的发送
举报原因:
原因补充:

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