TCP四层协议

在这里插入图片描述

应用层————为应用数据提供服务
表示层————数据格式转化,数据加密
会话层————建立、维护和管理会话
传输层————建立、维护和管理端到端的链接,控制数据传输的方式
网络层————数据传输线路选择,IP地址及路由选择
数据链路层———物理通路的发送和数据包的划分,附加Mac地址到数据包
物理层———01比特流的转换
数据传输由顶向下,下层为上层提供服务

TCP/IP四层协议模型
应用层———负责处理特定的应用程序细节, 如ftp,http ,smtp,ssh 等
运输层———主要为两台主机上的应用提供端到端的通信, 如TCP,UDP。
网络层(互联网层)———处理分组在网络中的活动,比如分组的选路。
链路层(数据链路层/网络接口层)———包括操作系统中的设备驱动程序、计算机中对应的   
      网络接口卡,01比特流的转换
协议封装
下层协议通过封装为上层协议提供服务。应用程序数据在发送到物理网络上之前,
将沿着协议栈从上往下依次传递。
每层协议都将在上层数据的基础上加上自己的头部信息(有时也包括尾部信息),
以实现该层的功能。

在这里插入图片描述
tcp协议一层一层得封装,到最后就成为一个完整得数据包。就是你要发得数据会往协议栈
里面丢,一层一层丢。
在这里插入图片描述

源端口号和目的端口号:再加上Ip首部的源IP地址和目的IP地址可以唯一确定一个TCP连接
数据序号:表示在这个报文段中的第一个数据字节序号
确认序号:仅当ACK标志为1时有效。确认号表示期望收到的下一个字节的序号(这个下面再详细分析)
偏移:就是头部长度,有4位,跟IP头部一样,以4字节为单位。最大是60个字节
保留位:6位,必须为0
6个标志位:
URG-紧急指针有效
ACK-确认序号有效
PSH-接收方应尽快将这个报文交给应用层
RST-连接重置
SYN-同步序号用来发起一个连接
FIN-终止一个连接
窗口字段:16位,代表的是窗口的字节容量,也就是TCP的标准窗口最大为2^16 - 1 = 65535个字节
校验和:源机器基于数据内容计算一个数值,收信息机要与源机器数值 结果完全一样,
从而证明数据的有效性。检验和覆盖了整个的TCP报文段:这是一个强制性的字段,
一定是由发送端计算和存储,并由接收端进行验证的。
紧急指针:是一个正偏移量,与序号字段中的值相加表示紧急数据最后一个字节的序号。
TCP的紧急方式是发送端向另一端发送紧急数据的一种方式
选项与填充(必须为4字节整数倍,不够补0):
最常见的可选字段的最长报文大小MSS(Maximum Segment Size),
每个连接方通常都在一个报文段中指明这个选项。它指明本端所能接收的最大长度的报文段。
该选项如果不设置,默认为53620+20+536=576字节的IP数据报)

三次握手即TCP连接的建立。这个连接必须是一方主动打开,另一方被动打开的。
在这里插入图片描述

1)首先客户端向服务器端发送一段TCP报文,其中:
标记位为SYN,表示“请求建立新连接”;序号为Seq=X(X一般为1);随后客户端进入SYN-SENT阶段。

(2)服务器端接收到来自客户端的TCP报文之后,结束LISTEN阶段。并返回一段TCP报文,其中:
标志位为SYN和ACK,表示“确认客户端的报文Seq序号有效,服务器能正常接收客户端发送的数据,
并同意创建新连接”(即告诉客户端,服务器收到了你的数据);
序号为Seq=y;确认号为Ack=x+1,表示收到客户端的序号Seq并将其值加1作为自己确认号Ack的值;
随后服务器端进入SYN-RCVD阶段。

(3)客户端接收到来自服务器端的确认收到数据的TCP报文之后,明确了从客户端到服务器的数据传输是正常的,
结束SYN-SENT阶段。并返回最后一段TCP报文。其中:
标志位为ACK,表示“确认收到服务器端同意连接的信号”(即告诉服务器,我知道你收到我发的数据了);
序号为Seq=x+1,表示收到服务器端的确认号Ack,并将其值作为自己的序号值;确认号为Ack=y+1,
表示收到服务器端序号Seq,并将其值加1作为自己的确认号Ack的值;随后客户端进入ESTABLISHED阶段。
服务器收到来自客户端的“确认收到服务器数据”的TCP报文之后,明确了从服务器到客户端的数据传输是正常的。
结束SYN-SENT阶段,进入ESTABLISHED阶段。

在客户端与服务器端传输的TCP报文中,双方的确认号Ack和序号Seq的值,
都是在彼此Ack和Seq值的基础上进行计算的,这样做保证了TCP报文传输的连贯性。
一旦出现某一方发出的TCP报文丢失,便无法继续"握手",以此确保了"三次握手"的顺利完成。

tcp滑动窗口
在这里插入图片描述
在这里插入图片描述
如果没有收到ack 包里会有一个定时器,在超时之前没收到ack得话那么会进行重新传送
以保证数据不会丢失 超时重传机制 顺序得话通过tcp头部得顺序号来保证

丢包情况
在这里插入图片描述
在这里插入图片描述
四次挥手
在这里插入图片描述

1.客户端发送断开TCP连接请求的报文,其中报文中包含seq序列号,是由发送端随机生成的,
并且还将报文中的FIN字段置为1,表示需要断开TCP连接。(FIN=1,seq=x,x由客户端随机生成)

2.服务端会回复客户端发送的TCP断开请求报文,其包含seq序列号,是由回复端随机生成的,
而且会产生ACK字段,ACK字段数值是在客户端发过来的seq序列号基础上加1进行回复,
以便客户端收到信息时,知晓自己的TCP断开请求已经得到验证。
(FIN=1,ACK=x+1,seq=y,y由服务端随机生成)

3.服务端在回复完客户端的TCP断开请求后,不会马上进行TCP连接的断开,
服务端会先确保断开前,所有传输到A的数据是否已经传输完毕,一旦确认传输数据完毕,
就会将回复报文的FIN字段置1,并且产生随机seq序列号。
(FIN=1,ACK=x+1,seq=z,z由服务端随机生成)

4.客户端收到服务端的TCP断开请求后,会回复服务端的断开请求,
包含随机生成的seq		字段和ACK字段,ACK字段会在服务端的TCP断开请求的seq基础上加1,
从而完		成服务端请求的验证回复。(FIN=1,ACK=z+1,seq=h,h为客户端随机生成)

至此TCP断开的4次挥手过程完毕。

TCP分包

发送端发送了数量较多的数据,接收端读取数据时候数据分批到达,造成一次发送多次读取;
TCP是以段(Segment)为单位发送数据的,建立TCP链接后,有一个最大消息长度(MSS).
如果应用层数据包超过MSS,就会把应用层数据包拆分,分成多个段来发送.

TCP 粘包

发送端发送了几次数据,接收端一次性读取了所有数据,造成多次发送一次读取;
通常是网络流量优化,把多个小的数据段集满达到一定的数据量,从而减少网络链路中的传输次数
 TCP为了提高网络的利用率,会使用一个叫做Nagle的算法.该算法是指,
 发送端即使有要发送的数据,如果很少的话,会延迟发送.如果应用层给TCP传送数据很快的话
 ,就会把两个应用层数据包“粘”在一起,TCP最后只发一个TCP数据包给接收端.

解决之道 封装自定义协议

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值