TCP协议基础知识

TCP连接简介

  • TCP报文包括TCP首部和TCP数据部分,被包装成为IP传输数据,是一种基于连接的字节流传输协议
  • 大小通常为20字节
  • TCP/IP协议族:


    TCP-IP协议族.jpg

TCP技术详述

TCP报文格式

  1. 序号:32位的Seq序号,标识从TCP源端向目的端发送的字节流,发送方发送数据时进行标记
  2. 确认号:32位的Ack序号,Ack=Seq+1,只有当Ack标志位为1时,该Ack确认号才有效;确认号表示发出方希望获得的对方下一次报文的Seq序号
  3. 标志位:6个标志位,分别是URG、ACK、PSH、RST、SYN、FIN,含义如下
  • URG:紧急指针(urgent pointer)有效
  • ACK:确认序号(Ack)有效
  • PSH:接收方应该尽快将报文交给应用层
  • RST:重置连接
  • SYN:发起一个新连接
  • FIN:释放一个连接
  • TCP报文结构图:


    TCP数据包.png

TCP三次握手

三次握手(Three-way Handshake),指的是建立一个TCP连接时,需要客户端和服务器发送三个包

其目的是连接服务器指定端口,建立TCP连接,并同步连接双方的序列号和确认号并交换 TCP 窗口大小信息

在socket编程中,客户端执行connect()时,将触发三次握手:

  1. 第一次握手:
  • client发送syn报文(此时SYN标志位为1),将自己的序号Seq设置为X
  • client当前状态:SYN-SENT(同步发送)
  • server当前状态:LISTEN(监听)
  • 该报文不携带数据,消耗一个序号
  1. 第二次握手:
  • server发回确认包进行应答,SYN标志位和ACK标志位均为1,将确认序号Ack设置为X+1,自己的序号Seq设置为Y
  • server当前状态:SYN-RCVD(同步收到)
  • client当前状态:ESTABLISHED(连接状态)
  • 该报文不携带数据,消耗一个序号
  1. 第三次握手:
  • client再次发送确认包,SYN标志位回置为0,ACK标志位为1,将确认序号Ack设置为Y+1
  • server当前状态:ESTABLISHED(连接状态)
  • client当前状态:ESTABLISHED(连接状态)
  • 该报文可携带数据,携带数据时需消耗一个序号

TCP四次挥手

四次挥手(four-way handshake),客户端或服务器均可主动发起挥手动作,在socket编程中,任何一方执行close()操作即可产生挥手操作。

  1. 第一次挥手:
  • 主动方发送FIN+ACK报文,FIN标志位为1,ACK标志位为1,Ack设置为Z,序号Seq为U
  • 主动方状态:FIN-WAIT-1(终止等待1)
  • 被动方状态:ESTABLISHED(连接状态)
  • 该报文即使不携带数据也要消耗一个序号
  1. 第二次挥手:
  • 被动方发出Ack报文,ACK=1,Ack设置为U+1,序号Seq=V
  • 被动方状态:CLOSE-WAIT(关闭等待)
  • 主动方状态:FIN-WAIT-2(终止等待2),此时主动方还需接收被动方发送的最后数据
  1. 第三次挥手:
  • 被动方最后的数据发送完成后,向主动方发送连接释放报文,FIN=1,Ack设置为U+1,序号Seq=W
  • 被动方状态:LAST-ACK(最后确认)
  • 主动方状态:FIN-WAIT-2(终止等待2)
  1. 第四次挥手:
  • 主动方发出ACK报文,ACK=1,Ack设置为W+1,序号为U+1
  • 主动方状态:TIME-WAIT(时间等待)
  • 被动方状态:CLOSED(关闭状态)

注:若客户端为主动方发送完最后一个ACK报文后,TCP连接还没有释放,必须经过2∗MSL(最长报文段寿命)的时间后,当客户端撤销相应的TCB后才进入CLOSED状态,而服务器在接到客户端的Ack报文后马上进入CLOSED状态

三次握手和四次挥手完整示意图:


三次握手四次挥手.jpg

MSL(Maximum Segment Lifetime)最长报文段寿命,TCP允许不同的实现可以设置不同的MSL值

1)确保客户端发出的最后一个ACK报文能够传达到服务器,防止丢失
2)防止类似与“三次握手”中提到了的“已经失效的连接请求报文段”出现在本连接中

为什么建立连接是三次握手,关闭连接确是四次挥手呢?

服务器收到客户端的断开连接的FIN+ACK时,仅表示客户端不再发送数据,但还能接受数据,所以服务器在进行回发确认ACK报文后,还可以传输一些剩余数据,传输完成后再发送FIN报文,表示数据传输完了,连接可以关闭了,因此是四次挥手

建立连接后客户端故障怎么办

TCP还设有一个保活计时器,显然,客户端如果出现故障,服务器不能一直等下去,白白浪费资源。服务器每收到一次客户端的请求后都会重新复位这个计时器,时间通常是设置为2小时,若两小时还没有收到客户端的任何数据,服务器就会发送一个探测报文段,以后每隔75分钟发送一次。若一连发送10个探测报文仍然没反应,服务器就认为客户端出了故障,接着就关闭连接。

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

推荐阅读更多精彩内容