解读一下这个c程序编译时,程序中的注释部分?

1. 诺基亚行货手机验证网址:

2.诺基亚原装电池验证网址:

6. 诺基亚6120c是3G手机,在国内可以使用吗?
不可以。因为诺基亚6120c的3G功能是WCDMA标准,国内的3G功能是TD-SCDMA标准,两者不通用,并且国内尚未正式开通3G网络,只是在个别城市试运行。

7. 诺基亚6120c的壁纸是否可以全屏?
不可以,S60系列的手机壁纸都不可以全屏。如果要全屏,除非制作主题文件。

9. 诺基亚6120c可以安装什么格式的程序?
sisx格式,部分sis格式,jar格式。

10. 为什么安装了jar程序却打不开?
jar文件名必须是英文或者数字,如果你下载后把名字改成了汉字的,安装之后就打不开,需要改成英文或数字。

11. 为什么我安装的软件找不到?
新安装的程序都放在了 应用程序\我的助理文件夹里,可以移动到别的地方。

6120c不是拍照手机,拍照效果比较差,并且屏幕有泛红现象,如果有了新版本升级之后还不能解决,就说明是摄像头的质量问题了。

6120c的音质属于普通水平,不如N73,5700,E2,E6,E398,外放声音不是很大,外放效果也一般化。

6120c内置了GPS功能,但是没有内置GPS卫星接收器,所以不能使用。如果要使用,需要购买GPS卫星蓝牙接收器。

15. 将6120c和电脑连接之后提示安装驱动,应该怎么办?
可以先安装诺基亚PC套件,最新版本是6.84,套件含有驱动程序,能够自动识别安装。

16. 安装主题时,提示证书已过期,应该怎么办?
将手机时间调至2006年即可。

17. 安装主题时,提示证书无效,或者证书限制,应该怎么办?
需要用证书重新给所要安装的软件签名。

18. 我不会制作证书怎么办?
由于塞班网停止了新用户注册,所以如果要制作证书,需要请教有塞班帐号的一些老手,现在有很多人提供义务制作证书的服务,大家可以向他们求救,制作证书需要你的手机串号,即IMEI号,可以通过使用*#06#查到,还需要你的手机型号,即诺基亚6120c。

6120c目前有两个版本,3.70的版本比较早,可以使用NSS更改CODE,然后升级,3.83版本比较新,无法被NSS软件识别,无法更改CODE。

21. 6120c可以使用视频来电铃声吗?
可以,支持3GP格式和MP4格式的视频铃声,但是不支持rm格式。

24. 可以更换手机的字体吗?
可以,需要安装软件FontRouter.LT.for.v9,该软件需要签名,安装完毕后需要在存储卡中建立一个文件夹E:\resource\Fonts,然后将字体复制到这个文件夹里面,另外还需要在存储卡根目录建一个FontRouter.ini文件,文件的内容如下:

然后重启手机,字体即可改变。
删除FontRouter或字体文件或移除FontRouter.ini配置文件,则字体会恢复成原来的。

25. 诺基亚6120c支持重复闹铃吗?
不仅支持,还支持多个闹铃,设置闹铃的时候可以选择“每天”,那么闹铃会在每天的这个时候响,也可以选择“每周”,比如每周三上午6点,还可以定义工作日闹铃,先将工作日的日期定好,然后将闹铃重复选项中选中工作日,比如每周一到周五上午6点,而周六和周日就不响了,当然我们也可以定义一次性闹铃,只要选中“不重复”就可以。

26. 诺基亚6120c观看视频是否可以全屏和快进?
可以的。播放视频时按数字键“2”可以在全屏模式和正常模式之间进行切换;在非全屏模式下,按导航键“上“可以快进,按导航键“下”可以快退。

27. 诺基亚6120c如何一键切换到静音模式?
按住#号键不放,即可在静音模式和标准模式之间进行切换。

28. 如何取出手机存储卡?
不要直接把卡拔除,可以先按一下关机键,在弹出的菜单中选择最后一项”取出内存卡“,然后按确定,再把卡取出来。

29. 诺基亚6120c有没有重启键?
有一种办法可以重启手机,按住#号键0.5秒不放,然后按一下*号键,松开这两个键,手机重启并切换到无声模式。

30. 安装了许多软件和主题,想删除几个,但是在“程序管理”里面找不到,怎么办?
程序管理里面显示的程序或主题数量是有限的,多了就无法显示了,删除其中的几个便可以将剩余的显示出来。另外,如果主题安装到了内存卡上,可以到内存卡的Private\\import目录下,将主题文件删除,每个主题放在单独的文件夹里。

31. 诺基亚6120c如何能够省电?
以下几种办法能在一定程度上节省电量:把主题文件和铃声安装到手机内存,减少对内存卡的读取;把网络模式由默认的UMTS和GSM双模式改为GSM模式;用进程管理软件关闭多余的进程;将背光时间调低些。

32. 发短信时,如何切换大小写?
按一下*号键,在弹出的菜单中选择“大写拉丁”或“小写拉丁“。

