TCP/IP协议

TCP/IP协议族

TCP/IP是当前流行的网络传输协议框架,它是一个协议族,因为TCP、IP是最核心的协议,所以把该协议族称为TCP/IP。
数据通信的发送方和接收方通过约定的协议,按照相互可以理解的方式进行数据的打包和解包,使得不同厂商的设备在不同类型的操作系统上实现网络通信。

应用层:HTTP、FTP、SMTP等;数据称为Message;程序发送信息时,应用层按协议打包数据成消息,经过socket达到传输层。
传输层:TCP/UDP;Segment;传输层给消息加上双方端口号,形成报文段。
网络层:IP/ARP;Datagram;网络层给报文段加上双方IP地址,形成数据报;将数据帧去帧头帧尾,重新组成数据报,TTL减1,重新计算校验和,如果TTL=0,丢弃,发送ICMP报文通知源主机。
链路层:Frame;链路层加上双方MAC地址,将数据拆分成数据帧(分片),经过多个路由器和网关,到达目标机器。由于硬件的物理特性不同,数据帧的最大长度不同,即MTU最大传输单元,IP数据报头+数据报,需要将数据报拆分。

IP数据报头部大小固定为20个字节,假设一个IP数据报大小为1500字节,即IP数据1500-20=1480字节,假设MTU为500字节,那么,每个MTU可以装数据500-20=480字节,MTU是链路层针对网络层设计,不包括帧头
在这里插入图片描述

IP报头中含有标识(16位)、标志(3位)和分段偏移(13位)来记录分片信息
标识判断是否属于同一个数据报,注意是要在源IP地址和目标IP地址相同的情况下。
标志目前只有两位有意义
<1>标志位中的最低位记为MF(More Fragment)。MF=1即表示后面"还有分片"的数据报。MF=0表示这已是若干数据报片中的最后一个。
<2>标志字段中间的以为记为DF(Don’t Fragment)。意思是"不能分片"的数据报。只有当DF=0是才允许分片。
分段偏移以8个字节为单位计算的
第一片:分段偏移=0,标志MF=1,数据0~479
第二片:分段偏移=480/8=60,标志MF=1,数据480~959
第三片:分段偏移=960/8=120,标志MF=1,数据960~1399
第三片:分段偏移=1440/8=180,标志MF=0,数据1440~1480
分片到达主机可能是乱序的,IP层通过标志和分段偏移来判断分片是否完成,若完整则组装成数据报向上提交。

TCP协议

Transmission Control Protocol,传输控制协议

  1. 面向连接(三次握手建立连接,四次挥手断开连接)
  2. 可靠传输(确保端到端的数据交付,超时重传、滑动窗口、拥塞控制)

TCP建立连接

在发送数据之前,需要建立一条虚拟的链路,然后让数据在这条链路上“流动”完成传输。
TCP报文头的两个端口号+IP报头的源IP地址和目标地址组成的四元组可唯一标识一条TCP连接
在不考虑资源限制的情况下:
对于客户端来说,它可以建立的最大TCP连接数就是端口号数(0~65535),端口0是预留端口号,有特殊含义,不能使用,所以最大tcp连接数为65535。
对于服务端来说,服务器一般会监听某个端口,端口号是不可变的。可变的是客户端IP和客户端端口号,IPv4的地址为32位,可表示2 ^ 32个IP地址,端口号65535=2 ^ 16 - 1,所以服务器最大TCP连接数约为2 ^ 48。

三次握手

在这里插入图片描述
SYN:Synchronized Sequence Numbers,用作建立连接时的同步信号
ACK:Acknowledgement,用于对收到的数据进行确认,所确认的数据由确认序列号表示;
seq:序列号,表示发送数据包中数据部分的第一个字节的序号;
ack:确认序列号,表示已收到数据,期望收到对方下一个数据包的数据部分的第一个字节的序号

主要目的:信息对等和防止超时;
为什么不是2次握手:2次握手无法保证信息对等,可能出现脏连接;
为什么不是4次握手:网络的不确定因素,3次握手是基本保证,3次做不到再多次也没有意义;3次可行就没有必要更多;
信息对等:三次握手确认自己和对方的发报和收报能力
在这里插入图片描述
防止超时:防止出现请求超时出现脏连接
两次握手导致的脏连接:
在这里插入图片描述

四次挥手

在这里插入图片描述
TIME_WAIT:主动要求关闭的机器收到对方的FIN报文,并发出ACK报文,进入TIME_WAIT状态,等2MSL后进入CLOSED状态;
CLOSE_WAIT:被动要求关闭的机器收到对方请求关闭连接的FIN报文,在第一次ACK应答之后,马上进入CLOSE_WAIT状态。这种状态表示等待关闭,通知应用程序发送剩余数据,处理现场信息,关闭相关资源。
MSL:Maximum Segment Lifetime,报文在网络上生存的最大时间,超过阈值报文则被丢弃。
TIME_WAIT的作用:

  • 确认被动关闭方能够顺利进入CLOSED状态;假设机器A的最后一个ACK报文没有到达机器B,机器B会认为机器A没有收到自己的FIN+ACK报文,超时重传。机器A第二次收到FIN+ACK报文,重传ACK报文,确保机器B能够进入CLOSED状态。
  • 防止失效的请求;如果机器A没有TIME_WAIT直接建立新的请求,此时可能会出现之前已经失效的连接请求数据包到达,和新连接的请求数据包混淆,发生异常。

MSL的时间通常为2分钟,大于TTL衰减至0的时间,但是在高并发的场景下,2分钟会造成极大的资源浪费,会调小MSL的时间。

TCP粘包

  • 当连续发送数据时,由于tcp协议的nagle算法,会将较小的内容拼接成大的内容,一次性发送到服务器端,因此造成粘包
  • 当发送内容较大时,由于服务器端的recv(buffer_size)方法中的buffer_size较小,不能一次性完全接收全部内容,因此在下一次请求到达时,接收的内容依然是上一次没有完全接收完的内容,因此造成粘包现象。
    解决:(1)对于发送方造成的粘包问题,可以通过关闭Nagle算法来解决,使用TCP_NODELAY选项来关闭算法。(2)发送长度:发送每条数据时,将数据的长度一并发送,例如规定数据的前4位是数据的长度,应用层在处理时可以根据长度来判断每个分组的开始和结束位置。
    UDP则是面向消息传输的,是有保护消息边界的,接收方一次只接受一条独立的信息,所以不存在粘包问题。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值