系列文前言:这是一个系列,得瑟学习系列,源于***座追求完美的心态,在09年的时候我心血来潮弄了个58章节学习计划并开始写相对应的学习笔记,从基础的TCP/IP协议到数据中心技术,大而全。 但一直未能完成多少。
本文前言:本文不是学习笔记,只是记录了我自己在2014年对TCP协议的理解,最多算一篇怡情逸景的技术类小散文,如有错漏还请各位大牛指出。
------------此处是分界线---------------
言归正传,本文TCP协议仅指TCP/IP协议栈(TCP在前噢)一大趴协议里的TCP协议,很狭隘。可能有人要问TCP这玩意太底层学了能跟OSPF或EIGRP这样的路由协议一样各大企事业单位随便整方案和配置吗?答案是不行的。那为什么还要学呢?或者说TCP协议我们网络攻城狮有学习的意义吗?答案这回是肯定有。小举几个联系十分紧密的例子:广域网优化加速(如LFN里的BDP)、性能分析设备(TCP连接时间戳)、DDOS(如syn flood)。再举几个相对紧密的例子:BGP(如PMTU),F5上tcp profile和one connect,甚至安全类设备上限速用到的滑动窗口。
既然有意义了,那开始学吧。
首先暴力从神似沙漏的TCP/IP 4层和 OSI 7层模型里都有的传输层直接切入到TCP包头(长度等)和字段(尤其关注冷僻Option角落,熟悉这个在用抓包工具或者tcpdump的时候不会抓瞎),而不带关心TCP出现的历史和发展,这样的问题在于1、已经有IP可以寻址并能完成一个端到端的通信还需要TCP来建连接吗?2、每台服务器理论上能建立多少TCP连接?这样的问题会回答的似是而非,充满疑惑。只能再重头看看TCP历史。
然后进入到协议细节,从面向连接的三次握手到优雅关闭的四次握手、从ACK/FIN到MSS/MTU再到2MSL、从可靠传输的最有魅力的滑动窗口到各种计时器和多种重传机制、无私的拥塞控制从慢启动到拥塞避免再到快速恢复、从SACK到Reno再到Nagle、以及超多的拥塞算法(HSTCP、BI-TCP、CUBIC TCP、FastTCP、TCP-Westwood、TFRC、DCCP等),TCP的世界里从来不缺乏的一堆堆的概念让人找不着北。但是如果我说这仅仅是简单的部分,大菜还没上的话。。。比如选择性确认的SACK算法和用于流控上及时回显的Nagle算法(典型应用于TELNET,RFC 896定义)冲突吗不冲突吗?再比如NewReno为什么不支持SACK?
接下来必须会碰到TCP存在的一些问题了,这些问题在实际环境中感受不多,但每个研究TCP的人(除了写TCP相关RFC的那些)绝壁会痛诉TCP的各种问题,比如直斥设计者目光短浅在安全性上几乎不考虑、比如TCP RTT的相对公平的应用不公平性、再比如TCP在面对丢包和延迟时(尤其长距离广域网)所表现出的脆弱和无解。有问题自然不缺乏牛人拿出解决方法,从TCP成为标准开始国外的对TCP优化再到上一个10年国内的各种优化论文和专利(时间上差距大了点,但国内的优化方面更符合国情),最终的结果是TCP为解决问题出的新办法又接着遇到各种新问题,以及广域网加速产品的喷涌而出。但是TCP在安全性上的问题(各种握手无身份验证、传输无加密等)却始终无法解决(RFC 5925 TCP Authentication option有指导,但你懂的,大家都不这样我家的这样,兼容性怎么办,此处挖坑静候下一个"Heartbleed")。
再往后Win系统和Linux系统内核对于TCP的具体实现大相径庭(基于Win源码未知和用WinSoket编程需要先搞一堆WIN平台独有而和TCP无关的东西得出的结论...),Linux内核里的TCP/UDP层如何将TCP协议的具体实现一展无余,以上的种种概念此处皆转化为代码,具体如TCP Socket、分配内存空间、ehash\bhash表、tcpprobe等。很多企业运维攻城狮(尤其互联网企业的系统攻城狮占多)轮番对内核参数进行优化。(我擦,真的没网络攻城狮啥活吗?)
最后在互联网\APP大发展的今天,从视频类应用开启TCP之旅,微信等短信息应用(发送长度小于MSS的小包 )使用TCP长连接、 到APPLE采用了MultipathTCP,再到3G\4G\无线环境下TCP急需优化、部分HTTP应用准备放弃TCP。得失之间,TCP之路路在何方?