TCP简介

一、定义

传输控制协议(TCP,Transmission Control Protocol)是一种面向连接的、可靠的、基于字节流的传输层通信协议。它是在传输层。

二、结构

TCP报头.png

源端口和目的端口(各2byte)

即数据发送端口和数据接收端口

序号 Sequence Number (4byte)

TCP用序列号对数据包进行标记,以便在到达目的地后重新重装,假设当前的序列号为 s,发送数据长度为 l,则下次发送数据时的序列号为 s + l。在建立连接时通常由计算机生成一个随机数作为序列号的初始值。

确认号 Acknowledgemt Number (4byte)

表示期望收到对方下一个报文段的序号值。 TCP 的可靠性,是建立在「每一个数据报文都需要确认收到」的基础之上的。

数据偏移 Offset (0.5byte 4位)

它指出了 TCP报文段的数据起始处距离TCP报文的起始处有多远,即TCP报头长度。

保留 Reserved(0.75byte 6位)

保留为今后使用,但目前应置为 0。但为了支持ECN(一种端到端的拥塞通知机制),TCP使用了后三位的3个标志位:Nonce Sum (NS)ECN-Echo (ECE)Congestion Window Reduced (CWR),在wireshark抓包里也能看到。

标志位 TCP Flags(0.75byte,6位,)

标志位,一共有 6 个,分别占 1 位,共 6 位 。 每一位的值只有 0 和 1,分别表达不同意思。

  • URG:
    紧急指针有效。
  • ACK:
    确认序号有效。当 ACK = 1 的时候,确认号(Acknowledgemt Number)有效,否则确认号被忽略。
  • PSH:
    优先推送。当 PSH = 1 的时候,表示该报文段高优先级,接收方 TCP 应该尽快推送给接收应用程序,而不用等到整个 TCP 缓存都填满了后再交付。
  • RST:
    重置连接。当 RST = 1 的时候,表示 TCP 连接中出现严重错误,需要释放并重新建立连接。
  • SYN:
    发起了一个新连接。当 SYN = 1 的时候,表明这是一个请求连接报文段。SYN=1时不能携带数据。
  • FIN:
    释放一个连接。当 FIN = 1 时,表示此报文段的发送方的数据已经发送完毕,并要求释放 TCP 连接。

窗口大小(2byte)

该字段明确指出了现在允许对方发送的数据量,它告诉对方本端的 TCP 接收缓冲区还能容纳多少字节的数据,这样对方就可以控制发送数据的速度。

校验和(2byte)

由发送端填充,接收端对 TCP 报文段执行 CRC 算法,以检验 TCP 报文段在传输过程中是否损坏,如果损坏这丢弃。检验范围包括首部和数据两部分,这也是 TCP 可靠传输的一个重要保障。

紧急指针(2byte)

仅在 URG = 1 时才有意义,它指出本报文段中的紧急数据的字节数。 当 URG = 1 时,发送方 TCP 就把紧急数据插入到本报文段数据的最前面,而在紧急数据后面的数据仍是普通数据。

三、三次握手和四次挥手

3.1 三次握手

三次握手.png

TCP面向连接,建立连接之后才能够发送数据,三次握手就是为了建立连接。
如果只有2次握手的话,服务端就不知道自己是否发送能发数据到客户端。

3.2 四次挥手

四次挥手.png

在服务器端发送一个FIN时,客户端会处于time_wait状态。当处于time_wait状态时,我们无法创建新的连接,因为端口被占用。

关于 TIME_WAIT 过渡到 CLOSED 状态说明: 从 TIME_WAIT 进入 CLOSED 需要经过 2MSL,其中 MSL 就叫做 最长报文段寿命(Maxinum Segment Lifetime),根据 RFC 793 建议该值这是为 2 分钟,也就是说需要经过 4 分钟,才进入 CLOSED 状态。

TIME_WAIT的作用
  • 可靠的终止TCP连接。若处于time_wait的客户端发送给服务器确认报文段丢失的话,服务器将在此重新发送FIN报文段,那么客户端必须处于一个可接收的状态就是time_wait状态而不是close状态。
  • 在第四次挥手后,经过2msl的时间足以让本次连接产生的所有报文段都从网络中消失,这样下一次新的连接中就肯定不会出现旧连接的报文段了。
TCP四次挥手可以变成三次吗?

可以。四次挥手->三次挥手就是服务端将FIN和ack合并成一条进行发送。为什么会进行合并呢?是因为在关闭的时候,服务端没有数据发送给客户端,然后优化后就会将FIN和ack合并在一起发送给客户端。

TCP为啥可靠?
  • 面向连接,确认通信端存在才会发数据
  • 每次发送数据,对方会回个ACK回复,如果短时间内没收到回复,那就进行重发。如果一段时间内都没收到回复,那就主动断开连接。
为何会出现粘包拆包?
  1. 应用程序写入的数据大于套接字缓冲区大小,这将会发生拆包。

  2. 应用程序写入的数据小于套接字缓冲区大小,网卡将应用多次写入数据发送到网络,这将会发生粘包。

  3. 进行MSS(最大报文长度)大小TCP分段,当报文长度-TCP头部长度>MSSd的时候将会发生拆包。

  4. 接收方法不及时读取套接字缓冲区数据,也会发生粘包

服务端出现大量time_wait

http的请求头Connection如果是close的话,服务端会主动断开连接,就会产生大量time_wait状态的端口。
解决:

  • http客户端用Connection=keep-alive的请求头。
  • 服务器端允许time_wait状态的 socket 被重用;缩减time_wait时间,设置为 1 MSL(即,2 mins)。

参考资料

百度百科——TCP
TCP/IP协议详解——知乎
TCP三次握手四次挥手及time_wait状态解析
为什么TCP会出现粘包/拆包?
终于搞懂了服务器为啥产生大量的TIME_WAIT!

补充资料:

TCP三次握手、四次挥手出现意外情况时,如何保证稳定可靠?

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

推荐阅读更多精彩内容

  • 特性 工作在传输层 面向连接协议 全双工协议 半关闭 错误检查 将数据打包成段,排序 确认机制 数据恢复,重传 流...
    黑曼巴yk阅读 258评论 0 0
  • TCP/IP数据处理流程 应用层:决定向用户提供应用服务时通信的活动。TCP/IP 协议族内预存了各类通用的应用服...
    TimLi_51bb阅读 954评论 0 0
  • TCP是什么 TCP —— Transmission Control Protocol 传输控制协议 TCP通信基...
    tracy_668阅读 771评论 0 2
  • 目录: TCP是什么TCP报文结构TCP连接过程TCP状态转移TCP流量控制 —— 滑动窗口TCP拥塞控制TCP可...
    Katou_Megumi阅读 1,341评论 0 4
  • 参考:lwIP Wiki | FANDOM powered by Wikia 参考:lwIP: Overview ...
    a_one_and_a_two阅读 3,221评论 0 1