手机聊天消息是咋样发出的?带你探究网络运输层TCP协议的差错控制与实现

传输控制协议TCP协议

TCP连接的特点:

e80a57f72c4c48d9b476ca0f6d787836.png

 

(1)面向连接的运输层协议

使用TCP之前必须要先建立连接,传输完毕数据后,必须要释放连接.

(2)每条TCP连接只能有两个端点,提供点到点的连接。

(3)提供全双工通信,既可以同时发送,又可以同时接收。

(4)面向字节流,流是指流入进程或流出进程的字节流。

TCP的连接

d92e55f0ee72416db5ea846f47b7a6e3.jpg

 

TCP连接的端点叫做套接字或插口。

端口号拼接到IP地址构成了套接字socket,套接字表示是在点分十进制的IP地址后面写上端口号,中间用冒号隔开;

即套接字=(IP地址:端口号);

每条TCP连接唯一的被两个端点,即套接字所确定。

即TCP连接::={socket1,socket2}={(IP1:port1)(IP2:port2)}

socket的其他含义,

71d0314906384fc2bed129812ecaab9c.jpg

 

(1)允许应用程序访问联网协议的应用编程接口API(appllication programming interface),也叫socket API,简称socket。

(2)调用socket函数的端点叫做socket.

(3)调用socket函数的返回值也叫socket描述符,可简称为socket.

可靠传输的工作原理

可靠传输的特点:(1)传输信道不出现差错。

(2)不管发送方发送多快,接收方总是来得及接收。

停止等待协议

(1)无差错情况

发送方向接收方发送分组,接收方收到后检查没问题向发送方发送确认,接收方收到后继续发送下一分组。

97e6399d4ba4449faaaa40e5af52e074.png

 (2)出现差错

15978c97a75a45d086cb90c217d26e46.png

 

接收方 发现接受的分组出现差错,则不再向发送方发送该分组的确认消息,超过一段时间后,如果发送方依然没有收到确认消息,则重新再发送消息。这叫做超时重传。如果要实现,需要为每个发送的分组设置一个超传计时器

需要注意以下几点:

(1)发送方发送分组后,需要暂时保留该分组副本,直到收到接收方确认后再删除该副本。

(2)分组和确认分组都需要进行编号,这样才能明确哪一个发送出去的分组收到了确认。

(3)超时计时器设置的重传时间需要比数据再分组传输的平均往返时间大一些。否则还没等到确认消息到达,分组已经重新发送出去了。

 

(3)确认丢失和确认迟到

26b2368320464a46a3f5a1aebeca87c5.png

 

 

 

(1)确认丢失:

假如接收方发送给发送方的确认消息丢失,发送方超时没有收到确认消息,于是重新发送了分组,于是接收方收到了重复的分组,那么接收方首先要丢弃这个重复的分组,因为不能重传,并且要再次向发送方发送该分组的确认消息。

(2)确认迟到:

由于发送的确认消息迟到了,所以发送方收到了重复的确认消息,丢弃该重复消息即可。

 

 

以上的确认和重传机制称为自动重传请求ARQ(automatic repeat request)

接收方无须主动请求发送,只需要等待一段时间后,发送方自动发送出错报文。

连续ARQ协议和滑动窗口协议

6a066e7518ce4598a0901f1605a52ff9.png

 

发送窗口:位于发送窗口的5个分组连续发送出去,无须等待接收方确认。

 

TCP报文段首部的基本格式

b7676fcac2b34b869746e98b16e51a5e.png

 

 

 

(1)源端口和目标端口

各占两字节,分别写入源端口号和目的端口号。

(2)序号:也叫报文段编号。

占四字节

范围为0-2ˆ(32)-1;

序号使用 mod 2ˆ32运算进行。

即到达2ˆ(32)-1之后又回到0;首部的序号字段是本报文段发送数据的第一个字节的序号。

TCP传输的每个字节流按顺序编号。

如果一段报文序号为1,数据共100字节,那么下一段报文序号为101开始。

(3)确认号

89ef0d16d6fd42ffadc26a683bf2998b.jpg

 

占四字节,希望收到对方下个报文段的第一个数据字节的序号,

假如接收方收到的报文字段值为22,数据长度为100字节,则发送回的确认号为122(22-121为收到的数据序号值)。

(4)数据偏移

占四位,指的是TCP报文数据部分起始处离首部起始处的距离,即首部长度大小。数据偏移的单位为32位字(即四字节为单位),数据偏移的最大值为60字节,因为4位二进制数表示的最大十进制数为15.

(5)保留:占6位,保留以后使用,现在依然为0;

控制位字段:

(7)-(11)

76e63c5d8f7c4e18b04c1372d460fd79.jpg

 

(6)紧急URG:该位值为一个时,表示有紧急数据发送,于是发送方TCP把紧急数据插入到报文数据最前面。

(7)确认ACK:ACK为一个时候确认号字段才有效,建立连接后所有报文段ACK必须都是1;

(8)推送PSH:一端通信的应用程序希望立即得到对方响应,那么将PSH置为1,然后创建一个报文段发送出去,接收端收到后则尽快交付应用进程,无需等待整个缓存满了以后再上交应用层。

(9)复位RST(reset):为1时候表示TCP连接出现严重错误,立即断开连接,然后建立连接。也可以用来拒绝非法报文段或拒绝打开一个连接。

(10)同步SYN(SYNchronization):连接时候用来同步序号,SYN为1表示是一个连接请求或连接接受报文。

请求连接时,SYN=1且ACK=0,接收端接受连接时候SYN=1且ACK=1;

(11)终止FIN(finish):FIN=1表示释放连接。

(12)窗口:2字节,指的是接收窗口,告知发送方从本报文确认号算起,接收方允许对方发送的数据量(单位为字节),因为接收方数据缓存空间有限。

542702bcaa714ec7a9a6ef856211e6e3.jpg

 

比如报文段确认号为701,窗口字段是1000,说明了什么?

说明从701算起,接收方还可以接收1000个字节数据。(字节序号701-1700)

(13)检验和:占两字节,检验字段包括TCP报文的首部和数据两个部分,和前面的UDP计算检验和一样,要添加了12位的伪首部(详细可以参照上篇文章),格式与UDP数据报伪首部相同,不同的是两点:一个是第五字段的UDP长度改为TCP长度,第二个是第四个协议号字段的17改为6(UDP协议号为6).

(14)紧急指针:两字节,只有在URG字段为1时候该字段才有意义,指出来本报文段的紧急数据的字节数。

(15)选项:长度可变,最长40字节。

如图所示,没有使用选项时候,首部长度为20字节。

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值