本文解读部分作者为金融监管研究院院长孙海波,谢绝其他媒体,和网站转载,摘抄;欢迎个人转发。点击以下图片超级链接,获取详细课程报名信息刚刚,银保监会就《商业银行金融资产风险分类暂行办法》公开征求意见。本文纲要第一部分

  本文解读部分作者为金融监管研究院院长孙海波,谢绝其他媒体,和网站转载,摘抄;欢迎个人转发。

  点击以下图片超级链接,获取详细课程报名信息

  刚刚,银保监会就《商业银行金融资产风险分类暂行办法》公开征求意见。

  第一部分新办法重点

  第二部分关于新规的逐条解读

  第三部分银保监会有关部门负责人答记者问

  第一部分新办法重点变化

  1、将风险分类对象由贷款扩展至承担信用风险的全部金融资产对非信贷资产提出了以信用减值为核心的分类要求,特别是对资管产品和非零售和信贷ABS提出穿透分类要求

  2、重新定义五级分类,重点强调债务人风险,和资产减值结合认定。新增了必须降为可疑类和损失类资产认定的标准。新增次级类认定标准:

  同一非零售债务人在所有银行的债务中,逾期90天以上的债务已经超过5%;

  债务人被纳入失信联合惩戒名单。

  3、商业银行对非零售资产金融资产进行分类时,应以评估债务人的履约能力为中心,债务人在本行债务有5%以上分类为不良的,本行其他债务均应分类为不良。

  4、同时,以债务人为中心并非不考虑担保因素。对于不良资产,商业银行可以依据单笔资产的担保缓释程度,将同一非零售债务人名下的不同债务分为次级类、可疑类或损失类。

  5、《暂行办法》明确,金融资产逾期后应至少归为关注类,逾期90天以上应至少归为次级类,逾期270天以上应至少归为可疑类,逾期360天以上应归为损失类。逾期90天以上的债权,即使抵押担保充足,也应归为不良。

  该要求对于不少银行挑战很大。以下为截至2018年底根据各家银行年报披露数据整理:

  目前华夏银行、九台农商、盛京银行等一直以来逾贷比超过100%,从当前法规意义上看不一定违反规定。此次的《商业银行金融资产风险分类暂行办法》征求稿如果正式实施,对部分银行的不良和拨备冲击比较大。

  7、同时,考虑到非零售债务人逾期90天以上所反映出的风险严重程度,规定同一债务人在所有银行的债务中逾期90天以上债务已经超过5%的,各银行均应将其债务归为不良。是监管对交叉认定做了严格的执行标准,只要在他行有逾期,比例超过总债务5%,本行即便没有逾期也需要归为不良,交叉认定不良影响比较大。

  8、根据“实质重于形式”原则,不再统一要求重组贷款必须分为不良,但应至少分为关注类。对于重组前已经不良的,要求重组后观察期内不得上调为正常或关注类。

  9、大幅度细化了重组贷款的定义,防止隐藏不良贷款情形,将重组观察期由至少6个月延长为至少1年。重组类贷款不再一律要求降为次级类;

  重组前正常类或关注类的,重组后应至少归为关注类;

  重组前为次级类、可疑类或损失类的,重组观察期内不得上调分类;

  10、零售资产、不良资产为基础资产的信贷资产证券化产品,以及分层的信贷资产证券化产品以产品为单位进行分类,不做穿透分类。不再要求逐笔底层资产分类。

  第二部分关于新办法的逐条解读

  商业银行金融资产风险分类暂行办法

  第一条【法律依据】为促进商业银行准确评估信用风险,真实反映金融资产质量,根据《中华人民共和国银行业监督管理法》《中华人民共和国商业银行法》等法律法规,制定本办法。

  第二条【适用范围】本办法适用于中华人民共和国境内依法设立的商业银行。

  第三条【分类资产】商业银行应对表内承担信用风险的金融资产进行风险分类,包括但不限于贷款、债券和其他投资、同业资产、应收款项等。表外项目中承担信用风险的,应比照表内资产相关要求开展风险分类。

  第四条【风险分类定义】本办法所称风险分类是指商业银行按照风险程度将金融资产划分为不同档次的行为。

  第五条【分类原则】商业银行应按照以下原则进行风险分类:

  (一)真实性原则。风险分类应真实、准确地反映金融资产风险水平。

  (二)及时性原则。按照债务人履约能力以及金融资产风险变化情况,及时、动态地调整分类结果。

  (三)审慎性原则。金融资产风险分类不确定的,应从低确定分类等级。

  (四)独立性原则。金融资产风险分类结果取决于商业银行在依法依规前提下的独立判断,不受其他因素影响。

  第六条【五级分类】金融资产按照风险程度分为五类,分别为正常类、关注类、次级类、可疑类、损失类,后三类合称不良资产。

  (一)正常类:债务人能够履行合同,没有客观证据表明本金、利息或收益不能按时足额偿付,资产未出现信用减值迹象。

  (二)关注类:虽然存在一些可能对履行合同产生不利影响的因素,但债务人目前有能力偿付本金、利息或收益,且资产未发生信用减值。

  (三)次级类:债务人依靠其正常收入无法足额偿付本金、利息或收益,资产已经发生信用减值。

  (四)可疑类:债务人已经无法足额偿付本金、利息或收益,资产已显著信用减值。

  (五)损失类:在采取所有可能的措施后,只能收回极少部分金融资产,或损失全部金融资产。

  前款所称信用减值指根据所适用的会计准则,因债务人信用状况恶化导致的资产估值向下调整。

  金融监管研究院解读:

  这里五级分类定义主要发生两个重要变化:

  1、正式将五级分类从传统贷款扩展到所有类型金融资产。不局限于贷款本身,虽然在2016年10月份银监会发布过文件《关于进一步加强信用风险管理的通知》,

  要求开展非信贷资产分类,银行业金融机构要参照贷款分类的有关规定,明确表内外各类非信贷资产的分类标准和操作流程,真实、准确和动态地反映非信贷资产风险状况。原则上,实质上由银行业金融机构承担信用风险的表内外业务均应进行分类。非信贷资产分类要坚持实质重于形式的原则,实行穿透式管理,根据基础资产的风险状况,合理确定风险类别。

  但实际结果看,对非信贷类资产的五级分类结果做得并不好。

  2、这里的五级分类上就不再是围绕“贷款本息”能否收回,而是围绕债务人是否有履约能力展开;这和本次文件重第一还款源,轻抵质押担保措施的思路一致。即便有高质量的抵质押品,只要逾期超过90天同样需要纳入不良。

  3、强调资产减值在风险分类中的作用,主要是为了和新的企业会计准则保持一致。根据最新的企业会计准则(I9),采用了预期信用损失减值模型,金融资产信用风险水平划分为“金融资产初始确认”、“信用风险显著增加”、“发生客观减值证据”三阶段;

  阶段一:在金融资产初始确认当期即按未来12个月可能发生预期信用损失计提减值;

  阶段二:信用风险显著增加时,即使尚未发生逾期或风险降级,也要对金融资产整个存续期内可能发生的逾期信用损失计提减值;

  阶段三:发生客观减值证据,不仅要计提整个存续期内的预期信用损失,还按金融资产账面净额计算利息收入,档期确认利息收入减值。

  初步将五级分类和减值建立对应关系。因为二者的基本逻辑一致,就是预期信用损失通过减值准备来应对,非预期损失用商业银行资本金来对应。

  4、从过往的监管政策历史看,“五级分类”规范性文件最主要的有3个,一是人民银行印发的《银行贷款损失准备计提指引》(银发〔2002〕98号),二是银监会印发的《贷款风险分类指引》(银监发〔2007〕54号),三是财政部印发的《金融企业准备金计提管理办法》(财金〔2012〕20号)。

  2007年,银监会下发《贷款风险分类指引》,对五级分类的定义、目标、原则等进行了规范。是目前为止关于贷款风险分类最全面且仍然有效的文件。

  第七条【非零售资产】商业银行对非零售资产开展风险分类时,应以评估债务人履约能力为中心,重点考查债务人的财务状况、偿付意愿、偿付记录,并考虑金融资产的逾期天数、担保情况等因素。对于债务人为企业集团成员的,其债务被分为不良并不必然导致其他成员也被分为不良,但商业银行应及时启动评估程序,审慎评估该成员对其他成员的影响,并根据评估结果决定是否调整其他成员债权的风险分类。

  商业银行对非零售债务人在本行的债权5%以上被分为不良的,对该债务人在本行的所有债权均应归为不良。

  明确债务人履约能力时评估核心,和前面五级分类的定义相呼应,和2007年的贷款风险分类指引相比,不再强调贷款项目的盈利能力,银行的信贷管理状况,贷款偿还的法律责任等因素。

  明确本行交叉违约的依据,只要5%以上出现不良,其他债权也认定为不良,这里包括债券、贷款、福费廷等贸易融资。

  第八条【零售资产】商业银行对零售资产开展风险分类时,在审慎评估债务人履约能力和偿付意愿基础上,可根据单笔资产的交易特征、担保情况、损失程度等因素进行逐笔分类。

  零售资产包括个人贷款、信用卡贷款、对符合《商业银行资本管理办法(试行)》第六十四条规定的小微企业债权等。

  对零售资产的风险分类,新增考核要素交易特征,删除还款记录的因素。当然实际还款记录或多或少也会体现在偿付意愿和能力因素中。

  明确零售资产类别包括个人贷款,信用卡和风险权重为75%的小微企业债权(风险暴露不超过500万)。

  第九条【拆分分类】同一笔债权不得拆分分类,符合本办法第十六条规定的情形除外。

  继承了此前的要求,不得拆分分类,但新增例外条款,主要是和此前2007年54号文比,新增SPV投资和ABS产品分类要求:

  零售资产、不良资产为基础资产的信贷资产证券化产品,以及分层的信贷资产证券化产品以产品为单位进行分类,不做穿透分类。

  其他类型的ABS和所有类型的SPV投资,需要穿透至底层资产做风险分类要求;

  第十条【关注类资产】商业银行应将满足下列情况之一的金融资产至少归为关注类:

  (一)本金、利息或收益逾期;

  (二)改变资金用途;

  (三)债务人财务状况正常情况下,通过借新还旧或通过其他债务融资方式偿还;

  (四)同一债务人在其他银行的债务出现不良。

  重述“借新还旧”一律降级为关注类,和此前规则没有变化,但注意此前银保监会鼓励的无还本续贷不属于这里定义的“借新还旧”。

  同一债务人在其他银行出现不良,但不超过总的债务5%,下调为关注,如果超过5%需要全部交叉认定为不良。

  通过兼并、重组、分立而已逃废债的行为此前54号文至少归为关注,此次文件直接划入可疑类分类,认定更加严格,连续下调两级。

  第十一条【次级类资产】商业银行应将满足下列情况之一的金融资产至少归为次级类:

  (一)本金、利息或收益逾期(含展期后)超过90天;

  (二)债务人或金融资产的外部评级被下调至非投资级;

  (三)同一非零售债务人在所有银行的债务中,逾期90天以上的债务已经超过5%;

  (四)债务人被纳入失信联合惩戒名单。

  1、只要逾期90天(含展期)就认定为不良,这比此前大幅度趋严。不考虑担保等因素。2007年的《贷款风险分类指引》(银监发[2007]54号),对于以上逾期90天以上但只要担保充足,仍然不能足够理由怀疑贷款本息不能偿还,所以可以化为正常或关注。此次非常明确,只要逾期90天一律不良。

  2、债务人外部评级下调到BBB以下,属于新增分类要求,但影响不大,国内评级相对水分充足,外部评级BBB以下极为罕见。

  3、一旦纳入失信联合惩戒名单,不论是否逾期都纳入次级,认定口径更加严格。以下可能会被纳入失信联合惩戒名单:

  一是严重危害人民群众身体健康和生命安全的行为。

  二是严重破坏市场公平竞争秩序和社会正常秩序的行为,包括贿赂、逃税骗税、恶意逃废债务、恶意拖欠货款或服务费、恶意欠薪、非法集资、合同欺诈、传销、无证照经营、制售假冒伪劣产品和故意侵犯知识产权、出借和借用资质投标、围标串标、虚假广告等严重失信行为。

  三是拒不履行法定义务,严重影响司法机关、行政机关公信力的行为

  4、不再要求重组类贷款一律划分为次级。

  这个条款相比当前规则稍微有放松,重组贷款原则是:

  重组前正常类或关注类的,重组后应至少归为关注类;

  重组前为次级类、可疑类或损失类的,重组观察期内不得上调分类;

  重组观察期内再次重组的资产应至少归为可疑类。

  第十二条【可疑类资产】商业银行应将满足下列情况之一的金融资产至少归为可疑类:

  (一)本金、利息或收益逾期(含展期后)超过270天;

  (二)债务人逃废银行债务;

  (三)金融资产已减值40%以上。

  新增三种必须划入可疑类的情形,逃废债的情况划分为可疑类,此前如果尚未逾期可以划入关注类。逾期270天和资产减值40%一律划入可疑。

  第十三条【损失类资产】商业银行应将满足下列情况之一的金融资产归为损失类:

  (一)本金、利息或收益逾期(含展期后)超过360天;

  (二)债务人已进入破产程序;

  (三)金融资产已减值80%以上。

  新增三种必须划入损失类的情形。

  第十四条【不良上调】商业银行将不良资产上调至正常类或关注类时,应符合正常类或关注类定义,并同时满足下列要求:

  (一)逾期的债权及相关费用已全部偿付,并至少在随后连续两个还款期或6个月内(按两者孰长原则确定)正常偿付债务;

  (二)经评估认为,债务人未来能够持续正常履行合同;

  (三)债务人在本行已经没有发生信用减值的金融资产。

  新增不良资产上调为关注或正常的条件,这里同样和企业会计准则的减值挂钩,需要连续两个还款期或6个月孰长正常偿付,且没有发生减值,评估正常才能上调。

  第十五条【企业并购】因债务人并购导致偿债主体发生变化的,并购方和被并购方相关金融资产风险分类应在6个月内保持不变。6个月后,商业银行应重新评估债务人风险状况,并对其全部债权进行风险分类。涉及不良资产上调为正常类或关注类的,应满足第十四条相关要求。

  新增企业并购的条款,为保持并购后的债权风险分类稳定性,要求6个月内不得改变。一般而言债务人发生被并购,都需要银行债权人同意或提前还款,所以并购总体会有利于降低债务偿还的风险,所以该条款实际是保守的做法。借鉴了此前重组贷款6个月观察期的思路(本次新规将重组贷款观察期提高到至少1年)。

  第十六条【穿透管理】商业银行对投资的资产管理产品或资产证券化产品进行风险分类时,应穿透至底层资产,按照底层资产风险状况进行风险分类。对于无法穿透至基础资产的资产证券化产品,应按照基础资产中风险分类最差的资产确定产品风险分类。

  对于以零售资产、不良资产为基础资产的信贷资产证券化产品,以及分层的信贷资产证券化产品,商业银行应在综合评估最终债务人风险状况以及结构化产品特征的基础上,按照投资预计损益情况对产品进行风险分类。

  第三章重组资产风险分类

  金融监管研究院解读:专门开辟一个章节定义并规范重组贷款的风险分类,主要是因为现实中多数中小银行隐藏不良贷款最重要的手段就是通过重组,和贷款人重新协商条件,或者重新再融资改变贷款性质,主要是因为当前的分类准则中关于重组贷款规定过于粗糙。

  表面上对重组贷款没有一律要求将为次级,更加宽松,但细节执行上更加到位。

  第十七条【重组资产】重组资产是指因债务人发生财务困难,为促使债务人偿还债务,商业银行对债务合同作出有利于债务人调整的金融资产,或对债务人现有债务提供再融资,包括借新还旧、新增债务融资等。

  对于现有合同赋予债务人自主改变条款或再融资的权利,债务人因财务困难行使该权利的,相关资产也属于重组资产。

  第十八条【财务困难】债务人财务困难包括以下情形:

  (一)本金、利息或收益已经逾期;

  (二)虽然本金、利息或收益尚未逾期,但债务人偿债能力下降,预计现金流不足以履行合同,债务有可能逾期;

  (三)债务人的债务已经被分为不良;

  (四)债务人无法在其他银行以市场公允价格融资;

  (五)债务人公开发行的证券存在退市风险,或处于退市过程中,或已经退市;

  (六)商业银行认定的其他情形。

  第十九条【合同调整形式】合同调整包括以下情形:

  (二)宽限本息偿还计划;

  (三)新增或延长宽限期;

  (四)利息转为本金;

  (五)降低利率,使债务人获得比公允利率更优惠的利率;

  (六)允许债务人减少本金、利息或相关费用的偿付;

  (七)债权换股权;

  (八)释放部分押品,或用质量较差的押品置换现有押品;

  (九)其他放松合同条款的措施。

  金融监管研究院解读:明确定义重组贷款的合同调整的定义,总结下来重组贷款如下图:

  第二十条【观察期】商业银行应对重组资产设置重组观察期。观察期自合同调整后约定的第一次还款日开始计算,应至少包含连续两个还款期,并不得低于1年。观察期结束时,债务人已经解决财务困难并在观察期内及时足额还款的,相关资产可不再被认定为重组资产。

  债务人在观察期结束时未解决财务困难的,应重新计算观察期。债务人在观察期内没有及时足额还款的,应从未履约时点开始,重新计算观察期。

  金融监管研究院解读:原来规定,至少6个月的观察期内不得调离,新规更加严格,按照两个还款期和1年孰长原则。

  第二十一条【分类要求】对于重组资产,商业银行应准确判断债务人财务困难的状况。对于重组前为正常类或关注类的,重组后应至少归为关注类,符合不良认定标准的要归为不良资产,观察期内下调为不良的,应重新计算观察期。重组前为次级类、可疑类或损失类的,重组观察期内不得上调分类,资产质量持续恶化的应进一步下调分类,并重新计算观察期。

  第二十二条【多次重组】重组观察期内再次重组的资产应至少归为可疑类,并重新计算观察期。

  第二十三条【例外情况】债务人未发生财务困难情况下,商业银行对债务合同作出调整的金融资产或再融资不属于重组资产。

  金融监管研究院解读:明确正常的重组不属于重组贷款,比如由于贷款原期限与借款人现金流不匹配,经双方协商后对借款合同重新修订,按照现行利率进行延期,银行没有进行借款条件的减让。

  第四章风险分类管理

  第二十四条【最低要求】本办法是金融资产风险分类的最低要求,商业银行应根据实际情况完善分类制度,细化分类方法,但不得低于本办法提出的标准和要求,且与本办法的风险分类方法具有明确的对应和转换关系。商业银行制定或修订金融资产风险分类制度后,应在30日内报银行业监督管理机构备案。

  第二十五条【治理架构】商业银行应健全金融资产风险分类管理的治理架构,明确董事会、高级管理层和相关部门的风险分类职责。

  第二十六条【董事会职责】董事会对金融资产风险分类结果承担最终责任,监督高级管理层履行风险分类职责。

  第二十七条【高管层职责】高级管理层应制定金融资产风险分类制度,推进风险分类实施,确保分类结果真实有效,并定期向董事会报告。

  第二十八条【管理制度】金融资产风险分类管理制度的内容包括但不限于分类流程、职责分工、分类标准、分类方法、内部审计、风险监测、统计报告及信息披露等。

  第二十九条【分类方法】商业银行应按照金融资产类别、交易对手类型、产品结构特征、历史违约情况等信息,结合本行资产组合特征,明确各类金融资产风险的分类方法。分类方法一经确定,应保持相对稳定。

  第三十条【分类流程】商业银行应完善金融资产风险分类流程,明确“初分、认定、审批”三级程序,加强各环节管理要求,建立有效的制衡机制,确保分类过程的独立性,以及分类结果的准确性和客观性。

  第三十一条【分类频率】商业银行应至少每季度对全部金融资产进行一次风险分类。对于债务人财务状况或影响债务偿还的因素发生重大变化的,应及时调整风险分类。

  第三十二条【内部审计】商业银行应至少每年对风险分类制度、程序和执行情况进行一次内部审计,审计结果应及时向董事会书面报告,并报送银行业监督管理机构。

  第三十三条【信息系统】商业银行应开发并持续完善金融资产风险分类相关信息系统,满足风险管理和审慎监管要求。

  第三十四条【监测分析】商业银行应加强对金融资产风险的监测、分析和预警,动态监测风险分布和风险变化,深入分析风险来源及迁徙趋势,及时根据风险状况采取防范措施。

  第三十五条【信息披露】商业银行应依据有关信息披露的规定,及时披露金融资产风险分类方法、程序、结果,以及损失准备计提、损失核销等信息。

  第三十六条【文档管理】商业银行应持续加强金融资产风险分类档案管理,确保分类资料信息准确、连续、完整。

  第三十七条【监督检查】银行业监督管理机构依照本办法规定对商业银行金融资产风险分类进行监督检查,并采取相应监管措施。

  第三十八条【监管报告】商业银行应按照规定向银行业监督管理机构报送与金融资产风险分类有关的统计报表和分析报告。

  第三十九条【年度报告】商业银行应于年初30个工作日内向银行业监督管理机构报告上一年度金融资产风险分类管理情况。

  第四十条【监管评估】银行业监督管理机构定期评估商业银行金融资产风险分类管理状况及效果。同时,将评估意见反馈商业银行董事会和高级管理层,并将评估结果作为监管评级的重要参考。

  第四十一条【监管措施】商业银行违反风险分类监管要求的,银行业监督管理机构可以采取以下监管措施:

  (一)与商业银行董事会、高级管理层进行审慎性会谈;

  (二)印发监管意见书,内容包括商业银行金融资产风险分类管理存在的问题、拟采取的纠正措施和限期整改意见等;

  (三)要求商业银行加强金融资产风险分类管理,制定切实可行的整改计划,并报银行业监督管理机构备案;

  (四)根据违规程度提高其拨备和监管资本要求;

  (五)责令商业银行采取有效措施缓释金融资产风险。

  第四十二条【行政处罚】商业银行违反本办法规定的监管要求的,银行业监督管理机构除采取本办法第四十一条规定的措施外,还可依据《中华人民共和国银行业监督管理法》等法律法规规定采取审慎监管措施或实施行政处罚。

  第四十三条【解释权】本办法由国务院银行业监督管理机构负责解释。

  第四十四条【对应关系】对于已实施资本计量高级方法的商业银行,应明确风险分类标准和内评体系违约定义之间的稳定对应关系。

  第四十五条【参照范围】国家开发银行及政策性银行、农村合作银行、村镇银行、农村信用社和外国银行分行及银行业监督管理机构监管的其他金融机构参照本办法执行。

  第四十六条【生效时间】本办法自2019年X月X日起施行,《贷款风险分类指引》(银监发〔2007〕54号)同时废止。

  第四十七条【小微企业】商业银行可以依据《小企业贷款风险分类办法(试行)》(银监发〔2007〕63号),对小企业贷款进行风险分类。对符合条件的小微企业续贷类业务,可依据相关监管规定确定其风险分类。其他规定与本办法不一致的,按本办法执行。

  第四十八条【过渡期】商业银行在2019年X月X日后新发生的业务应按本办法要求进行分类。

  对于2019年X月X日前发生的业务,商业银行应于2019年12月31日前全部按本办法要求进行重新分类。对于确有困难的商业银行,经银行业监督管理机构同意,最晚应于2020年12月31日前全部重新分类。

  第二部分中国银保监会有关部门负责人就《商业银行金融资产风险分类暂行办法(征求意见稿)》答记者问

  为促进商业银行准确识别信用风险,真实反映资产质量,近日,中国银行保险监督管理委员会制定了《商业银行金融资产风险分类暂行办法(征求意见稿)》(以下简称《暂行办法》),面向社会公开征求意见,有关部门负责人就《暂行办法》回答了记者提问。

  一、制定《暂行办法》的背景是什么?

  信用风险是我国银行业面临的最主要风险,完善的风险分类制度是有效防控信用风险的前提和基础。

  1998年,人民银行发布《贷款风险分类指导原则》(银发〔1998〕151号),提出了五级分类概念。2007年,原银监会发布《贷款风险分类指引》(银监发〔2007〕54号,以下简称《指引》),进一步明确了五级分类监管要求。

  近年来,随着我国经济持续发展,商业银行金融资产的风险特征发生了较大变化,风险分类实践面临诸多新情况和新问题,暴露出现行风险分类监管制度存在的一些不足,如覆盖范围不全面、分类标准不清晰、落实执行不严格等。

  从国际上看,2017年4月,巴塞尔委员会发布《审慎处理资产指引——关于不良暴露和监管容忍的定义》,明确了不良资产和重组资产的认定标准和分类要求,以增强全球银行业资产风险分类标准的一致性和结果的可比性。

  借鉴国际规则并结合国内监管实践,银保监会发布实施《暂行办法》,取代现行《指引》,能够促进商业银行做实金融资产风险分类,准确识别风险水平,有利于银行业有效防范化解信用风险,提升服务实体经济水平。

  二、对金融资产开展风险分类应遵循什么原则?

  商业银行对金融资产开展风险分类时,应严格遵循真实性、及时性、审慎性和独立性原则。

  准确分类是商业银行做好信用风险管理的出发点。商业银行应严格按照《暂行办法》要求开展风险分类,并根据债务人履约能力以及金融资产风险变化情况,及时、动态调整分类结果。

  对于暂时难以掌握风险状况的金融资产,商业银行应从严把握分类标准,从低确定分类等级。

  特别需要强调的是,商业银行应在依法依规前提下,独立判断金融资产的风险程度,不受其他因素左右而影响分类结果,确保风险分类能够真实、准确反映金融资产内在风险。

  三、《暂行办法》为什么要拓宽风险分类的金融资产范围?

  随着近年来银行业务快速发展,商业银行的资产结构发生了较大变化,贷款在金融资产中的占比总体下降,非信贷资产占比明显上升。

  现行《指引》主要针对贷款提出分类要求,对贷款以外的其他资产以及表外项目规定不细致。部分商业银行对投资债券、同业资产、表外业务等没有开展风险分类,或“一刀切”全部分为正常类。

  商业银行投资的资管产品结构较为复杂,许多银行对投资的资管产品没有进行穿透管理,难以掌握其真实风险。

  为此,《暂行办法》将风险分类对象由贷款扩展至承担信用风险的全部金融资产,对非信贷资产提出了以信用减值为核心的分类要求,特别是对资管产品提出穿透分类要求,有利于商业银行全面掌握各类资产的信用风险,针对性加强信用风险防控。

  四、如何理解以债务人为中心的风险分类理念?

  根据现行《指引》,贷款风险分类以单笔贷款为对象,同一债务人名下的多笔贷款的分类结果不尽一致,既可以是正常类,也可以分为关注类、次级类、可疑类或损失类。

  巴塞尔委员会在《审慎处理资产指引——关于不良暴露和监管容忍的定义》中明确指出,如果银行的非零售交易对手有任何一笔风险暴露发生实质性不良,应将其所有风险暴露均认定为不良。

  借鉴“实质性”不良的概念,考虑到对公客户公司治理和财务数据相对完善,《暂行办法》要求商业银行对非零售资产金融资产进行分类时,应以评估债务人的履约能力为中心,债务人在本行债务有5%以上分类为不良的,本行其他债务均应分类为不良。

  需要指出的是,以债务人为中心并非不考虑担保因素。对于不良资产,商业银行可以依据单笔资产的担保缓释程度,将同一非零售债务人名下的不同债务分为次级类、可疑类或损失类。

  对于零售资产,考虑到业务种类差异、抵押担保等因素影响,银行也可以对单笔资产进行风险分类。

  五、风险分类如何考虑逾期天数的影响?

  商业银行开展风险分类的核心是准确判断债务人偿债能力恶化程度,逾期天数长短是反映资产恶化程度的重要指标。然而,现行《指引》对逾期天数与分类等级关系的规定不够清晰,导致一些银行以担保充足为由,未将全部逾期90天以上的债权纳入不良。

  《暂行办法》明确规定,金融资产逾期后应至少归为关注类,逾期90天以上应至少归为次级类,逾期270天以上应至少归为可疑类,逾期360天以上应归为损失类。

  《暂行办法》实施后,逾期90天以上的债权,即使抵押担保充足,也应归为不良。

  同时,考虑到非零售债务人逾期90天以上所反映出的风险严重程度,规定同一债务人在所有银行的债务中逾期90天以上债务已经超过5%的,各银行均应将其债务归为不良。

  六、《暂行办法》对重组资产的规定有哪些变化?

  现行《指引》对重组贷款涉及的“债务人财务状况恶化”以及“合同调整”两个关键性概念规定的不够详细,并且规定重组贷款应分为不良贷款。借鉴国际监管规则,《暂行办法》进一步细化了重组的概念。

  一是明确了重组资产定义,重点对“财务困难”和“合同调整”两个概念作出详细的规定,细化符合重组概念的各种情形,有利于银行分类时对照实施,堵塞监管套利的空间。

  二是根据“实质重于形式”原则不再统一要求重组贷款必须分为不良,但应至少分为关注类。对于重组前已经不良的,要求重组后观察期内不得上调为正常或关注类。

  三是将重组观察期由至少6个月延长为至少1年,在观察期内采取相对缓和的措施,有利于推动债务重组顺利进行。

  第四部分扩展阅读《逾期90天是否应该计入不良?》

  当前形势下,不良资产处置较为艰难,各参与方在资金端和收益端都面临着较大压力。不良资产的业务模式也由过去单一的对银行不良资产包的收购处置,转变为对社会错配资源的配置和整合利用。传统的处置模式只是在不断地转移风险,对应资产的价值并没有因为债权的转移而得到提升。一旦不良资产处置的进程和收益率达不到预期,则有可能出现“二次不良”,酿成新的风险。处置是不良资产行业的核心,而尽调、估值及交易结构的设置则贯穿于处置的全程。如何实现资产的加速处置,是目前行业所面对的难题。

  为帮助行业内人士深刻了解当前形势下不良资产市场的发展情况,把握不良资产的投资机会与风险意识,构建对资产的尽调和估值体系,加深对不良资产处置的理解及实操经验,法询金融将于2019年6月1-2日于北京举办不良资产线下专题研修班。欢迎各从业者参会,共享不良资产盛宴。

  讲师A某大型地方AMC评估评级部负责人

  某大型地方AMC公司评估评级部负责人,资产评估师,注册估值分析师。对于无形资产评估、金融不良资产评估、企业价值评估、金融衍生品定价等方面有丰富经验。

  慧达集团创始人,京师律所高级合伙人,曾创立秃鹫资产、融聚天下等知名机构,资深不良资产投资专家、困境企业重组专家,不良资产五维估值模型及不良资产投资三端论创立者,收购处理不良资产金额超100亿元。

  讲师C某大型地方AMC法律合规部法务主管

  先后就职于地方政府、某中级法院、大型国企,对于不良资产收购/处置中涉及的法律问题有深刻体会和丰富实践经验。

  时间:2019年6月1日全天

  主题:不良资产尽调与估值

  一、不良资产行业整体分析

  (1)四大资产管理公司

  (2)地方资产管理公司

  (3)民间资产管理公司

  2、特殊机遇与不良资产

  (1)何为特殊机遇

  (2)周期因素与不良资产行业

  (3)当前形势下的特殊机遇投资

  3、处置方式的变化

  (1)传统的处置方式

  (2)不良资产证券化

  (3)配资处置模式

  二、不良资产尽职调查总论

  (1)尽职调查理念

  (2)尽职调查手段

  (3)尽职调查方法

  3、不良资产的法律尽职调查

  (1)债权的有效性确认

  (2)抵押权的有效确认

  (3)押品常见的法律瑕疵

  (4)担保债权的确认

  (5)债权转让有效性的确认

  4、抵质押物的尽职调查

  5、干系人尽职调查

  1、不良资产估值的整体框架

  2、金融不良资产评估指导意见

  (2)现金流偿债法

  (3)交易案例比较法

  3、三大评估路径在不良资产估值中应用

  四、常见押品的估值方法

  (4)商业与办公地产

  (1)通用设备估值

  (2)专用设备估值

  时间:2019年6月2日上午

  主题:不良资产处置模式和处置技术

  3.常用的不良资产处置方法

  二、四种处置模式及优缺点

  1.债务重组方式主要普遍

  2.利用资本市场实现有效处置

  3.通过打包转让提高处置效率

  4.司法处置直接有力辅助兜底

  三、退出为王——几十种不良资产快速处置的方法

  四、择优退出——选择利益最优模式退出

  五、互联网+不良资产处置及前景分析

  1.互联网+不良资产处置的相关概述

  2.互联网+不良资产处置模式

  3.互联网+不良资产处置生态圈

  4.传统不良资产处置与互联网+不良资产处置比较分析

  5.基于互联网平台处置不良资产实践

  6.互联网+不良资产前景分析

  时间:2019年6月2日下午

  主题:不良资产收购处置法律事务大纲

  1.1不良资产简介

  1.2不良资产市场的参与主体

  1.3当前不良资产市场趋势

  二、不良资产收购处置模式

  2.1不良资产的批量转让

  2.2批量转让中注意的问题

  2.3不良资产收购的模式

  2.3.1法律尽职调查及关键点

  案例:法律尽调案例及风险瑕疵分析

  2.3.2商业化收购

  2.3.3全额委托收购

  案例:不同区域全额委托收购模式及分析

  2.3.4配资收购

  2.4不良资产的管理

  2.5不良资产处置的模式

  2.5.1债权转让/收益权转让

  案例:收益权转让不同模式及分析

  2.5.4债务重组

  2.5.5以物抵债

  2.5.6资产证券化(ABS)

  2.5.7破产重整(破产清算)

  三、不良资产收购处置中的常见法律问题及案例分析

  3.1利息(复利、罚息)求偿权相关法律问题

  案例:地方司法实践实例及分析

  3.2诉讼时效相关法律问题

  案例:地方司法实践实例及分析

  3.3最高额抵押相关法律问题

  案例:地方司法实践实例及分析

  3.4执行中抵押权与租赁冲突相关问题

  案例:地方司法实践实例及分析

  3.5破产重整中相关法律问题

  3.6在建工程相关法律问题

  3.7案例分享:烂尾楼如何盘活实例及运作要点

  *主办方:法询金融

  *课程费用:4200元/人(含课程费,资料费及午餐费,不含差旅住宿费用),多人参会及老学员可享受团购价。

  *地点:北京(具体地点课前一周通知)

  *请于开课前完成缴费,缴费账户及发票开立请联系工作人员

  *报名联系人:陈亮(电话&)

