浅谈TCP

希望通过写博客记录自己的学习内容,要是有哪里不严谨或是有错误,多多指教

什么是TCP? TCP头部?

  1. TCP:全称传输控制协议(传输层协议) ,它的头部如下:

在这里插入图片描述
(1) 源端口号和目的端口号:分别占用16位,用于区别主机中的不同进程, 而IP地址是用来区分不同的主机的,源端口号和目的端口号配合上IP首部中的源IP地址和目的IP地址就能唯一的确定一个TCP连接;

(2) 32位序号:表示一次tcp通信过程(从建立连接到断开)过程中某一次传输方向上的字节流的每个字节的编号。假定主机A和B进行tcp通信,A传送给B一个tcp报文段中,序号值被系统初始化为某一个随机值ISN,那么在该传输方向上(从A到B),后续的所有tcp报文断中的序号值都会被设定为ISN加上该报文段所携带数据的第一个字节在整个字节流中的偏移。例如某个TCP报文段传送的数据是字节流中的第1025~2048字节,那么该报文段的序号值就是ISN+1025。

(3) 32位确认序号:用作对另一方发送的tcp报文段的响应。其值是收到对方的tcp报文段的序号值+1。假定主机A和B进行tcp通信,那么A发出的tcp报文段不但带有自己的序号,也包含了对B发送来的tcp报文段的确认号。反之也一样。

(4) 4位头部长度:表示tcp头部有多少个32bit字(4字节),因为4位最大值是15,所以最多有15个32bit,也就是60个字节是最大的tcp头部长度。

(5) 6位标志位:
URG:紧急指针是否有效
ACK:表示确认好是否有效,携带ack标志的报文段也称确认报文段
PSH:提示接收端应用程序应该立即从tcp接受缓冲区中读走数据,为后续接收的数据让出空间
RST:表示要求对方重建连接。带RST标志的tcp报文段也叫复位报文段
SYN:表示建立一个连接,携带SYN的tcp报文段为同步报文段
FIN标志:表示告知对方本端要关闭连接了。

(6)16为窗口大小:是TCP流量控制的一个手段,这里说的窗口是指接收窗口,它告诉对方本端的tcp接收缓冲区还能容纳多少字节的数据,这样对方就可以控制发送数据的速度。

(7) 16为校验和:由发送端填充,接收端对tcp报文段执行CRC算法以检验TCP报文段在传输过程中是否损坏。注意这个校验不仅包括tcp头部,也包括数据部分。这也是tcp可靠传输的一个重要保障。

(8) 16位紧急指针:是一个正的偏移量。它和序号字段的值相加表示最后一个紧急数据的下一字节的序号。因此这个字段是紧急指针相对当前序号的偏移量。

写到这里大家一定觉得又是概念的堆砌,我在刚开始学习的时候也是这样,但是理解了TCP的通信过程之后,就会有:啊,原来这个是在这一步用到的啊!

TCP通信过程

  1. TCP通信过程包括三个步骤:建立TCP连接(三次握手),传输数据,断开TCP连接(四次挥手)。如下图所示:
    在这里插入图片描述

为什么说TCP是可靠的?

我们都知道TCP和UDP的差别在于TCP可以提供可靠的网络数据传输,那么TCP为什么就可靠呢?因为TCP是面向连接的,采用三次握手建立一个连接,那什么又是连接?我理解连接就是通信双方建立的一个一对一的逻辑关系,让通信双方都能够明确自己的通信目标,既然双方只存在逻辑约定,数据仍然可能在传输的过程中出现错误或者丢失,那么连接存在的意义是?这个问题我将在三次握手的地方给大家解释.

注:TCP 连接的端点不是主机,不是主机的IP 地址,不是应用进程,也不是运输层的协议端口。TCP连接的端点叫做套接字(socket)或插口。
套接字 socket = (IP地址: 端口号)
每一条 TCP 连接唯一地被通信两端的两个端点(即两个套接字)所确定。即:
TCP 连接 ::= {socket1, socket2} = {(IP1: port1), (IP2: port2)}

三次握手建立过程

在这里插入图片描述
解读过程:
第一次握手:建立连接时,客户端发送SYN包(seq=x)到服务器,并进入SYN_SEND状态,等待服务器确认
第二次握手:服务器收到SYN包,必须确认客户的SYN(ACK=x+1),同时自己也发送一个SYN包(seq=y),即SYN+ACK包,此时服务器 进入SYN_RECV状态;
第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ACK=y+1),此包发送完毕,客户端和服务器进入 ESTABLISHED状态,完成三次握手。

这里引用一个通俗易懂的例子帮助大家理解TCP三次握手的过程,并且为什么一定要三次,一次不行吗,两次不行吗?连接存在的意义又是什么?

