1.TCP是一个流协议.

TCP跟UDP不一样的是,TCP发送过去的东西是stream,也就是说第一次发送的跟第二次发送的数据包可能会粘在一起,即所谓的粘包问题
 
解决粘包问题一般有两个方法
1.在两次发包的间隔sleep一段时间,很不稳定的方法,因为接收方可能会阻塞,导致两次发送的包还是粘在一起了
 
2.在每一个包添加包头,现在比较常用的方法,在每个发送的包前面添加包的长度,发送的包类似于下面的结构体:
struct pack
{
     size_t len;
     char *data;
};
 
然后在接收方处理进行分包
 
我自己想的一个方法,是为了减少拆包和分包的繁琐的方法,也可以减少需要memcpy的
 
改成这样的方式:
发送方首先发送一个包的长度,然后再发送包的数据内容,因为TCP是保证包的顺序到达的,所以接收方首先收到的第一个数据一定是一个下次要接收的包的长度,然后再开始接收包的内容
 
当然这种方法可以简化拆包和组包的繁琐,但是也会导致多次系统调用
在发送方,现在我们多了一次write的系统的调用,少了一次memcpy的调用
在接收方,在比较"坏的情况"下,我们需要两次read才能把数据读出来,为什么说"坏的情况",因为大部分书有说TCP只有在缓冲区满的时候才会发送,虽然我们可以设置强制发送,但是我自己测试了下,这个并不是一定的,可能4个字节TCP也是直接发送出去了,如果接收方立即响应的话,接收方会先read到数据的长度,然后再read到数据
 
所以这种方法可以减少组包和拆包的繁琐以及memcpy,但因为多次的系统调用,所以不见得是比较好的方法
 
2.TCP的性能不一定比UDP差
要了解这个首先要了解三个知识:
1.MTU,即Maximum Transmission Unit,每次最大传输单元,就是在发送数据的时候,每一次发送给对方的最大数据包大小,如果超过这个大小,数据包会被分割成小的数据包
 
2.TCP在发送的时候,并不是立即发送,而是会等待一些特定的条件(也可以强制立即发送),比如隔断时间发送,包到一定的大小才会发送,也就说我们在write多个数据包以后,TCP可能会把包组合在一起发送,这个就是会导致粘包的一个原因
 
3.UDP是立即发送的,不会对包进行额外的处理
 
这样的话就会有这么一种情况:假如我们的MTU是1500,而我们发送的数据包每次是100 byte,那么UDP分成了15次发送,而TCP可能会让数据的大小到了一个的临界点后才发送,这样就少了很多次的系统的调用,在效率上自然比UDP高
 
书上是这样说的,但是因为TCP的一些特性,TCP需要双方去维护,在发送包的时候和接收包的时候都需要额外的处理,所以不见得这个理论是正确的,但我觉得这种东西还是要自己去测试才比较好看见区别,我自己测试UDP的性能只比TCP高一点点,并没有什么显著的区别,当然我测试的是单个连接的,有一些情况就比较复杂,比如有2000+条TCP连接,可能操作系统维护起来会比较吃力
 
3.TCP并非是完全可靠的
TCP为我们做了很多的工作,让我们保证数据包完整地送到接收方,但是也仅仅是能保证到数据包到达了对方的电脑,但是无法保证数据包到达对方的应用程序并被处理,如果接收方的TCP收到数据包后,发送ACK标志给发送方,发送方会认为接收方已经收到了数据,但是如果此时接收方的OS崩溃或者应用程序崩溃,那么发送方无法知道接收方是否处理了这个数据包
 
 
4.TCP没有即时通知网络中断的功能
如果在网络絮乱的情况下,或者网线被人切断的情况下,那么TCP是不会通知应用层的,之所以不提供这样的功能,是因为接收方和发送方的连接线路并不是唯一的,路由器会自动寻找通往另外一方的路径,然后将线路改为另外一条线线路,这样就保证了TCP协议在网络暂时出现问题的情况下依然提供通讯的能力以及自我维护的能力
 
5.TCP的写操作
当调用一个write的时候,TCP只是把数据从用户态复制到内核态,然后等待内核去处理,如果在处理的过程中发生错误,比如因为发送失败太多次而丢弃包,用户并无法知道,所以write成功返回仅仅是告诉用户数据成功从用户态复制到 内核态
 
TCP的实际传输数据取决于缓冲区空间的大小以及网络拥塞以及TCP重传策略等等,但这些东西用户态并无法知道