说明:1).本文以TCP的发展历程解析容易引起混淆,误会的方方面面
2).本文不会贴大量的源码,大多数是以文字形式描述,我相信文字看起来是要比代码更轻松的
3).针对对象:对TCP已经有了全面了解的人。因为本文不会解析TCP头里面的每一个字段或者3次握手的细节,也不会解释慢启动和快速重传的定义
4).除了《TCP/IP详解》(卷一,卷二)以及《Unix网络编程》以及Linux源代码之外,学习网络更好的资源是RFC

5).本文给出一个提纲,如果想了解细节,请直接查阅RFC

6).翻来覆去,终于找到了这篇备忘,本文基于这篇备忘文档修改。

1.网络协议设计ISO提出了OSI分层网络模型,这种分层模型是理论上的,TCP/IP最终实现了一个分层的协议模型,每一个层次对应一组网络协议完成一组特定的功能,该组网络协议被其下的层次复用和解复用。这就是分层模型的本质,最终所有的逻辑被编码到线缆或者电磁波。
分层模型是很好理解的,然而对于每一层的协议设计却不是那么容易。TCP/IP的漂亮之处在于:协议越往上层越复杂。我们把网络定义为互相连接在一起的设备,网络的本质作用还是“端到端”的通信,然而希望互相通信的设备并不一定要“直接”连接在一起,因此必然需要一些中间的设备负责转发数据,因此就把连接这些中间设备的线缆上跑的协议定义为链路层协议,实际上所谓链路其实就是始发与一个设备,通过一根线,终止于另一个设备。我们把一条链路称为“一跳”。因此一个端到端的网络包含了“很多跳”。
2.TCP和IP协议终止于IP协议,我们已经可以完成一个端到端的通信,为何还需要TCP协议?这是一个问题,理解了这个问题,我们就能理解TCP协议为何成了现在这个样子,为何如此“复杂”,为何又如此简单。
正如其名字所展示的那样,TCP的作用是传输控制,也就是控制端到端的传输,那为何这种控制不在IP协议中实现的。答案很简单,那就是这会增加IP协议的复杂性,而IP协议需要的就是简单。这是什么原因造成的呢?
首先我们认识一下为何IP协议是沙漏的细腰部分。它的下层是繁多的链路层协议,这些链路提供了相互截然不同且相差很远的语义,为了互联这些异构的网络,我们需要一个网络层协议起码要提供一些适配的功能,另外它必然不能提供太多的“保证性的服务”,因为上层的保证性依赖下层的约束性更强的保证性,你永远无法在一个100M吞吐量的链路之上实现的IP协议保证1000M的吞吐量...
IP协议设计为分组转发协议,每一跳都要经过一个中间节点