第一次对话:
我妈让我出去打酱油,半路碰到陈伟霆,我问了一句:哥们你吃饭了么?
结果陈伟霆带着耳机听歌呢,根本没听到,没反应。我心里想:跟你说话也不回应一下,是我不够漂亮吗,沟通失败。说明陈伟霆接受不到我传过来的信息的情况下沟通肯定是失败的。
如果陈伟霆听到了我说的话,那么第一次对话成功,接下来进行第二次对话。

第二次对话:
陈伟霆听到了我说的话,但是他是港普,中文不好,不知道我说的啥意思也不知道怎样回答,于是随便回答了一句学过的中文 :我去厕所了。我一听“去厕所吃饭?”。沟通失败。说明陈伟霆无法做出正确应答的情况下沟通失败。
如果陈伟霆听到了我的话,做出了正确的应答,并且还进行了反问:我吃饭了,你呢?那么第二次握手成功。
通过前两次对话证明了陈伟霆能够听懂我说的话,并且能做出正确的应答。接下来进行第三次对话。

第三次对话:
我刚和陈伟霆打了个招呼,突然老妈喊我,我二话不说就跑回家了,把陈伟霆自己晾那了。陈伟霆心想:这什么人啊!沟通失败。说明我无法做出应答的情况下沟通失败。
如果我也做出了正确的应答:我也吃了。那么第三次对话成功,两人已经建立起了顺畅的沟通渠道,接下来开始持续的聊天。
通过第二次和第三次的对话证明了我能够听懂陈伟霆说的话,并且能做出正确的应答。
可见,两个人进行有效的语言沟通,这三次对话的过程是必须的。

同理对于TCP为什么需要进行三次握手我们可以一样的理解:
为了保证服务端能收接受到客户端的信息并能做出正确的应答而进行前两次(第一次和第二次)握手,为了保证客户端能够接收到服务端的信息并能做出正确的应答而进行后两次(第二次和第三次)握手,因此可靠。连接建立的意义也就在于通信双方知道对方从什么时候开始什么时候结束,能够保证通信的完整和正确。

数据传输

建立好链接,开始传输数据,TCP数据传输牵涉到的概念很多:超时重传、快速重传、流量控制、拥塞控制等等
在这里插入图片描述
a.超时重传
超时重传机制用来保证TCP传输的可靠性。每次发送数据包时,发送的数据报都有seq号,接收端收到数据后,会回复ack进行确认,表示某一seq号数据已经收到。发送方在发送了某个seq包后,等待一段时间,如果没有收到对应的ack回复,就会认为报文丢失,会重传这个数据包。
在这里插入图片描述
b.快速重传
接受数据一方发现有数据包丢掉了。就会发送ack报文告诉发送端重传丢失的报文。如果发送端连续收到标号相同的ack包,则会触发客户端的快速重传。比较超时重传和快速重传,可以发现超时重传是发送端在等超时,然后触发重传;而快速重传则是接收端主动告诉发送端数据没收到,然后触发发送端重传。
c.流量控制
这里主要说TCP滑动窗流量控制。TCP头里有一个字段叫Window,又叫Advertised-Window,这个字段是接收端告诉发送端自己还有多少缓冲区可以接收数据。于是发送端就可以根据这个接收端的处理能力来发送数据,而不会导致接收端处理不过来。 滑动窗口可以是提高TCP传输效率的一种机制。
d.拥塞控制
滑动窗用来做流量控制。流量控制只关注发送端和接受端自身的状况,而没有考虑整个网络的通信情况。拥塞控制,则是基于整个网络来考虑的。考虑一下这样的场景:某一时刻网络上的延时突然增加,那么,TCP对这个事做出的应对只有重传数据,但是,重传会导致网络的负担更重,于是会导致更大的延迟以及更多的丢包,于是,这个情况就会进入恶性循环被不断地放大。试想一下,如果一个网络内有成千上万的TCP连接都这么行事,那么马上就会形成“网络风暴”,TCP这个协议就会拖垮整个网络。为此,TCP引入了拥塞控制策略。拥塞策略算法主要包括:慢启动,拥塞避免,拥塞发生,快速恢复。

四次挥手

在这里插入图片描述

第一次挥手:主动关闭方发送一个FIN,用来关闭主动方到被动关闭方的数据传送,也就是主动关闭方告诉被动关闭方:我已经不会再给你发数据了(当然,在fin包之前发送出去的数据,如果没有收到对应的ack确认报文,主动关闭方依然会重发这些数据),但此时主动关闭方还可以接受数据。
第二次挥手:被动关闭方收到FIN包后,发送一个ACK给对方,确认序号为收到序号+1(与SYN相同,一个FIN占用一个序号)。
第三次挥手:被动关闭方发送一个FIN,用来关闭被动关闭方到主动关闭方的数据传送,也就是告诉主动关闭方,我的数据也发送完了,不会再给你发数据了。
第四次挥手:主动关闭方收到FIN后,发送一个ACK给被动关闭方,确认序号为收到序号+1,至此,完成四次挥手。

读完它的通信过程是不是对它头部每一部分有了更好的理解!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值