计算机网络通信之探究TCP/IP协议

TCP/IP协议简介

TCP/IP【TCP(传输控制协议)和IP(网际协议)】提供点对点的链接机制,将数据应该如何封装、定址、传输、路由以及在目的地如何接收,都加以标准化。

它将软件通信过程抽象化为四个抽象层,采取协议堆栈的方式,分别实现出不同通信协议。
在这里插入图片描述

协议族下的各种协议,依其功能不同,被分别归属到这四个层次结构之中,常被视为是简化的七层OSI模型。

TCP(Transmission Control Protocol,传输控制协议)是一种面向连接的、可靠的、基于字节流的通信协议。
数据在传输前要建立连接,传输完毕后还要断开连接,客户端在收发数据前要使用 connect() 函数和服务器建立连接。
建立连接的目的是保证IP地址、端口、物理链路等正确无误,为数据的传输开辟通道。
TCP建立连接时要传输三个数据包,俗称三次握手,后面会进行详细讲解

TCP数据报结构

在这里插入图片描述

带阴影的几个字段需要重点说明一下:
(1) 序号:Seq(Sequence Number)序号占32位,用来标识从计算机A发送到计算机B的数据包的序号,计算机发送数据时对此进行标记。
(2) 确认号:Ack(Acknowledge Number)确认号占32位,客户端和服务器端都可以发送,Ack = Seq + 1。
(3) 标志位:每个标志位占用1Bit,共有6个,分别为 URG、ACK、PSH、RST、SYN、FIN,具体含义如下:

1)URG:紧急指针(urgent pointer)有效。
(2)ACK:确认序号有效。
(3)PSH:接收方应该尽快将这个报文交给应用层。
(4)RST:重置连接。
(5)SYN:建立一个新连接。
(6)FIN:断开一个连接。

TCP协议的三次握手

如下图所示:
在这里插入图片描述

握手过程

第一次握手

1、客户端给服务器发送一个同步报文段SYN,并指定客户端的初始序列号ISN,此时客户端处于SYN_SENT状态。
2、首部的同步位SYN = 1(SYN只是一个比特位,0表示不是SYN,1表示是SYN),初始序列号seq = m。
3、SYN = 1的报文段不能携带任何的数据,但要指定序号。

第二次握手

1、服务器接收到来自客户端的同步报文段SYN后,会以自己的SYN报文作为应答,并且也指定了自己的初始序列号ISN。同时会把客户端的 seq+1 确认序列号ack的值,表示自己已经收到了客户端的同步报文段SYN,此时服务器处于SYN_RCVD的状态。
2、确认报文段中SYN = 1,ACK = 1(ACK也只是一个比特位,0表示不是ACK,1表示是 ACK),确认序列号ack = m+1,初始序列号seq = n。

第三次握手

1、客户端收到来自服务器的同步报文段SYN之后,会发送一个确认报文段ACK,以服务器的 seq+1作为ack的值 ,表明自己已经收到来自服务器的同步报文段SYN。客户端进入ESTABLISHED状态,服务器确认报文段ACK之后,也会进入ESTABLISHED状态。
2、确认报文段中,ACK = 1,确认序列号 ack = n+1,序列号 seq = m+1。
3、双方已经建立起连接,可以正常的发送数据。

举个例子:

在这里插入图片描述

为什么要三次握手?

三次握手的目的是建立可靠的通信信道,说到通讯,简单来说就是数据的发送与接收,而三次握手最主要的目的就是双方确认自己与对方的发送与接收是正常的。
第一次握手:Client 什么都不能确认;Server 确认了对方发送正常,自己接收正常
第二次握手:Client 确认了:自己发送、接收正常,对方发送、接收正常;Server 确认了:对方发送正常,自己接收正常
第三次握手:Client 确认了:自己发送、接收正常,对方发送、接收正常;Server 确认了:自己发送、接收正常,对方发送、接收正常
所以三次握手就能确认双发收发功能都正常,缺一不可。

TCP协议的四次挥手

如下图所示:
在这里插入图片描述
挥手过程

1、第一次挥手:当数据传输结束以后,客户端的应用进程发出连接释放报文段,并停止发送数据,其首部:FIN=1,seq=u。

2、第二次挥手:服务器端收到连接释放报文段之后,发出确认报文,其首部:ACK=1,seq=v,ack=u+1。此时本次连接就进入了半关闭状态,客户端不再向服务器发送数据。而服务器端仍会继续发送。