,路由的设计是TCP/IP网络的另一大创举

,这样,IP协议就无需方向性,路由信息和协议本身不再强关联,它们仅仅通过IP地址来关联,因此,IP协议更加简单。路由器作为中间节点也不能太复杂,这涉及到成本问题,因此路由器只负责选路以及转发数据包。
因此传输控制协议必然需要在端点实现。在我们详谈TCP协议之前,首先要看一下它不能做什么,由于IP协议不提供保证,TCP也不能提供依赖于IP下层链路的这种保证,比如带宽,比如时延,这些都是链路层决定的,既然IP协议无法修补,TCP也不能,然而它却能修正始于IP层的一些“不可保证性质”,这些性质包括IP层的不可靠,IP层的不按顺序,IP层的无方向/无连接。
将该小节总结一下,TCP/IP模型从下往上,功能增加,需要实现的设备减少,然而设备的复杂性却在增加,这样保证了成本的最小化,至于性能或者因素,靠软件来调节吧,TCP协议就是这样的软件,实际上最开始的时候,TCP并不考虑性能,效率,公平性,正是考虑了这些,TCP协议才复杂了起来。
3.TCP协议这是一个纯软件协议,为何将其设计上两个端点,参见上一小节,本节详述TCP协议,中间也穿插一些简短的论述。

