TCP/IP协议笔记

  1. 截至目前,我们已经得到了三个首部:以太网首部、IP 首部、TCP 首部。
  2. 这三者看起来类似,实际却完全不同:
    1. 以太网首部是以太网技术提供的基础数据 package 功能:其数据包的长度是以太网独有的,和其他技术如光纤环网 FDDI 是完全不同的。实际上其他技术都不一定用的是 帧 这种基础逻辑单元,也不一定用的是这种简单的交换方式。
    2. IP 是网络层协议,其存在的意义是规定一种跨物理实现的“虚拟网络”,让这个网络在上层看来是一致的。从这个意义上来讲,IP 层是 Internet 的本体。IP 网络是真正的全球统一的网络。每一台接入网络的计算机都有一个 ip 地址。
    3. TCP 是传输层协议,其目的是在统一的 IP 层上实现“可靠”的信息传递。

TCP为什么可靠

以太网数据帧和 IP 数据包都只是简单地规定了头部应该如何携带信息,而以太网帧并不保证能够送达,也不能保证按照顺序送达,出现了可靠性问题。

TCP 通过校验、序列号机制、确认应答机制、重发控制、连接管理等特性实现了可靠性传输。具体的特性不再展开叙述,因为 TCP 实在是太复杂,展开讲还能再写五个本文这么长的系列文章。下面我重点介绍 TCP 实现可靠传输的几个重点功能:

  1. TCP 以 段 为基本单位发送数据,段的长度是在首次建立连接的时候双方约定好的。
  2. 序列号和确认应答机制:每个段的发送都会携带一个整数序列号:当前段第一位在完整数据中的字节顺序,每次接收到一个段,远程计算机都要回复一个带序列号的“确认收到”。
  3. 重发机制:首个段发送的时候使用一个比较大的 timeout 值,之后每次的 timeout 的值都是实时计算的,因为 TCP 希望在网络情况变化时也能够尽可能地提供高性能的传输。timeout 时间过了还没有收到携带本段序列号的“确认收到”,那就重发。

三次握手建立友好连接


如图:
$客户端像服务端发起建立连接的请求(你好,我可以和你交朋友吗)
$服务端,收到请求,发送我也要建立连接(你好,我也想和你交朋友)
$客户端:收到(好的,那真是太好了)
经历过这三个 IP 包的来往,这个可靠的 TCP 连接才算建立成功了。

四次挥手断开连接 


经过这四次 IP 包的往来,双方都认为这个 TCP 连接已经断开了,相应的内存资源就可以释放了。

为什么握手是三次而挥手是四次?

原因很简单:TCP 是全双工协议,即可以同时发送和接收数据,两条通道是完全独立的。

  1. 尝试建立连接时,两者之间什么关系都没有,而“收到。我也要建立连接。”这两个动作是有顺序的,直接用一个 IP 包发送就可以了,节省时间。
  2. 尝试断开连接时,“收到。我也要断开连接。”这两个动作之间还有其他事情要发生:客户端这边是不会再发送数据了,但是服务器发给客户端的 IP 包可能还在路上,这时候就要等待客户端给一个“收到”的回应,才能放心地发出“我也要断开连接”这个包。
Tcp 的几个状态

在TCP层,有个FLAGS字段,这个字段有以下几个标识:SYN, FIN, ACK, PSH, RST, URG.

其中,对于我们日常的分析有用的就是前面的五个字段。

 它们的含义是:

SYN表示建立连接,

FIN表示关闭连接,

ACK表示响应,

PSH表示有 DATA数据传输,

RST表示连接重置。

 其中,ACK是可能与SYN,FIN等同时使用的,比如SYN和ACK可能同时为1,它表示的就是建立连接之后的响应,

 如果只是单个的一个SYN,它表示的只是建立连接。

TCP的几次握手就是通过这样的ACK表现出来的。

 但SYN与FIN是不会同时为1的,因为前者表示的是建立连接,而后者表示的是断开连接。

RST一般是在FIN之后才会出现为1的情况,表示的是连接重置。

 一般地,当出现FIN包或RST包时,我们便认为客户端与服务器端断开了连接;而当出现SYN和SYN+ACK包时,我们认为客户端与服务器建立了一个连接。

PSH为1的情况,一般只出现在 DATA内容不为0的包中,也就是说PSH为1表示的是有真正的TCP数据包内容被传递。

TCP的连接建立和连接关闭,都是通过请求-响应的模式完成的。

 概念补充-TCP三次握手:

TCP(Transmission Control Protocol)传输控制协议

TCP是主机对主机层的传输控制协议,提供可靠的连接服务,采用三次握手确认建立一个连接:

 位码即tcp标志位,有6种标示:SYN(synchronous建立联机) ACK(acknowledgement 确认) PSH(push传送) FIN(finish结束) RST(reset重置) URG(urgent紧急)Sequence number(顺序号码) Acknowledge number(确认号码)

第一次握手:主机A发送位码为syn=1,随机产生seq number=1234567的数据包到服务器,主机B由SYN=1知道,A要求建立联机;

 第二次握手:主机B收到请求后要确认联机信息,向A发送ack number=(主机A的seq+1),syn=1,ack=1,随机产生seq=7654321的包;

 第三次握手:主机A收到后检查ack number是否正确,即第一次发送的seq number+1,以及位码ack是否为1,若正确,主机A会再发送ack number=(主机B的seq+1),ack=1,主机B收到后确认seq值与ack=1则连接建立成功。

 完成三次握手,主机A与主机B开始传送数据。

 


猜你喜欢

转载自blog.csdn.net/myself_wqx/article/details/79206455