3、第三次挥手:若服务器已经没有要向客户端发送的数据,其应用进程就通知服务器释放TCP连接。这个阶段服务器所发出的最后一个报文的首部应为:FIN=1,ACK=1,seq=w,ack=u+1。

4、第四次挥手:客户端收到连接释放报文段之后,必须发出确认:ACK=1,seq=u+1,ack=w+1。 再经过2MSL(Maximum Segment Lifetime最长报文寿命)后,本次TCP连接真正结束,通信双方完成了他们的告别。

在这个过程中:
ESTAB-LISHED:连接建立状态
FIN-WAIT-1:终止等待1状态
FIN-WAIT-2:终止等待2状态
CLOSE-WAIT:关闭等待状态
LAST-ACK:最后确认状态
TIME-WAIT:时间等待状态
CLOSED:关闭状态

TCP 协议如何保证可靠传输

  1. 应用数据被分割成 TCP 认为最适合发送的数据块。
  2. TCP 给发送的每一个包进行编号,接收方对数据包进行排序,把有序数据传送给应用层。
  3. 校验和: TCP 将保持它首部和数据的检验和。这是一个端到端的检验和,目的是检测数据在传输过程中的任何变化。如果收到段的检验和有差错,TCP 将丢弃这个报文段和不确认收到此报文段。
  4. TCP 的接收端会丢弃重复的数据。
  5. 流量控制: TCP 连接的每一方都有固定大小的缓冲空间,TCP的接收端只允许发送端发送接收端缓冲区能接纳的数据。当接收方来不及处理发送方的数据,能提示发送方降低发送的速率,防止包丢失。TCP 使用的流量控制协议是可变大小的滑动窗口协议。 (TCP 利用滑动窗口实现流量控制)
  6. 拥塞控制: 当网络拥塞时,减少数据的发送。
  7. ARQ协议: 也是为了实现可靠传输的,它的基本原理就是每发完一个分组就停止发送,等待对方确认。在收到确认后再发下一个分组。
  8. 超时重传: 当 TCP 发出一个段后,它启动一个定时器,等待目的端确认收到这个报文段。如果不能及时收到一个确认,将重发这个报文段。

TCP协议的常见问题

(1)为什么会采用三次握手,若采用二次握手可以吗?

采用三次握手是为了防止失效的连接请求报文段突然又传送到服务器端,因而产生错误。失效的连接请求报文段是指:客户端发出的连接请求没有收到服务器的确认,于是经过一段时间后,客户端又重新向服务器发送连接请求,且建立成功,顺序完成数据传输。考虑这样一种特殊情况,客户端第一次发送的连接请求并没有丢失,而是因为网络节点导致延迟达到服务器,服务器以为是客户端又发起的新连接,于是服务器同意连接,并向客户端发回确认,但是此时客户端根本不会理会,服务器就一直在等待客户端发送数据,导致服务器的资源浪费。

(2)为什么建立连接是三次握手,而关闭连接却是四次挥手呢?

这是因为服务端在LISTEN状态下,收到建立连接请求的SYN报文后,把ACK和SYN放在一个报文里发送给客户端。而关闭连接时,当收到对方的FIN报文时,仅仅表示对方不再发送数据了但是还能接收数据,己方也未必全部数据都发送给对方了,所以己方可以立即close,也可以发送一些数据给对方后,再发送FIN报文给对方来表示同意现在关闭连接,因此,己方ACK和FIN一般都会分开发送。

(3)第2次握手传回了ACK,为什么还要传回SYN?

接收端传回发送端所发送的ACK是为了告诉客户端,我接收到的信息确实就是你所发送的信号了,这表明从客户端到服务端的通信是正常的。而回传SYN则是为了建立并确认从服务端到客户端的通信。”

扩展资料

SYN 同步序列编号(Synchronize Sequence Numbers) 是 TCP/IP
建立连接时使用的握手信号。在客户机和服务器之间建立正常的 TCP 网络连接时,客户机首先发出一个 SYN 消息,服务器使用 SYN-ACK
应答表示接收到了这个消息,最后客户机再以 ACK(Acknowledgement)消息响应。这样在客户机和服务器之间才能建立起可靠的 TCP
连接,数据才可以在客户机和服务器之间传递。

附:参考资料

1、TCP三次握手和四次挥手的全过程
2、TCP三次握手详解

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

--流星。

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值