确切的说,TCP协议有两重身份,作为网络协议,它弥补了IP协议尽力而为服务的不足,实现了有连接,可靠传输,报文按序到达。作为一个主机软件,它和UDP以及左右的传输层协议隔离了主机服务和网络,它们可以被看做是一个多路复用/解复用器,将诸多的主机进程数据复用/解复用到IP层。

可以看出,不管从哪个角度,TCP都作为一个接口存在,作为网络协议,它和对端的TCP接口,实现TCP的控制逻辑,作为多路复用/解复用器,它和下层IP协议接口,实现协议栈的功能,而这正是分层网络协议模型的基本定义(两类接口,一类和下层接口,另一类和对等层接口)。
我们习惯于将TCP作为协议栈的最顶端,而不把应用层协议当成协议栈的一部分,这部分是因为应用层被TCP/UDP解复用了之后,呈现出了一种太复杂的局面,应用层协议用一种不同截然不同的方式被解释,应用层协议习惯于用类似ASN.1标准来封装,这正体现了TCP协议作为多路复用/解复用器的重要性,由于直接和应用接口,它可以很容易直接被应用控制,实现不同的传输控制策略,这也是TCP被设计到离应用不太远的地方的原因之一。

TCP要点有四,一曰有连接,二曰可靠传输,三曰数据按照到达,四曰端到端流量控制。

注意,TCP被设计时只保证这四点,此时它虽然也有些问题,然而很简单,然而更大的问题很快呈现出来,使之不得不考虑和IP网络相关的东西,比如公平性,效率,因此增加了拥塞控制,这样TCP就成了现在这个样子。
3.2.有连接,可靠传输,数据按序到达的TCPIP协议是没有方向的,数据报传输能到达对端全靠路由,因此它是一跳一跳地到达对端的,只要有一跳没有到达对端的路由,那么数据传输将失败,其实路由也是互联网的核心之一,实际上IP层提供的核心基本功能有两点,第一点是地址管理,第二点就是路由选路。TCP利用了IP路由这个简单的功能,因此TCP不必考虑选路,这又一个它被设计成端到端协议的原因。
既然IP已经能尽力让单独的数据报到达对端,那么TCP就可以在这种尽力而为的网络上实现其它的更加严格的控制功能。TCP给无连接的IP网络通信增加了连接性,确认了已经发送出去的数据的状态,并且保证了数据的顺序。
3.2.1.有连接这是TCP的基本,因为后续的传输的可靠性以及数据顺序性都依赖于一条连接,这是最简单的实现方式,因此TCP被设计成一种基于流的协议,既然TCP需要事先建立连接,之后传输多少数据就无所谓了,只要是同一连接的数据能识别出来即可。
疑难杂症1:3次握手和4次挥手
TCP使用3次握手建立一条连接,该握手初始化了传输可靠性以及数据顺序性必要的信息,这些信息包括两个方向的初始序列号,确认号由初始序列号生成,使用3次握手是因为3次握手已经准备好了传输可靠性以及数据顺序性所必要的信息,该握手的第3次实际上并不是需要单独传输的,完全可以和数据一起传输。
TCP使用4次挥手拆除一条连接,为何需要4次呢?因为TCP是一个全双工协议,必须单独拆除每一条信道。注意,4次挥手和3次握手的意义是不同的,很多人都会问为何建立连接是3次握手,而拆除连接是4次挥手。3次握手的目的很简单,就是分配资源,初始化序列号,这时还不涉及数据传输,3次就足够做到这个了,而4次挥手的目的是终止数据传输,并回收资源,此时两个端点两个方向的序列号已经没有了任何关系,必须等待两方向都没有数据传输时才能拆除虚链路,不像初始化时那么简单,发现SYN标志就初始化一个序列号并确认SYN的序列号。因此必须单独分别在一个方向上终止该方向的数据传输。

原因很简单,那就是每次建立连接的时候序列号都是随机产生的,并且这个序列号是32位的,会回绕。

现在我来解释这和TIME_WAIT有什么关系。
任何的TCP分段都要在尽力而为的IP网络上传输,中间的路由器可能会随意的缓存任何的IP数据报,它并不管这个IP数据报上被承载的是什么数据,然而根据经验和互联网的大小,一个IP数据报最多存活MSL(这是根据地球表面积,电磁波在各种介质中的传输速率以及IP协议的TTL等综合推算出来的,如果在火星上,这个MSL会大得多...)。
现在我们考虑终止连接时的被动方发送了一个FIN,然后主动方回复了一个ACK,然而这个ACK可能会丢失,这会造成被动方重发FIN,这个FIN可能会在互联网上存活MSL。
如果没有TIME_WAIT的话,假设连接1已经断开,然而其被动方最后重发的那个FIN(或者FIN之前发送的任何TCP分段)还在网络上,然而连接2重用了连接1的所有的5元素(源IP,目的IP,TCP,源端口,目的端口),刚刚将建立好连接,连接1迟到的FIN到达了,这个FIN将以比较低但是确实可能的概率终止掉连接2.
为何说是概率比较低呢?这涉及到一个匹配问题,迟到的FIN分段的序列号必须落在连接2的一方的期望序列号范围之内。虽然这种巧合很少发生,但确实会发生,毕竟初始序列号是随机产生了。因此终止连接的主动方必须在接受了被动方且回复了ACK之后等待2*MSL时间才能进入CLOSE状态,之所以乘以2是因为这是保守的算法,最坏情况下,针对被动方的ACK在以最长路线(经历一个MSL)经过互联网马上到达被动方时丢失。
为了应对这个问题,RFC793对初始序列号的生成有个建议,那就是设定一个基准,在这个基准之上搞随机,这个基准就是时间,我们知道时间是单调递增的。然而这仍然有问题,那就是回绕问题,如果发生回绕,那么新的序列号将会落到一个很低的值。因此最好的办法就是避开“重叠”,其含义就是基准之上的随机要设定一个范围。
要知道,很多人很不喜欢看到服务器上出现大量的TIME_WAIT状态的连接,因此他们将TIME_WAIT的值设置的很低,这虽然在大多数情况下可行,然而确实也是一种冒险行为。最好的方式就是,不要重用一个连接。
疑难杂症3:重用一个连接和重用一个套接字
这是根本不同的,单独重用一个套接字一般不会有任何问题,因为TCP是基于连接的。比如在服务器端出现了一个TIME_WAIT连接,那么该连接标识了一个五元素,只要客户端不使用相同的源端口,连接服务器是没有问题的,因为迟到的FIN永远不会到达这个连接。记住,一个五元素标识了一个连接,而不是一个套接字(当然,对于BSD套接字而言,服务端的accept套接字确实标识了一个连接)。
3.2.2.传输可靠性基本上传输可靠性是靠确认号实现的,也就是说,每发送一个分段,接下来接收端必然要发送一个确认,发送端收到确认后才可以发送下一个字节。这个原则最简单不过了,教科书上的“停止-等待”协议就是这个原则的字节版本,只是TCP使用了滑动窗口机制使得每次不一定发送一个字节,但是这是后话,本节仅仅谈一下确认的超时机制。
怎么知道数据到达对端呢?那就是对端发送一个确认,但是如果一直收不到对端的确认,发送端等多久呢?如果一直等下去,那么将无法发现数据的丢失,协议将不可用,如果等待时间过短,可能确认还在路上,因此等待时间是个问题,另外如何去管理这个超时时间也是一个问题。
疑难杂症4:超时时间的计算
绝对不能随意去揣测超时的时间,而应该给出一个精确的算法去计算。毫无疑问,一个TCP分段的回复到达的时间就是一个数据报往返的时间,因此标准定义了一个新的名词RTT,代表一个TCP分段的往返时间。然而我们知道,IP网络是尽力而为的,并且路由是动态的,且路由器会毫无先兆的缓存或者丢弃任何的数据报,因此这个RTT是需要动态测量的,也就是说起码每隔一段时间就要测量一次,如果每次都一样,万事大吉,然而世界并非如你所愿,因此我们需要找到的恰恰的一个“平均值”,而不是一个准确值。
这个平均值如果仅仅直接通过计算多次测量值取算术平均,那是不恰当的,因为对于数据传输延时,我们必须考虑的路径延迟的瞬间抖动,否则如果两次测量值分别为2和98,那么超时值将是50,这个值对于2而言,太大了,结果造成了数据的延迟过大(本该重传的等待了好久才重传),然而对于98而言,太小了,结果造成了过度重传(路途遥远,本该很慢,结果大量重传已经正确确认但是迟到的TCP分段)。
因此,除了考虑每两次测量值的偏差之外,其变化率也应该考虑在内,如果变化率过大,则通过以变化率为自变量的函数为主计算RTT(如果陡然增大,则取值为比较大的正数,如果陡然减小,则取值为比较小的负数,然后和平均值加权求和),反之如果变化率很小,则取测量平均值。这是不言而喻的,这个算法至今仍然工作的很好。
疑难杂症5:超时计时器的管理-每连接单一计时器
很显然,对每一个TCP分段都生成一个计时器是最直接的方式,每个计时器在RTT时间后到期,如果没有收到确认,则重传。然而这只是理论上的合理,对于大多数操作系统而言,这将带来巨大的内存开销和调度开销,因此采取每一个TCP连接单一计时器的设计则成了一个默认的选择。可是单一的计时器怎么管理如此多的发出去的TCP分段呢?又该如何来设计单一的计时器呢。
设计单一计时器有两个原则:1.每一个报文在长期收不到确认都必须可以超时;2.这个长期收不到中长期不能和测量的RTT相隔太远。因此RFC2988定义一套很简单的原则:

a.发送TCP分段时,如果还没有重传定时器开启,那么开启它。
b.发送TCP分段时,如果已经有重传定时器开启,不再开启它。
c.收到一个非冗余ACK时,如果有数据在传输中,重新开启重传定时器。
d.收到一个非冗余ACK时,如果没有数据在传输中,则关闭重传定时器。

