静心学习之路(4)——单独的TCP总结

本质:传输层协议
特点:相对于UDP,面向连接、字节流和可靠传输
TCP头部结构:固定部分20字节(内容略,可选信息有40字节,最长60字节)
TCP建立与关闭:(抓包过程读值m和n都是初始为随机值ISN)

报文段 方向 标志位情况 seq值 ack值 状态说明
1 A>>B SYN m - (主动打开) SYS_SEND >>
2 A<<B SYN n m+1 (被动打开 LISTEN)SYS_RCVD >>
3 A>>B - - n+1 ESTABLISHED >> ESTABLISHED
4 A>>B FIN m+1 n+1 (主动关闭)FIN_WAIT_1 >>
5 A<<B - - m+2 (被动关闭)CLOSE_WAIT >> FIN_WAIT_2
6 A<<B FIN n+2 m+2 LAST_ACK >>
7 A>>B - - n+3 TIME_WAIT >> CLOSED

TIME_WAIT状态

意义:理论上报文段5是不需要的,因为报文段6已经包含确认信息。但是需要存在一个状态,使得:
1.可靠的终止TCP连接(如果没有报文5,那么报文6回复时A端就直接跳过TIME_WAIT进入CLOSED状态,如果次数发生了发生了报文段7丢失的情况,那么报文6一直会重复发送,此时A端已经closed所以会发送复位报文段导致B端错误)
2.让迟来的TCP报文have enough time to abort(使后来连接同一个ip和端口的端不会收到之前连接的报文)

持续时间:TIME_WAIT要持续2MSL才会进入CLOSED。MSL是TCP报文段在网络中的最大生存时间,RFC1122的建议值是2min。(也就是说高并发下会疯狂占用资源- -)

复位报文段

TCP头里的标志位:RST
功能:通知对方关闭连接或者重新建立连接

产生的情况:
1.访问了不存在的端口:此时目标会给sender回应一个复位报文段,sender应该关闭或者重新连接。实际上端口处于TIME_WAIT时也会收到复位报文段。
2.异常终止连接:用发送复位报文段而不是发送结束报文段的方法来终止连接,此时发送端排队发送的数据会被全部丢弃。
3.处理半打开连接:一方因为异常而终止连接,而另一方还维持着,称之为半打开状态。半打开状态的如果往连接里写入数据,则对方回应一个复位报文段。

TCP交互数据流

以telnet登录本机,用shell执行ls命令为例,下面是抓包情况:
(win值:窗口大小,告诉对方本端还能接受多少字节以控制TCP流量,seq和ack第一行后都为偏移值)

报文段 方向 标志位情况 seq值 ack值 length值 状态说明
1 A>>B PSH m:m+1 n 1 client发送'l'字母
2 A<<B PSH n+1:n+2 m+1 1 server确认1并回显字母'l'
3 A>>B - - n+2 0 client确认2
4 A>>B PSH m+1:m+2 n+2 1 client发送's'字母
5 A<<B PSH n+2:n+3 m+2 1 server确认4并回显字母's'
6 A>>B - - n+3 0 client确认5
7 A>>B PSH m+2:m+4 n+3 2 client发送回车和EOF
8 A<<B PSH n+3:n+176 m+4 173 server返回ls命令的结果
9 A>>B - - n+176 0 client确认8
10 A<<B PSH n+176:n+228 m+4 52 server返回一个回车+换行符+PS1环境变量
11 A>>B - - n+228 0 client确认10

因为客户端输入速度远远小于服务器处理速度,所以服务器通常使用延迟确认(报文2,5,8,10)以减少发包数。
Nagle算法了解下。

TCP 成块数据流

考虑用FTP传输一个大文件,启动vsftpd服务器程序,并执行ftp登录它,然后再ftp中输入get命令从服务器上下载一个几百m的大文件,同时进行抓包。
抓包过程可以看出,当传输大块数据时,发送方会连续发送多个TCP报文段,接受方可以一次性确认所有这些报文段。那么问题就是在确认之前能够连续发送多少包了。
能够连续发送的TCP报文段数量n是由确认的接受通告窗口(win值)决定的,n=win值 *64字节(窗口扩大因子为6时) / length值。
另外每4个TCP报文段会带一个PSH标志,以通知客户端应用尽快读取数据,不过好像没啥用,因为它知道win值不为0。

带外数据

Out of Band,OOB,比普通数据有更高的优先级,无视队列立刻发送。用的不多,了解即可。

TCP超时重传

TCP要保证可靠性就必须要处理超时或者丢包的情况。

设定iperf服务器程序,然后执行telnet登录改服务器程序,之后发送一些数据给服务器,然后断开服务器的网线并再发一些数据,同时进行tcpdump抓包。

在抓包时时保留时间戳以推测TCP的超时重传策略,因此重传的5次报文的时间间隔分别为0.2s、0.4s、0.8s、1.6s和3.2s,可见TCP一共进行5次重传,每次的重传超时时间都会增加一倍。5次失败之后有IP和ARP接管,直到telnet客户端放弃为止。在实例中TCP连接超时后坚持了15min。

拥塞控制

本质:一个闭环反馈控制,标准文档RFC 5681。一次写入的数据量称为SWND(Send Window,发送窗口),由RWND(Receive Window,即win值)和CWND(Congestion Window,发送方引入的拥塞窗口)的较小值决定。SWND太小导致网络延迟,太大导致网络阻塞。

慢启动和拥塞避免:CWND被初始化为IW(Intial Window,大小为2~4个SMSS,即发送者最大段大小),此后发送端没收到一个接受端的确认,CWND就按照以下公式增加:CWND+=(N,SMSS),N就是包含之前未被确认的字节数。这样一来没有其他条件的话,CWND会指数增加(看来慢启动其实并不慢)。
为了避免慢启动过快导致网络阻塞,需要定义一个慢启动门限(slow start threshold size, ssthresh)。拥塞避免算法使得CWND按照线性增加,从而减缓其扩大。RFC 5681中提到了两种实现方式,自行了解。最后一提,当传输超时或者TCP重传定时器溢出时使用慢启动和拥塞避免,但是当接收到重复的确认报文段时将使用快速重传和快速恢复,但是第二种情况发生在定时重传器溢出的话也当做第一种情况处理。
如果是第一种情况,即传输超时,就执行重传并做一下ssthresh的调整(式1):
ssthresh = max(FlightSize/2, 2*SMSS)
FlightSize为已经发送但是没被确认的字节数。这样调整后CWMD将小于SMSS,也小于调整后的ssthresh,从而再进入慢启动阶段。

快速重传和快速恢复:发送端收到3个重复的确认报文段后,就认为拥塞发生了,然后用快速重传和快速恢复算法来处理拥塞,过程如下:
1.ssthresh按照(式1)重新计算,然后立即重传丢失的报文段,并重新设置CWND=ssthresh+3*SMSS。
2.每再收到1个重复的确认时,设置CWND+=SMSS,此时发送端可以发送新的TCP报文段。
3.新数据被确认时,设置CWND=ssthresh
快速重传和快速恢复完成后将恢复到拥塞避免阶段。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,132评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,802评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,566评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,858评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,867评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,695评论 1 282
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,064评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,705评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,915评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,677评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,796评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,432评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,041评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,992评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,223评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,185评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,535评论 2 343