初识TCP

1. TCP协议的概念

TCP是TCP/协议簇中最重要也是最复杂协议,它位于OSI七层协议模型的网络层,它提供了一种全双工的、面向连接的、可靠的字节流服务。TCP协议是两台主机进程进行通信的基石,TCP使用连接(connection)作为最基本的抽象,同时将TCP连接的端点称为插口或者套接字(socket)。

  • 全双工:通信两端在任意时刻可以互相发送数据,既可以是客户端也可以是服务端。
  • 面向连接:通信前需要先三次握手建立连接,通信后四次挥手释放连接。
  • 可靠的:通过序号解决报文乱序/丢失、超时重传、拥塞控制、滑动窗口、检验和。
  • 字节流:没有固定的报文边界。

1.1 socket

socket
socket

如上图所示,客户端ip+port和服务端ip+port的四元组,组成一个socket可以唯一标识一个连接,所以理论上来说服务器的一个端口就能连接成千上万的连接。

2. TCP首部格式

TCP的首部包含了20字节的固定部分和长度可变的选项部分,如下图所示:

TCP首部
TCP首部
  • 端口号:每个TCP段都包含各占两个字节的源端和目的端的端口号,用于寻找发端和收端应用进程。这两个值加上IP首部中的源端IP地址和目的端IP地址唯一确定一个TCP连接。

  • 序号:TCP协议在数据传输的过程中是基于字节流的并且在传输给传输层的时候会将字节流进行分段,序号用来表示这个报文段的第一个字节(报文段的第一个字节号就是序号)。这个序号是由特定的算法生成的随着时间逐渐递增的数字,最大值是2^32-1。这样设计序号主要有三个原因:

    1. 标识两个主机间前后传输报文段的关系。
    2. 防止由于网络延迟有的分组被重发后,而导致某一方连接做出错误的解释。
    3. 防止黑客TCP劫持。
  • 确认号:是期望收到下个报文段数据的第一个字节号。

  • 指出首部长度共有多少4个字节,TCP首部长度可以在20-60个字节之间。

  • 标志位:

    • URG:紧急bit,当URG=1时,代表该报文段有紧急数据应该尽快传输(优先级高)。
    • ACK:当ACK=1时代表确认号有效,否则无效。
    • PUS:当PUS=1时代表该报文段应当尽快传输给接收应用进程,而不用等待缓存填满。
    • RST:当RST=1时代表TCP连接出现了严重差错,必须释放连接然后重新建立。
    • SYN:当SYN=1时代表这是一个请求连接或者连接接受报文。
    • FIN:当FIN=1时代表报文段的发送端已经发送完数据,并要求释放连接。
  • 窗口:窗口字段用来控制发送方的的发送数据量,接收方根据设置的缓存确定自己接收窗口的大小,然后通知对方以确定对方发送窗口的上限。

  • 校验和:检验部分包括TCP首部和报文段部分,要加上12字节的伪首部。

  • 紧急指针:指出本报文段中紧急数据的最后一个字节的序号,并且URG标志位置为1。

  • 选项:TCP只规定了一种选项,即最大报文段长度MSS(max segment size),MSS会通知发送方我所能接收的报文段的数据字段的最大长度是MSS个字节。

3.题外话

在这里推荐下林沛满先生的两本书《WireShark网络分析就这么简单》和《WireShark网络分析的艺术》,林先生用幽默风趣的语言讲述了复杂的网络知识,书中都是林先生的实战经验,可以让我们收获到很多实战技巧。而且林先生也在书中分享他在工作中的方法论,读了之后让我收益匪浅,我把其中的一段话分享给了女朋友,也在这里分享给大家,希望大家能有所收获。

有些道理听上去很简单,然而当你着手准备面试材料的时候,可能会发现没什么拿得出手的。这又是什么原因呢?不是因为你平时碌碌无为,而更可能是因为没有总结的习惯,时间一长都忘了。这就是坚持写技术博客的价值之一,能用自己的语言表达出来才算真正理解并且记住了。写作能强迫思考,对于真正有技术含量的东西,你会在写作过程中加深理解,从此就忘不掉了;而技术含量不高的东西,你写个开头自然会停笔,从此忘掉也无所谓。不仅技术上如此,其他学科也一样,年轻的时候阅读国学经典,每篇都让人觉得顿悟了人生。但如果试着把感受写成文章,就会发现所谓的顿悟只是一碗心灵鸡汤。 ——摘自《WireShark网络分析就这么简单》

关注作者公众号:

二维码
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章