我们看看这4条规则是如何做到以上两点的,根据a和c(在c中,注意到ACK是非冗余的),任何TCP分段只要不被确认,超时定时器总会超时的。然而为何需要c呢?只有规则a存在的话,也可以做到原则1。实际上确实是这样的,但是为了不会出现过早重传,才添加了规则c,如果没有规则c,那么万一在重传定时器到期前,发送了一些数据,这样在定时器到期后,除了很早发送的数据能收到ACK外,其它稍晚些发送的数据的ACK都将不会到来,因此这些数据都将被重传。有了规则c之后,只要有分段ACK到来,则重置重传定时器,这很合理,因此大多数正常情况下,从数据的发出到ACK的到来这段时间以及计算得到的RTT以及重传定时器超时的时间这三者相差并不大,一个ACK到来后重置定时器可以保护后发的数据不被过早重传。
这里面还有一些细节需要说明。一个ACK到来了,说明后续的ACK很可能会依次到来,也就是说丢失的可能性并不大,另外,即使真的有后发的TCP分段丢失现象发生,也会在最多2倍定时器超时时间的范围内被重传(假设该报文是第一个报文发出启动定时器之后马上发出的,丢失了,第一个报文的ACK到来后又重启了定时器,又经过了一个超时时间才会被重传)。虽然这里还没有涉及拥塞控制,但是可见网络拥塞会引起丢包,丢包会引起重传,过度重传反过来加重网络拥塞,设置规则c的结果可以缓解过多的重传,毕竟将启动定时器之后发送的数据的重传超时时间拉长了最多一倍左右。最多一倍左右的超时偏差做到了原则2,即“这个长期收不到中长期不能和测量的RTT相隔太远”。
还有一点,如果是一个发送序列的最后一个分段丢失了,后面就不会收到冗余ACK,这样就只能等到超时了,并且超时时间几乎是肯定会比定时器超时时间更长。如果这个分段是在发送序列的靠后的时间发送的且和前面的发送时间相隔时间较远,则其超时时间不会很大,反之就会比较大。
疑难杂症6:何时测量RTT
目前很多TCP实现了时间戳,这样就方便多了,发送端再也不需要保存发送分段的时间了,只需要将其放入协议头的时间戳字段,然后接收端将其回显在ACK即可,然后发送端收到ACK后,取出时间戳,和当前时间做算术差,即可完成一次RTT的测量。
3.2.3.数据顺序性基本上传输可靠性是靠序列号实现的。
疑难杂症7:确认号和超时重传
确认号是一个很诡异的东西,因为TCP的发送端对于发送出去的一个数据序列,它只要收到一个确认号就认为确认号前面的数据都被收到了,即使前面的某个确认号丢失了,也就是说,发送端只认最后一个确认号。这是合理的,因为确认号是接收端发出的,接收端只确认按序到达的最后一个TCP分段。
另外,发送端重发了一个TCP报文并且接收到该TCP分段的确认号,并不能说明这个重发的报文被接收了,也可能是数据早就被接收了,只是由于其ACK丢失或者其ACK延迟到达导致了超时。值得说明的是,接收端会丢弃任何重复的数据,即使丢弃了重复的数据,其ACK还是会照发不误的。
标准的早期TCP实现为,只要一个TCP分段丢失,即使后面的TCP分段都被完整收到,发送端还是会重传从丢失分段开始的所有报文,这就会导致一个问题,那就是重传风暴,一个分段丢失,引起大量的重传。这种风暴实则不必要的,因为大多数的TCP实现中,接收端已经缓存了乱序的分段,这些被重传的丢失分段之后的分段到达接收端之后,很大的可能性是被丢弃。关于这一点在拥塞控制被引入之后还会提及(问题先述为快:本来报文丢失导致超时就说明网络很可能已然拥塞,重传风暴只能加重其拥塞程度)。
疑难杂症8:乱序数据缓存以及选择确认
TCP是保证数据顺序的,但是并不意味着它总是会丢弃乱序的TCP分段,具体会不会丢弃是和具体实现相关的,RFC建议如果内存允许,还是要缓存这些乱序到来的分段,然后实现一种机制等到可以拼接成一个按序序列的时候将缓存的分段拼接,这就类似于IP协议中的分片一样,但是由于IP数据报是不确认的,因此IP协议的实现必须缓存收到的任何分片而不能将其丢弃,因为丢弃了一个IP分片,它就再也不会到来了。
现在,TCP实现了一种称为选择确认的方式,接收端会显式告诉发送端需要重传哪些分段而不需要重传哪些分段。这无疑避免了重传风暴。
疑难杂症9:TCP序列号的回绕的问题
TCP的序列号回绕会引起很多的问题,比如序列号为s的分段发出之后,m秒后,序列号比s小的序列号为j的分段发出,只不过此时的j比上一个s多了一圈,这就是回绕问题,那么如果这后一个分段到达接收端,这就会引发彻底乱序-本来j该在s后面,结果反而到达前面了,这种乱序是TCP协议检查不出来的。我们仔细想一下,这种情况确实会发生,数据分段并不是一个字节一个字节发送出去的,如果存在一个速率为1Gbps的网络,TCP发送端1秒会发送125MB的数据,32位的序列号空间能传输2的32次方个字节,也就是说32秒左右就会发生回绕,我们知道这个值远小于MSL值,因此会发生的。
有个细节可能会引起误会,那就是TCP的窗口大小空间是序列号空间的一半,这样恰好在满载情况下,数据能填满发送窗口和接收窗口,序列号空间正好够用。然而事实上,TCP的初始序列号并不是从0开始的,而是随机产生的(当然要辅助一些更精妙的算法),因此如果初始序列号比较接近2的32次方,那么很快就会回绕。
当然,如今可以用时间戳选项来辅助作为序列号的一个识别的部分,接收端遇到回绕的情况,需要比较时间戳,我们知道,时间戳是单调递增的,虽然也会回绕,然而回绕时间却要长很多。这只是一种策略,在此不详谈。还有一个很现实的问题,理论上序列号会回绕,但是实际上,有多少TCP的端点主机直接架设在1G的网络线缆两端并且接收方和发送方的窗口还能恰好被同时填满。另外,就算发生了回绕,也不是一件特别的事情,回绕在计算机里面太常见了,只需要能识别出来即可解决,对于TCP的序列号而言,在高速网络(点对点网络或者以太网)的两端,数据发生乱序的可能性很小,因此当收到一个序列号突然变为0或者终止序列号小于起始序列号的情况后,很容易辨别出来,只需要和前一个确认的分段比较即可,如果在一个经过路由器的网络两端,会引发IP数据报的顺序重排,对于TCP而言,虽然还会发生回绕,也会慢得多,且考虑到拥塞窗口(目前还没有引入)一般不会太大,窗口也很难被填满到65536。
3.2.4.端到端的流量控制端到端的流量控制使用滑动窗口来实现。滑动窗口的原理非常简单,基本就是一个生产者/消费者模型
疑难杂症10:流量控制的真实意义
很多人以为流量控制会很有效的协调两端的流量匹配,确实是这样,但是如果你考虑到网络的利用率问题,TCP的流量控制机制就不那么完美了,造成这种局面的原因在于,滑动窗口只是限制了最大发送的数据,却没有限制最小发送的数据,结果导致一些很小的数据被封装成TCP分段,报文协议头所占的比例过于大,造成网络利用率下降,这就引出了接下来的内容,那就是端到端意义的TCP协议效率。
终于到了阐述问题的时候了,以上的TCP协议实现的非常简单,这也是TCP的标准实现,然而很快我们就会发现各种各样的问题。这些问题导致了标准化协会对TCP协议进行了大量的修补,这些修补杂糅在一起让人们有些云里雾里,不知所措。本文档就旨在分离这些杂乱的情况,实际上,根据RFC,这些杂乱的情况都是可以找到其单独的发展轨迹的。

4.端到端意义上的TCP协议效率 4.1.三个问题以及解决

问题1描述:接收端处理慢,导致接收窗口被填满

这明显是速率不匹配引发的问题,然而即使速率不匹配,只要滑动窗口能协调好它们的速率就好,要快都快,要慢都慢,事实上滑动窗口在这一点上做的很好。但是如果我们不得不从效率上来考虑问题的话,事实就不那么乐观了。考虑此时接收窗口已然被填满,慢速的应用程序慢腾腾的读取了一个字节,空出一个位置,然后通告给TCP的发送端,发送端得知空出一个位置,马上发出一个字节,又将接收端填满,然后接收应用程序又一次慢腾腾...这就是糊涂窗口综合症,一个大多数人都很熟悉的词。这个问题极大的浪费了网络带宽,降低了网络利用率。好比从大同拉100吨煤到北京需要一辆车,拉1Kg煤到北京也需要一辆车(超级夸张的一个例子,请不要相信),但是一辆车开到北京的开销是一定的...

对于问题1,很显然问题出在接收端,我们没有办法限制发送端不发送小分段,但是却可以限制接收端通告小窗口,这是合理的,这并不影响应用程序,此时经典的延迟/吞吐量反比律将不再适用,因为接收窗口是满的,其空出一半空间表示还有一半空间有数据没有被应用读取,和其空出一个字节的空间的效果是一样的,因此可以限制接收端当窗口为0时,直接通告给发送端以阻止其继续发送数据,只有当其接收窗口再次达到MSS的一半大小的时候才通告一个不为0的窗口,此前对于所有的发送端的窗口probe分段(用于探测接收端窗口大小的probe分段,由TCP标准规定),全部通告窗口为0,这样发送端在收到窗口不为0的通告,那么肯定是一个比较大的窗口,因此发送端可以一次性发出一个很大的TCP分段,包含大量数据,也即拉了好几十吨的煤到北京,而不是只拉了几公斤。
即,限制窗口通告时机,解决糊涂窗口综合症

问题2描述:发送端持续发送小包,导致窗口闲置

这明显是发送端引起的问题,此时接收端的窗口开得很大,然而发送端却不积累数据,还是一味的发送小块数据分段。只要发送了任和的分段,接收端都要无条件接收并且确认,这完全符合TCP规范,因此必然要限制发送端不发送这样的小分段。

问题2解决:Nagle算法