TCP中需要了解的东西的更多相关文章

  1. 三十天学不会TCP,UDP/IP网络编程 -- TCP中的智慧之连续ARQ

    突然发现上一篇文章贴图有问题,关键我怎么调也调不好,为了表达歉意,我再贴一篇gitbook上的吧,虽然违背了我自己的隔一篇在这里发一次的潜规则~其余完整版可以去gitbook(https://www. ...

  2. TCP中的KeepAlive与HTTP中的Keep-Alive

    KeepAlive 与 Keep-Alive 前言 昨天被问到了HTTP中Keep-Alive的概念,看名字我只知道是保持连接用的,但是对于他怎么结束连接,为什么要用他这些就不是很清楚了,今天查了一下 ...

  3. TCP中的RST复位信号

    TCP中的RST复位信号 在TCP协议中RST表示复位,用来关闭异常的连接,在TCP的设计中它是不可或缺的. 发送RST包关闭连接时,不必等缓冲区的包都发出去,直接就丢弃缓存区的包发送RST包.而接收 ...

  4. /proc/net/tcp中各项参数说明

    /proc/net/tcp中的内容由tcp4_seq_show()函数打印,该函数中有三种打印形式,我们这里这只列出状态是TCP_SEQ_STATE_LISTENING或TCP_SEQ_STATE_E ...

  5. TCP/IP源码(59)——TCP中的三个接收队列

    http://blog.chinaunix.net/uid-23629988-id-3482647.html TCP/IP源码(59)——TCP中的三个接收队列  作者:gfree.wind@gmai ...

  6. Web开发中需要了解的东西

    在StackExchange上有人问了这样一个问题:What should every programmer know about web development?(关于Web开发,什么是所有程序员需 ...

  7. TCP中的MSS解读(转)

    本文摘录自TCP中的MSS解读. MSS 是TCP选项中最经常出现,也是最早出现的选项.MSS选项占4byte.MSS是每一个TCP报文段中数据字段的最大长度,注意:只是数据部分的字段,不包括TCP的 ...

  8. Web开发中需要了解的东西【转载】

    在StackExchange上有人问了这样一个问题:What should every programmer know about web development?(关于Web开发,什么是所有程序员需 ...

  9. python socket的应用 以及tcp中的粘包现象

    1,socket套接字 一个接口模块,在tcp/udp协议之间的传输接口,将其影藏在socket之后,用户看到的是socket让其看到的. 在tcp中当做server和client的主要模块运用 #s ...

随机推荐

  1. 104. Maximum Depth of Binary Tree

    Given a binary tree, find its maximum depth. The maximum depth is the number of nodes along the long ...

  2. init/main.c

    /* * linux/init/main.c * * Copyright (C) 1991, 1992 Linus Torvalds */ #include <stdarg.h> #inc ...

  3. AndroidStudio用微信官方方法接入微信分享功能

    转载请注明出处:http://www.cnblogs.com/wangoublog/p/5367950.html 现在微信的功能众所周知,用户量.影响力也是惊人,很多应用接入微信的功能已成为一种不可缺 ...

  4. python--列表生成式--8

    原创博文,转载请标明出处--周学伟http://www.cnblogs.com/zxouxuewei/ 一.生成列表 要生成list [1, 2, 3, 4, 5, 6, 7, 8, 9, 10],我 ...

  5. leetcode 149. Max Points on a Line --------- java

    Given n points on a 2D plane, find the maximum number of points that lie on the same straight line. ...

  6. MySQL基于mysqldump及lvmsnapshot备份恢复

    一.备份对象 数据 配置文件 代码:存储过程,存储函数,触发器 跟复制相关的配置 二进制日志文件 二.备份工具 mysqldump:逻辑备份工具 InnoDB热备.MyISAM温备.Aria温备 备份 ...

  7. Hive不支持非相等的join

    由于 hive 与传统关系型数据库面对的业务场景及底层技术架构都有着很大差异,因此,传统数据库领域的一些技能放到 Hive 中可能已不再适用.关于 hive 的优化与原理.应用的文章,前面也陆陆续续的 ...

  8. poj1420 拓扑序

    题意:给出一个表格,一部分单元格是给定的数字,而另一部分单元格则是一个式子,表示是其他一些单元格的和,让你输出最后计算出的所有格子的数. 因为有些格子需要其他格子先计算出来,所以计算顺序是按照拓扑序的 ...

  9. 越狱Season 1-Season 1, Episode 3: Cell Test

    Season 1, Episode 3: Cell Test -CO: Oh, my God. 我的天 Williamson, get in here. Williamson 快进来 What the ...

  10. AJAX保留浏览历史的解决方案——hashchange()

    在ajax请求中,不能更新地址栏,地址栏上的“前进”和“后退”按钮就失效了,带来了另外一种糟糕的用户体验. 解决方案如下: 方案一:使用window. Onhashchange 事件 如下面Html片 ...