赞
踩
学习tcp,要先弄清tcp的头部,里面有个检验码。检验数据的完整性。
传输层中含有的协议有:tcp、udp协议。协议:都要遵守的规则,是为了方便沟通、指定约束。
网络通信四元组:源ip、目的ip、源端口、目的端口。
网络通信五元组:加了一个协议。
扩展知识:头部就相当于数据结构。一整个数据结构是:应用层的data和协议加传输层中的头部信息。
应用层中的data通过playload,里面有http头部--传输到传输层
传输层中的data通过playload,里面有tcp、udp头--传输到网络层
网络层中的data通过playload,里面含有ip头。
目录
1、tcp/ip协议参考模型:
tcp/ip 4层模型:应用层、传输层、互联网层、网络接口层。
tcp/ip 5层模型:应用层、传输层、网络层、数据链路层、物理层。
OSI 7层模型:应用层、表示层、会话层、传输层、网络层、数据链路层、物理层。
2、tcp/ip模型与OSI模型的比较:
①相同点:
两者都是以协议栈的概念为基础;协议栈中的协议彼此相互独立;下层对上层提供服务。
②不同点:
OSI是先有模型,tcp/ip是先有协议,后有模型。
OSI适用于各种协议栈;TCP/IP只适用于TCP/IP网络
层次数量不同。
1、ip层提供点对点的连接
2、传输层提供端对端的连接
1、TCP:传输控制协议,英文为:transmission control protocol。它是一种面向连接的、可靠的、基于字节流的传输层的通信协议。传输效率低。
2、UDP:用户数据报协议,英文为:User Datagram Protocol。它是一种不可靠的、无连接的服务。传输效率高。qq、dns、dhcp使用的就是udp协议。
TCP (Transmission Control Protocol)和UDP(User Datagram Protocol)协议属于传输层协议。其中TCP提供IP环境下的数据可靠传输,它提供的服务包括数据流传送、可靠性、有效流控、全双工操作和多路复 用。通过面向连接、端到端和可靠的数据包发送。通俗说,它是事先为所发送的数据开辟出连接好的通道,然后再进行数据发送;而UDP则不为IP提供可靠性、 流控或差错恢复功能。一般来说,TCP对应的是可靠性要求高的应用,而UDP对应的则是可靠性要求低、传输经济的应用。 TCP支持的应用协议主要有:Telnet、FTP、SMTP等; UDP支持的应用层协议主要有:NFS(网络文件系统)、SNMP(简单网络管理协议)、DNS(主域名称系统)、TFTP(通用文件传输协议)等。 TCP/IP协议与低层的数据链路层和物理层无关,这也是TCP/IP的重要特点。
1、TCP的封装格式:封装头部占20个字节(ip头部也是20个字节,帧的头部也是20个字节)
TCP的紧急行为就是修改tcp包头。
2、tcp封装格式中所占的字节大小:
其中的16位源端口号:占2个字节;16位目的端口:占2字节;32序号占4字节;32位确认号占4字节;4位头部长度。1个字节=8位。
选项是非常有用的。
3、TCP的头部结构描述:
16位的源端口 +16位目的端口---》端口范围 0~65535(2^16) 1-65536
运输层的端口号分为服务端使用的端口号(0~1023)指派给熟知端口,1024~49151是登记端口号和客户端暂时使用的端口号(49152~65535)。
源端口号:发送TCP进程对应的端口号。
目标端口号:目标端口号接收进程的端口号。
源端口号和目的端口号再加上一个ip首部的源ip地址和目的ip地址可以唯一确定一个TCP连接。
32位序列号(seq):0~2^32-1范围,数据段标记,用于目的端对到达包的重组。
32位确认号(ack):0~2^32-1范围内,对发送端的确认信息,告诉发送端这个序号之前的数据段都收到了。只有ACK标志位为1时,确认序列号才有效,ack=上一个的seq(序列号)+1。
6个标志位:(值为1或者为0)
URG:紧急指针有效位,与16位紧急指针配合使用。
ACK:确认序列号有效位,表明该数据包包含确认信息。
PSH:通知接收端立即将数据提交给用户进程,不在缓存中停留,等待更多的数据。
PST:为1的时候,请求重新建立TCP连接。reset 重置,重新连接。
SYN:为1时,请求建立连接。sync 同步。
FIN:为1时,数据发送完毕,请求断开连接。finish。
16位窗口大小:滑动窗口的大小,指明本地可以接收的数据的字节数。
ISN:序列号
假设:A去访问B,A上会生成一个初始序列号(随机生成的),发送数据包(比如发送①②③号包),在tcp中有30个字节(每个字节流都有个序列号),其中的seq=ISN+30(完整的序列号),序列号会一直会往上递增,①②③号数据包发送完之后只需要确实数据包③。B先对收到的数据包进行确认。
32位序列号 -----单调递增的。
A--》B发送第一个包,生成一个初始序号--随机 假如第一个有30个字节。
发送第二个包,会生成第二个包ISN+第二个包的第一个字节偏移量 序列号= ISN+30
m---单调递增
ISN=M + Md5(四元组)
序列号是单调递增的,初始序列号是随机的。
序列号是32位,如果序列号达到最大值,序列号就会产生回绕,序列号32位保存,总会有尽头,达到尽头的时候,序列号就会从0开始,那么使用序列号就无法判断出哪个是以前的包,哪个是之后的包。这就会引入选项。
为了避免回绕就会在选项里加上timestamp时间戳 选项 发送方发送的时间戳和接受方的时间戳。
4、那么就要思考一下:为什么要生成一个初始的序列号呢:
① 在tcp的三次握手(待会会细讲三次握手流程)中,采用随机产生的初始序列号进行请求,这样做主要是为了出于网络安全的因素着想。如果不是随机产生的初始序列号,黑客就会以很容易的方式获取到你与其他主机之间通信的初始化序列号,并且伪造序列号进行攻击,这已经成为一种很常见的网络攻击手段。
② 所以随机的序列号是为了安全性考虑的,黑客不会那么容易猜到序列号,不会伪装一些确认序列包,从而对服务器发起攻击。
TCP是面向连接的。它必须建立好连接之后才能传输数据。
TCP建立连接的过程就是三次握手,确认双方都能通信。
TCP断开连接的过程就是四次断开。
可靠传输的工作原理:我们知道,TCP发送的报文段是交给IP层传输的。但是IP层只能尽最大努力服务,也就是说,TCP下面的网络提所提供的是不可靠的传输。因此TCP必须采用适当的措施才能使得两个运输层之间的通信变得可靠:
理想传输的条件有两个特点:(1)传输信道不产生差错。(2)不管发送方以多快的速度发送数据,接收方总是来得及处理收到的数据。
然而实际的网络都不具备以上两个理想条件,但是我们可以使用一些可靠传输协议来实现可靠传输。
活动的窗口:
1、停止等待协议:很早之前的协议。
A发送1号包,2号包只有等待1号包全部发送完之后,确认完成之后,但是如果一直等待就会引入重传计数器:重传的计算时间,超时的设置,时间到了之后就会重新发送一次。优点:保证数据的可靠传输;最大弊端:效率很低,传输效率低。
2、连续ARQ协议
连续ARQ协议相当于退回n帧协议和选择重传协议(相当于对退回n帧协议的改进)。只会确认连续的最大包。依赖于滑动窗口协议。
一次性连续发送多个包,比如:连续发①②③包,只需要确认③号包,就能确保前面两个包发送成功,那就会出现前面的包发过去,有②包丢了,就只剩①③包,就会采用累计确认方式,之后确认连续的最大包。其中发送方是不知道包已经发送成功,只会知道ack是否已经发送。
连续 ARQ 协议规定,发送方每收到一个确认,就把发送窗口向前滑动一个分组的位置。
接收方一般都是采用累积确认的方式。也就是说,接收方不必对收到的分组逐个发送确认,而是在收到几个分组后,对按序到达的最后一个分组发送确认。这就表示:到这个分组为止的所有分组都已正确收到了。累积确认有优点也有缺点。优点是:容易实现,即使确认丢失也不必重传。但缺点是不能向发送方反映出接收方已经正确收到的所有分组的信息。
如果发送方发送了前 5 个分组,而第 3 个分组丢失了。此时接收方只能对前两个分组发出确认,因为接收方只能对按需到达的最后一个分组发送确认。发送方无法知道后面三个分组的下落,只好把后面的三个分组都再重传一次。这就叫做Go-back-N(回退N),表示需要再退回来重传已发送过的 N 个分组。
可见当通信线路质量不好时,连续 ARQ 协议会带来负面的影响。例如发送12345号包,3号包丢失了之后,就只到连续的最大包,只到2号包,然后后面的345就会选择重传协议,对这三个包进行重新发送。
于是tcp引入了tcp滑动窗口协议。
3、滑动窗口协议:tcp基于连续arq协议和滑动窗口协议。
tcp滑动窗口协议 --缓存(窗口)(双方都需要具有缓存-发送方和接收方) 基于ARQ协议开发的。
tcp头部字段中有个16位窗口大小,用来处理滑动窗口。窗口就相当于缓存。会有个地方专门的去记录在哪丢失,到时候直接发送发送丢失的那个包。
滑动窗口就是等待确认的,可以连续发送ack,连续发送是可靠了,速率也提升了。滑动窗口是成对存在的,有一个发送方的窗口和接收方的窗口。(发送方的缓存和接受方的缓存)。
接受方发送完ack之后(其中就是拆包头,拿到序列号),就会将数据交给应用。每次发送ack的时候,都会通知应用能接收的大小。
如果4还没发送过来,会等一下发送过来,5以后的包也不受影响继续发送。延迟确认4号的包,延迟确认的时候使用系统的内核决定的,会有一个等待确认时间是:200ms。
如果8的包丢失了,退出n帧协议,就是从8的包就开始重新发送。会造成网络更加拥堵,于是选择退回重传协议,就引入
哪些包缺失了就重传哪些包,就查看内核参数:退回重传协议=1表示是开启的,双方都需要同意的这个协议。
查看退回重传协议的文件:
[root@nginx-kafka01 ipv4]# pwd
/proc/sys/net/ipv4
[root@nginx-kafka01 ipv4]# cat tcp_sack
1
在网络畅通的情况下:
发送方 | 接收方 |
已发送 已收到 | 已发送ack 但未交给应用程序 |
已发送 未收到 | 已发送ack 已经交给应用程序 滑动窗口往后挪 |
未发送 滑动窗口里面和外面 | 已收到包 但是未发送ack |
接收方的win = 0(告诉发送方窗口已经满了),发送方的(win是窗口大小)win=0,发送方不会发送数据,直到接收方通知发送方win不等于0。如果通知发送方win不等于0的数据丢失的时候,就开启坚持计时器:超过了坚持计时器还没有收到接收方的一个win窗口大小的通知,那它(发送方)自己会主动去询问,询问接收的大小是多少。
坚持计时器:防止产生死锁。
拥塞窗口 :一个值
发送方的窗口大小,取决于拥塞窗口比较小的值(=win(拥塞窗口,接收方发过来的win值))
假设接收方有足够大的容量值。
cwnd ------发送ack cwad 每收到一个ack就加一。
拥塞控制主要是四个算法:
(1)慢启动
(2)拥塞避免
(3)快重传(拥塞发生)
(4)快速恢复
①慢启动是一个幂值,呈指数型增长,达到慢启动的ssthresh阈值(值的大小在内核中)之后就变快。ssthresh:慢启动的阈值。thresh:阈值。ss:slow start:慢启动。
②拥塞避免(加法增大):经过一个rtt时间(记录时间)就增加1,接受方win的容量很大的情况。③快重传:收到三个重复ack之后就会执行快重传。快重传是基于ack的。
A客户端如果发送12345号包,如果2号包丢失了,即使345包发送过去了,但是A接受方(服务器)收到345包之后,发送三个ack给客户端,收到三个重复的ack之后,A客户端就会执行快重传。
④ 快恢复:sshthresh阈值降为原来的一半,进入拥塞避免,加法增大。
③:如果在第③出现超时的情况(没有收到3个重复ack):就又开始从慢启动开始达到阈值然后进入拥塞避免,然后就进入快恢复阶段,拥塞避免。
用户空间:用户程序:ssh nginx kafka
内核空间:操作系统使用
用户访问内核空间通过系统调用,有系统暴露的接口(函数),系统调用的函数是属于内核的,用户读取某个系统文件,磁盘的信息是内核通过自己的调用给用户的。
1、校验和
2、确认
3、超时—计时器—重传计时器
① 重传计时器:超时重新传数据包的时候,计时器会清零。
当ack包迟迟未收到,服务器端检测超时,服务器就会重新发送数据包:SYN+ACK的数据包。
② 坚持计时器:防止零窗口死锁。
③ 保活计时器:防止两个tcp之间的连接长时间的空闲。
④ 时间等待计时器:连接终止期间使用的。在发送了最后一个ACK之后,不会立即关闭连接,而是等待一段时间,保证能接收到重复的FIN数据段。MSL指的是Maximum Segment Lifetime:一段TCP报文在传输过程中的最大生命周期。2MSL,最大报文生存时间,一个MSL30秒; 2MSL=60s
书上默认最大等待时间是两分钟。
打开网站是http协议的,为http协议是基于tcp协议的。
UDP:传输层另一个重要的协议就是用户数据报协议 UDP(User Datagram Protocol)。UDP 只在 IP 的数据报服务之上增加了很少一点的功能,这就是复用和分用的功能以及差错检测的功能。qq、dns一般是用于UDP的,是一个不用面向连接、不可靠的传输协议。
tcp是面向连接的、可靠的、基于字节流的。
udp是无连接的、不可靠的(尽最大努力交付)、面向报文的协议 ----qq视频 dns域名解析
udp优点:速度快。
tcp是如何面向连接的:三次握手和四次挥手。
tcp的可靠体现在:有很多计时器:重传计时器、校验、需要确认。
① 校验和
② 序列号
③ 确认应答序列号
④ 超时重传
⑤ 连接管理:三次握手、四次挥手
⑥ 流量控制
⑦ 拥塞控制:滑动窗口
查看方式:/etc/ services
TCP的应用+端口号:
telnet 23 远程控制的,明文传输,不安全
ssh 22 密文
http 80
mysql 3306
ftp 21
dns 53 dns的主从服务器之间的数据传输
SMTP 25 发送邮件
pop3 110 收取邮件的
UDP的经典应用层的协议:
QQ 8000
dns 53 --》域名解析
dhcp 67
ntp 网络时间协议 123
nfs
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。