Nagel算法很简单,标准的Nagle算法为:
IF 数据的大小和窗口的大小都超过了MSS
Then 发送数据分段
IF 还有发出的TCP分段的确认没有到来
Then 积累数据到发送队列的末尾的TCP分段
可是后来,这个算法变了,变得更加灵活了,其中的:
IF 还有发出的TCP分段的确认没有到来
IF 还有发出的不足MSS大小的TCP分段的确认没有到来
这样如果发出了一个MSS大小的分段还没有被确认,后面也是可以随时发送一个小分段的,这个改进降低了算法对延迟时间的影响。这个算法体现了一种自适应的策略,越是确认的快,越是发送的快,虽然Nagle算法看起来在积累数据增加吞吐量的同时也加大的时延,可事实上,如果对于类似交互式的应用,时延并不会增加,因为这类应用回复数据也是很快的,比如Telnet之类的服务必然需要回显字符,因此能和对端进行自适应协调。
注意,Nagle算法是默认开启的,但是却可以关闭。如果在开启的情况下,那么它就严格按照上述的算法来执行。
问题3.确认号(ACK)本身就是不含数据的分段,因此大量的确认号消耗了大量的带宽
这是TCP为了确保可靠性传输的规范,然而大多数情况下,ACK还是可以和数据一起捎带传输的。如果没有捎带传输,那么就只能单独回来一个ACK,如果这样的分段太多,网络的利用率就会下降。从大同用火车拉到北京100吨煤,为了确认煤已收到,北京需要派一辆同样的火车空载开到大同去复命,因为没有别的交通工具,只有火车。如果这位复命者刚开着一列火车走,又从大同来了一车煤,这拉煤的哥们儿又要开一列空车去复命了。

RFC建议了一种延迟的ACK,也就是说,ACK在收到数据后并不马上回复,而是延迟一段可以接受的时间,延迟一段时间的目的是看能不能和接收方要发给发送方的数据一起回去,因为TCP协议头中总是包含确认号的,如果能的话,就将ACK一起捎带回去,这样网络利用率就提高了。往大同复命的确认者不必开一辆空载火车回大同了,此时北京正好有一批货物要送往大同,这位复命者搭着这批货的火车返回大同。
如果等了一段可以接受的时间,还是没有数据要发往发送端,此时就需要单独发送一个ACK了,然而即使如此,这个延迟的ACK虽然没有等到可以被捎带的数据分段,也可能等到了后续到来的TCP分段,这样它们就可以取最大者一起返回了,要知道,TCP的确认号是收到的按序报文的最后一个字节的后一个字节。最后,RFC建议,延迟的ACK最多等待两个分段的积累确认。
4.2.分析三个问题之间的关联三个问题导致的结果是相同的,但是要知道它们的原因本质上是不同的,问题1几乎总是出现在接收端窗口满的情况下,而问题2几乎总是发生在窗口闲置的情况下,问题3看起来是最无聊的,然而由于TCP的要求,必须要有确认号,而且一个确认号就需要一个TCP分段,这个分段不含数据,无疑是很小的。
三个问题都导致了网络利用率的降低。虽然两个问题导致了同样的结果,但是必须认识到它们是不同的问题,很自然的将这些问题的解决方案汇总在一起,形成一个全局的解决方案,这就是如今的操作系统中的解决方案。
4.3.问题的杂糅情况疑难杂症11:糊涂窗口解决方案和Nagle算法
糊涂窗口综合症患者希望发送端积累TCP分段,而Nagle算法确实保证了一定的TCP分段在发送端的积累,另外在延迟ACK的延迟的那一会时间,发送端会利用这段时间积累数据。然而这却是三个不同的问题。Nagle算法可以缓解糊涂窗口综合症,却不是治本的良药。
延迟ACK会延长ACK到达发送端的时间,由于标准Nagle算法只允许一个未被确认的TCP分段,那无疑在接收端,这个延迟的ACK是毫无希望等待后续数据到来最终进行积累确认的,如果没有数据可以捎带这个ACK,那么这个ACK只有在延迟确认定时器超时的时候才会发出,这样在等待这个ACK的过程中,发送端又积累了一些数据,因此延迟ACK实际上是在增加延迟的代价下加强了Nagle算法。在延迟ACK加Nagle算法的情况下,接收端只有不断有数据要发回,才能同时既保证了发送端的分段积累,又保证了延迟不增加,同时还没有或者很少有空载的ACK。
要知道,延迟ACK和Nagle是两个问题的解决方案。
疑难杂症13:到底何时可以发送数据
到底何时才能发送数据呢?如果单从Nagle算法上看,很简单,然而事实证明,情况还要更复杂些。如果发送端已经排列了3个TCP分段,分段1,分段2,分段3依次被排入,三个分段都是小分段(不符合Nagle算法中立即发送的标准),此时已经有一个分段被发出了,且其确认还没有到来,请问此时能发送分段1和2吗?如果按照Nagle算法,是不能发送的,但实际上它们是可以发送的,因为这两个分段已经没有任何机会再积累新的数据了,新的数据肯定都积累在分段3上了。问题在于,分段还没有积累到一定大小时,怎么还可以产生新的分段?这是可能的,但这是另一个问题,在此不谈。
Linux的TCP实现在这个问题上表现的更加灵活,它是这么判断能否发送的(在开启了Nagle的情况下):
IF (没有超过拥塞窗口大小的数据分段未确认 || 数据分段中包含FIN ) &&
数据分段没有超越窗口边界
IF 分段在中间(上述例子中的分段1和2) ||
通过上述的Nagle算法(改进后的Nagle算法)
曾经我也改过Nagle算法,确切的说不是修改Nagle算法,而是修改了“到底何时能发送数据”的策略,以往都是发送端判断能否发送数据的,可是如果此时有延迟ACK在等待被捎带,而待发送的数据又由于积累不够或者其它原因不能发送,因此两边都在等,这其实在某些情况下不是很好。我所做的改进中对待何时能发送数据又增加了一种情况,这就是“ACK拉”的情况,一旦有延迟ACK等待发送,判断一下有没有数据也在等待发送,如果有的话,看看数据是否大到了一定程度,在此,我选择的是MSS的一半:
IF (没有超过拥塞窗口大小的数据分段未确认 || 数据分段中包含FIN ) &&
数据分段没有超越窗口边界
IF 分段在中间(上述例子中的分段1和2) ||
通过上述的Nagle算法(改进后的Nagle算法)
发送队列中有待发送的TCP分段 &&
发送队列的头分段大小大于MSS的一半
Then 发送队列头分段且捎带延迟ACK
另外,发送队列头分段的大小是可以在统计意义上动态计算的,也不一定非要是MSS大小的一半。我们发现,这种算法对于交互式网路应用是自适应的,你打字越快,特定时间内积累的分段就越长,对端回复的越快(可以捎带ACK),本端发送的也就越快(以Echo举例会更好理解)。
疑难杂症14:《TCP/IP详解(卷一)》中Nagle算法的例子解读
这个问题在网上搜了很多的答案,有的说RFC的建议,有的说别的。可是实际上这就是一个典型的“竞态问题”:
首先服务器发了两个分段:
然后客户端发了两个分段:
可以看到数据段14本来应该确认56的,但是确认的却是54。也就是说,数据段已经移出队列将要发送但还未发送的时候,数据段13才到来,软中断处理程序抢占了数据段14的发送进程,要知道此时只是把数据段14移出了队列,还没有更新任何的状态信息,比如“发出但未被确认的分段数量”,此时软中断处理程序顺利接收了分段13,然后更新窗口信息,并且检查看有没有数据要发送,由于分段14已经移出队列,下一个接受发送检查的就是分段15了,由于状态信息还没有更新,因此分段15顺利通过发送检测,发送完成。
可以看Linux的源代码了解相关信息,tcp_write_xmit这个函数在两个地方会被调用,一个是TCP的发送进程中,另一个就是软中断的接收处理中,两者在调用中的竞态就会引起《详解》中的那种情况。注意,这种不加锁的发送方式是合理的,也是最高效的,因此TCP的处理语义会做出判断,丢弃一切不该接收或者重复接收的分段的。
又到了该承上启下,到此为止,我们叙述的TCP还都是简单的TCP,就算是简单的TCP,也存在上述的诸多问题,就更别提继续增加TCP的复杂性了。到此为止,我们的TCP都是端到端意义上的,然而实际上TCP要跑在IP网络之上的,而IP网络的问题是很多的,是一个很拥堵网络。不幸的是,TCP的有些关于确认和可靠性的机制还会加重IP网络的拥堵。

5.1.端到端的TCP协议和IP协议之间的矛盾端到端的TCP只能看到两个节点,那就是自己和对方,它们是看不到任何中间的路径的。可是IP网络却是一跳一跳的,它们的矛盾之处在于TCP的端到端流量控制必然会导致网络拥堵。因为每条TCP连接的一端只知道它对端还有多少空间用于接收数据,它们并不管到达对端的路径上是否还有这么大的容量,事实上所有连接的这些空间加在一起将瞬间超过IP网络的容量,因此TCP也不可能按照滑动窗口流量控制机制很理想的运行。
势必需要一种拥塞控制机制,反应路径的拥塞情况。
疑难杂症15:拥塞控制的本质
由于TCP是端到端协议,因此两端之间的控制范畴属于流量控制,IP网络的拥塞会导致TCP分段的丢失,由于TCP看不到中间的路由器,因此这种丢失只会发生中间路由器,当然两个端点的网卡或者IP层丢掉数据分段也是TCP看不到的。因此拥塞控制必然作用于IP链路。事实上我们可以得知,只有在以下情况下拥塞控制才会起作用:

a.两个或两个以上的连接(其中一个一定要是TCP,另一个可以是任意连接)经过同一个路由器或者同一个链路时;
b.只有一个TCP连接,然而它经过了一个路由器时。

其它情况下是不会拥塞的。因为一个TCP总是希望独享整条网络通路,而这对于多个连接而言是不可能的,必须保证TCP的公平性,这样这种拥塞控制机制才合理。本质上,拥塞的原因就是大家都想独享全部带宽资源,结果导致拥塞,这也是合理的,毕竟TCP看不到网络的状态,同时这也决定了TCP的拥塞控制必须采用试探性的方式,最终到达一个足以引起其“反应”的“刺激点”。
拥塞控制需要完成以下两个任务:1.公平性;2.拥塞之后退出拥塞状态。
疑难杂症16:影响拥塞的因素
我们必须认识到拥塞控制是一个整体的机制,它不偏向于任何TCP连接,因此这个机制内在的就包含了公平性。那么影响拥塞的因素都有什么呢?具有讽刺意味的是,起初TCP并没有拥塞控制机制,正是TCP的超时重传风暴(一个分段丢失造成后续的已经发送的分段均被重传,而这些重传大多数是不必要的)加重了网络的拥塞。因此重传必然不能过频,必须把重传定时器的超时时间设置的稍微长一些,而这一点在单一重传定时器的设计中得到了加强。除此TCP自身的因素之外,其它所有的拥塞都可以靠拥塞控制机制来自动完成。
另外,不要把路由器想成一种线速转发设备,再好的路由器只要接入网络,总是会拉低网络的总带宽,因此即使只有一个TCP连接,由于TCP的发送方总是以发送链路的带宽发送分段,这些分段在经过路由器的时候排队和处理总是会有时延,因此最终肯定会丢包的。
最后,丢包的延后性也会加重拥塞。假设一个TCP连接经过了N个路由器,前N-1个路由器都能顺利转发TCP分段,但是最后一个路由器丢失了一个分段,这就导致了这些丢失的分段浪费了前面路由器的大量带宽。
5.2.拥塞控制的策略在介绍拥塞控制之前,首先介绍一下拥塞窗口,它实际上表示的也是“可以发送多少数据”,然而这个和接收端通告的接收窗口意义是不一样的,后者是流量控制用的窗口,而前者是拥塞控制用的窗口,体现了网络拥塞程度。
拥塞控制整体上分为两类,一类是试探性的拥塞探测,另一类则是拥塞避免(注意,不是常规意义上的拥塞避免)。
5.2.1.试探性的拥塞探测分为两类,之一是慢启动,之二是拥塞窗口加性扩大(也就是熟知的拥塞避免,然而这种方式是避免不了拥塞的)。 5.2.2.拥塞避免方式拥塞控制旨在还没有发生拥塞的时候就先提醒发送端,网络拥塞了,这样发送端就要么可以进入快速重传/快速恢复或者显式的减小拥塞窗口,这样就避免网络拥塞的一沓糊涂之后出现超时,从而进入慢启动阶段。 5.2.3.快速重传和快速恢复。所谓快速重传/快速恢复是针对慢启动的,我们知道慢启动要从1个MSS开始增加拥塞窗口,而快速重传/快速恢复则是一旦收到3个冗余ACK,不必进入慢启动,而是将拥塞窗口缩小为当前阀值的一半加上3,然后如果继续收到冗余ACK,则将拥塞窗口加1个MSS,直到收到一个新的数据ACK,将窗口设置成正常的阀值,开始加性增加的阶段。当进入快速重传时,为何要将拥塞窗口缩小为当前阀值的一半加上3呢?加上3是基于数据包守恒来说的,既然已经收到了3个冗余ACK,说明有三个数据分段已经到达了接收端,既然三个分段已经离开了网络,那么就是说可以在发送3个分段了,只要再收到一个冗余ACK,这也说明1个分段已经离开了网络,因此就将拥塞窗口加1个MSS。直到收到新的ACK,说明直到收到第三个冗余ACK时期发送的TCP分段都已经到达对端了,此时进入正常阶段开始加性增加拥塞窗口。
疑难杂症17:超时重传和收到3个冗余ACK后重传
这两种重传的意义是不同的,超时重传一般是因为网络出现了严重拥塞(没有一个分段到达,如果有的话,肯定会有ACK的,若是正常ACK,则重置重传定时器,若是冗余ACK,则可能是个别报文丢失或者被重排序,若连续3个冗余ACK,则很有可能是个别分段丢失),此时需要更加严厉的缩小拥塞窗口,因此此时进入慢启动阶段。而收到3个冗余ACK后说明确实有中间的分段丢失,然而后面的分段确实到达了接收端,这因为这样才会发送冗余ACK,这一般是路由器故障或者轻度拥塞或者其它不太严重的原因引起的,因此此时拥塞窗口缩小的幅度就不能太大,此时进入快速重传/快速恢复阶段。
疑难杂症18:为何收到3个冗余ACK后才重传
这是一种权衡的结构,收到两个或者一个冗余ACK也可以重传,但是这样的话可能或造成不必要的重传,因为两个数据分段发生乱序的可能性不大,超过三个分段发生乱序的可能性才大,换句话说,如果仅仅收到一个乱序的分段,那很可能被中间路由器重排了,那么另一个分段很可能马上就到,然而如果连续收到了3个分段都没能弥补那个缺漏,那很可能是它丢失了,需要重传。

因此3个冗余ACK是一种权衡,在减少不必要重传和确实能检测出单个分段丢失之间所作的权衡。

注意,冗余ACK是不能捎带的。
疑难杂症19:乘性减和加性增的深层含义
为什么是乘性减而加性增呢?拥塞窗口的增加受惠的只是自己,而拥塞窗口减少受益的大家,可是自己却受到了伤害。哪一点更重要呢?我们知道TCP的拥塞控制中内置了公平性,恰恰就是这种乘性减实现了公平性。拥塞窗口的1个MSS的改变影响一个TCP发送者,为了使得自己拥塞窗口的减少影响更多的TCP发送者-让更多的发送者受益,那么采取了乘性减的策略。
当然,BIC算法提高了加性增的效率,不再一个一个MSS的加,而是一次加比较多的MSS,采取二分查找的方式逐步找到不丢包的点,然后加性增。
疑难杂症20:TCP连接的传输稳定状态是什么
首先,先说一下发送端的发送窗口怎么确定,它取的是拥塞窗口和接收端通告窗口的最小值。然后,我们提出三种发送窗口的稳定状态:
a.IP互联网络上接收端拥有大窗口的经典锯齿状
b.IP互联网络上接收端拥有小窗口的直线状态
c.直连网络端点间的满载状态下的直线状态

其中a是大多数的状态,因为一般而言,TCP连接都是建立在互联网上的,而且是大量的,比如Web浏览,电子邮件,网络游戏,Ftp下载等等。TCP发送端用慢启动或者拥塞避免方式不断增加其拥塞窗口,直到丢包的发生,然后进入慢启动或者拥塞避免阶段(要看是由于超时丢包还是由于冗余ACK丢包),此时发送窗口将下降到1或者下降一半,这种情况下,一般接收端的接收窗口是比较大的,毕竟IP网络并不是什么很快速的网络,一般的机器处理速度都很快。
但是如果接收端特别破,处理速度很慢,就会导致其通告一个很小的窗口,这样的话,即使拥塞窗口再大,发送端也还是以通告的接收窗口为发送窗口,这样就不会发生拥塞。最后,如果唯一的TCP连接运行在一个直连的两台主机上,那么它将独享网络带宽,这样该TCP的数据流在最好的情况下将填满网络管道(我们把网络管道定义为带宽和延时的乘积),其实在这种情况下是不存在拥塞的,就像你一个人独自徘徊在飘雨黄昏的街头一样...
5.2.4.主动的拥塞避免前面我们描述的拥塞控制方式都是试探性的检测,然后拥塞窗口被动的进行乘性减,这样在接收端窗口很大的情况下(一般都是这样,网络拥堵,分段就不会轻易到达接收端,导致接收端的窗口大量空置)就可能出现锯齿形状的“时间-窗口”图,类似在一个拥堵的北京X环上开车,发送机发动,车开动,停止,等待,发动机发动,车开动...听声音也能听出来。
虽然TCP看不到下面的IP网络,然而它还是可以通过检测RTT的变化以及拥塞窗口的变化推算出IP网络的拥堵情况的。就比方说北京东四环一家快递公司要持续送快递到西四环,当发件人发现货到时间越来越慢的时候,他会意识到“下班高峰期快到了”...
可以通过持续观测RTT的方式来主动调整拥塞窗口的大小而不是一味的加性增。然而还有更猛的算法,那就是计算两个差值的乘积:
(当前拥塞窗口-上一次拥塞窗口)x(当前的RTT-上一次的RTT)
如果结果是正数,则拥塞窗口减少1/8,若结果是负数或者0,则窗口增加一个MSS。注意,这回不再是乘性减了,可以看出,减的幅度比乘性减幅度小,这是因为这种拥塞控制是主动的,而不是之前的那种被动的试探方式。在试探方式中,乘性减以一种惩罚的方式实现了公平性,而在这里的主动方式中,当意识到要拥塞的时候,TCP发送者主动的减少了拥塞窗口,为了对这种自首行为进行鼓励,采用了小幅减少拥塞窗口的方式。需要注意的是,在拥塞窗口减小的过程中,乘积的前一个差值是负数,如果后一个差值也是负数,那么结果就是继续缩减窗口,直到拥塞缓解或者窗口减少到了一定程度,使得后一个差值成了正数或者0,这种情况下,其实后一个差值只能变为0。
疑难杂症21:路由器和TCP的互动
虽然有了5.2.4节介绍的主动的拥塞检测,那么路由器能不能做点什么帮助检测拥塞呢?这种对路由器的扩展是必要的,要知道,每天有无数的TCP要通过路由器,虽然路由器不管TCP协议的任何事(当然排除连接跟踪之类的,这里所说的是标准的IP路由器),但是它却能以一种很简单的方式告诉TCP的两端IP网络发生了拥堵,

这种方式就是当路由器检测到自己发生轻微拥堵的时候随机的丢包,随机丢包而不是连续丢包对于TCP而言是有重大意义的,随机丢包会使TCP发现丢弃了个别的分段而后续的分段仍然会到达接收端,这样TCP发送端就会接收到3个冗余ACK,然后进入快速重传/快速恢复而不是慢启动。

这就是路由器能帮TCP做的事。
6.其它疑难杂症22:如何学习TCP
很多人发帖问TCP相关的内容,接下来稀里哗啦的就是让看《TCP/IP详解》和《Unix网络编程》里面的特定章节,我觉得这种回答很不负责任。因为我并不认为这两本书有多大的帮助,写得确实很不错,然而可以看出Richard Stevens是一个实用主义者,他喜欢用实例来解释一切,《详解》通篇都是用tcpdump的输出来讲述的,这种方式只是适合于已经对TCP很理解的人,然而大多数的人是看不明白的。
如果想从设计的角度来说,这两本书都很烂。我觉得应该先看点入门的,比如Wiki之类的,然后看RFC文档,793,896,1122等),这样你就明白TCP为何这么设计了,而这些你永远都不能在Richard Stevens的书中得到。最后,如果你想,那么就看一点Richard Stevens的书,最重要的还是写点代码或者敲点命令,然后抓包自己去分析。
我觉得在Linux上写点TCP的代码是很不错的,如果有BSD那就更好了。不推荐用Winsock学习TCP。虽然微软声称自己的API都是为了让事情更简单,但实际上事情却更复杂了,如果你用Winsock学习,你就要花大量的时候去掌握一些和网络编程无关但是windows平台上却少不了的东西
6.1.总结TCP协议是一个端到端的协议,虽然话说它是一个带流量控制,拥塞控制的协议,然而正是因为这些所谓的控制才导致了TCP变得复杂。同时这些特性是互相杂糅的,流量控制带来了很多问题,解决这些问题的方案最终又带来了新的问题,这些问题在解决的时候都只考虑了端到端的意义,但实际上TCP需要尽力而为的IP提供的网络,因此拥塞成了最终的结症,拥塞控制算法的改进也成了一个单独的领域。
在学习TCP的过程中,切忌一锅粥一盘棋的方式,一定要分清楚每一个算法到底是解决什么问题的,每一个问题和其他问题到底有什么关联,这些问题的解决方案之间有什么关联,另外TCP的发展历史也最好了解一下,这些都搞明白了,TCP协议就彻底被你掌控了。接下来你就可以学习Socket API了,然后高效的TCP程序出自你手!

我要回帖

更多关于 c程序编译时,程序中的注释部分 的文章

 

随机推荐