本文章结合许多互联网中的数据。所谓取之互联网,用之互联网。若涉及版权侵犯,可以留言或者私信告知。
花了很多时间总结,目前还有很多知识更新中,有什么错误欢迎评论交流。
TCP虽然是面向字节流的,但TCP传送的数据单位却是报文段。一个TCP报文段分为首部和数据两部分,而TCP的全部功能体现在它首部中的各字段的作用。
TCP报文段的前20个字节是固定的,后面4n字节是根据需要而增加的选项。因此TCP首部的最小长度是20字节。
首部固定部分各字段意义:
源端口和目的端口(各占2byte):分别写入源端口和目的端口。
序号(4byte):序号使用mod232运算,范围为【0,232-1】。TCP是面向字节流的。在一个TCP连接中传送的字节流中的每一个字节都按顺序编号。首部中的序号字段值则是指的是本报文段所发送数据的第一个字节的序号。用来解决网络包乱序问题。
例如,一报文段的序号是301,而接待的数据共有100字节。这就表明:本报文段的数据的第一个字节的序号是301,最后一个字节的序号是400。显然,下一个报文段(如果还有的话)的数据序号应当从401开始,即下一个报文段的序号字段值应为401。这个字段的序号也叫“报文段序号”。
确认应答号(4byte):指期望收到对方下一个报文段的第一个数据字节的序号,发送端收到这个确认应答以后可以认为在这个序号以前的数据都已经被正常接收。用来解决不丢包的问题。
例如,B正确收到了A发送过来的一个报文段,其序号字段值是501,而数据长度是200字节(序号501~700),这表明B正确收到了A发送的到序号700为止的数据。因此,B期望收到A的下一个数据序号是701,于是B在发送给A的确认报文段中把确认号置为701。
数据偏移(4位):指出TCP报文段的数据起始处距离TCP报文段起始处有多远。这个字段实际上是指出TCP报文段的首部长度。由于首部中还有长度不确定的选项字段,因此数据偏移字段是必要的。数据偏移的单位是32位字(4字节),由于4位二进制数能表示的最大十进制数字是15,因此数据偏移的最大值是4*15=60字节,这也是TCP首部的最大字节(即选项长度不能超过40字节)。
保留(6位):保留为今后使用,但目前应置为0 。
控制位(各占1位):
紧急URG(URGent):当URG=1时,表明紧急指针字段有效。它告诉系统此报文段中有紧急数据,应尽快发送(相当于高优先级的数据)。
例如:已经发送了一个程序要在远地的主机上运行,但后来发现了一些问题,需要取消该程序的运行,因此用户从键盘发出中断命令。如果不使用紧急数据,那么这两个字符将存储在接收TCP的缓存末尾,只有在所有的数据被处理完毕后这两个字符才被交付给接收方的应用进程。当URG=1,发送的应用进程就告诉发送方的TCP有紧急数据要传送。于是发送方TCP就把紧急数据插入到本报文段数据的最前面,而在紧急数据后面的数据仍然是普通数据。这时要与首部中紧急指针(Urgent Pointer)字段配合使用。
确认ACK(ACKnowledgment):当ACK = 1时确认号字段才有效。TCP规定,在连接建立后所有传送的报文段都必须把ACK置为1。
推送PSH(PuSH):当两个应用进程进行交互式通信时,有时一端的应用进程希望在键入一个命令后立即就能收到对方的响应。在这种情况下,TCP就可以使用推送(push) *** 作。这时,发送方TCP把PSH置为1,并立即创建一个报文段发送出去。接收方TCP收到PSH=1的报文段,就尽快地交付接收应用进程。而不用等到整个缓存都填满后再向上交付。
复位RST(ReSeT):当RST=1时,表明TCP连接中出现了严重错误(如由于主机崩溃或其他原因),必须释放连接,然后再重新建立连接。RST置为1还用来拒绝一个非法的报文段或拒绝打开一个连接。
同步SYN(SYNchronization):用来建立连接。当SYN=1而ACK=0时,表明这是一个连接请求报文段。对方若同意建立连接,则应在响应的报文段中使SYN=1和ACK=1,因此SYN=1就表示这是一个连接请求或连接接受报文。
终止FIN(FINis):用来释放一个连接。当FIN=1时,表明此报文段的发送发的数据已发送完毕,并要求释放运输连接。
窗口(2byte):窗口指的是发送本报文段的一方的接受窗口(而不是自己的发送窗口)。窗口值是【0,2^16-1】之间的整数。窗口值告诉对方:从本报文段首部中的确认号算起,接收方目前允许对方发送的数据量(以字节为单位)。之所以要有这个限制,是因为接收方的数据缓存空间是有限的。总之,窗口值作为接收方让发送方设置其发送窗口的依据。窗口字段明确指出了现在允许对方发送的数据量。窗口值经常在动态变化。
例如,发送了一个报文段,其确认号是701,窗口字段是1000,这就是告诉对方:“从701算起,我(即发送方报文段的一方)的接收缓存空间还可接受1000个字节数据(字节序号是701~1700),你在给我发数据时,必须考虑到这一点。”
检验和(2byte):检验和目的是为了发现TCP首部和数据在发送端到接收端之间发生的任何改动。如果接收方检测到检验和有差错,则TCP段会被直接丢弃。和UDP用户数据报一样,在计算检验和时,要在TCP报文段的前面加上12字节的伪首部。伪首部的格式和UDP用户数据报的伪首部一样。但应把伪首部第4个字段中的17改为6(TCP的协议号是6);把第5字段中的UDP中的长度改为TCP长度。接收方收到此报文段后,仍要加上这个伪首部来计算检验和。若使用TPv6,则相应的伪首部也要改变。
紧急指针(2byte):紧急指针仅在URG=1时才有意义,它指出本报文段中紧急数据的字节数。因此,在紧急指针指出了紧急数据的末尾在报文段中的位置。当所有紧急数据都处理完时,TCP就告诉应用程序恢复到正常 *** 作。即使窗口为0时也可以发送紧急数据。
选项:长度可变,最长可达40字节。当没有使用选项时,TCP的首部长度是20字节。
最大报文段长度MSS(Maximum Segment Szie): MSS是每一个TCP报文段中的数据字段的最大长度。TCP最初只规定了这一种选项。
数据字段长度=TCP报文段长度-TCP首部长度
我们知道,TCP报文段的数据部分,至少要加上40字节的首部(TCP首部20字节和IP首部20字节,这里还没有考虑首部中的可选部分)才能组装成一个IP数据报。若选择较小的MSS长度,网络的利用率就降低。设想在极端情况下,当TCP报文段只含有1字节的数据时,在IP层传输的数据报的开销至少有40字节。这样,对网络的利用率就不会超过1/41。到了数据链路层还要加上一些开销。但反过来,若TCP报文段非常长,那么在IP层传输时就有可能要分解成多个短数据报片。在终点要把收到的各个短数据报片组成成原来的TCP报文段,当传输出错时还要进行重传,这些也都会使开销增大。因此,MSS应尽可能大些,只要在IP层传输时不需要分片就行。由于IP数据报所经历的路径是动态变化的,因此在这条路径上确定的不需要分片的MSS,如果改走另一条路径就可能需要进行分片。因此最佳的MSS是很难确定的。在连接过程中,双方都把自己能够支持的MSS写入这一字段,以后就按照这个数值传输数据,两个传送方向可以有不同的MSS值。若主机未填写这一项,则MSS的默认值是536字节长。因此,所有在互联网上的主机都应该接受的报文段长度是536+20(固定首部长度)=556字节。
扩大窗口选项(3byte):为了扩大窗口。TCP首部中窗口字段长度是16位,因此最大的窗口大小为64K字节,要获得高吞吐量需要更大的窗口大小。
窗口扩大选项占3字节,其中有一个字节表示移位值S。新的窗口值等于TCP首部中的窗口位数从16增大到(16+S)。移位值允许使用的最大值是14,相当于窗口最大值增大到2(16+14)-1=230-1。
窗口扩大选项可以在双方初始建立TCP连接时进行协商。如果连接的某一端实现了窗口扩大,当它不再需要扩大其窗口时,可发送S=0选项,使窗口大小回到16。
时间戳选项(10byte):其中最主要的字段是时间戳字段(4字节)和时间戳回送回答字段(4字节)。
用来计算往返时间RTT。发送方在发送报文段时把当前时钟的时间值放入时间戳字段,接收方在确认该报文段后把时间戳字段复制到时间戳回送回答字段。因此,发送方在收到确认报文后,可以准确地计算出RTT来。**用于处理TCP序号超过232的情况,这又称为防止序号绕回PAWS**。TCP报文段的序号只有32位,而每增加232个序号就会重复使用原来用过的序号。当使用高速网络时,在一次TCP连接的数据传送中序号很可能被重复使用。例如,当使用1.5Mbit/s的速度发送报文段时,序号重复要6小时以上。但若用2.5Gbit/s的速率发送报文段,则不到14秒钟序号就会重复。为了使接收方能够把新的报文段和迟到很久的报文段区分开,则可以在报文段中加上这种时间戳。
- 目标和源端口:主要是告诉 UDP 协议应该把报文发给哪个进程。报文长度:该字段保存了 UDP 首部和数据的长度之和。校验和:校验和是为了提供可靠的 UDP 首部和数据而设计。
伪首部的消失:发送方将计算完毕的校验和填入首部的检验和字段后,去除伪首部发送UDP报文作用:为了计算校验和 为什么需要TCP协议?TCP工作在哪一层?
IP 层是不可靠的,它不保证网络包的交付、不保证网络包的按序交付、也不保证网络包中数据的完整性。如果需要保障网络数据包的可靠性,那么就需要由上层(传输层)的 TCP 协议来负责。因为 TCP 是⼀个工作在传输层的可靠数据传输的服务,它能确保接收端接收的网络包是无损坏、无间隔、非冗余和按序的。
什么是TCP?TCP(Transmission Control Protocol)是面向连接的、可靠的、基于字节流的传输层通信协议。
面向连接:⼀定是⼀对⼀才能连接可靠的:无论网络链路中出现了怎样的链路变化,TCP 都可以保证报文⼀定能够到达接收端字节流:消息是没有边界的,所以无论我们消息多大都可以进行传输。并且消息是有序的,当前一个消息没有收到之前,即使它先收到了后面的消息,那么也不能扔给应用层去处理,同时对重复的报文会自动丢弃。 什么是TCP连接?
用于保证可靠性和流量控制维护的某些状态信息称为连接,这些信息的组合包括Socket、序列号和窗口大小。
建立⼀个TCP连接是需要客户端与服务器端达成上述三个信息的共识
Socket:由IP地址和端口号组成序列号:用来解决乱序问题等窗口大小:用来做流量控制 如何唯一确定一个TCP连接?
TCP 四元组可以唯⼀的确定⼀个连接。
源地址源端口目标地址目标端口
源地址和目的地址的字段(32位)是在 IP 头部中,作用是通过 IP 协议发送报文给对方主机。
源端口和目的端口的字段(16位)是在 TCP 头部中,作用是告诉 TCP 协议应该把报文发给哪个进程。
TCP和UDP的区别- 连接
TCP是面向连接的传输层协议,传输数据前先要建立连接UDP是不需要连接,即刻传输数据 服务对象
TCP是一对一的两点服务,即一条连接只有两个端点UDP 支持一对一、一对多、多对多的交互通信 可靠性
TCP 是可靠交付数据的,数据可以无差错、不丢失、不重复、按需到达。UDP 是尽最大努力交付,但不保证可靠交付数据。 拥塞控制、流量控制
TCP 有拥塞控制和流量控制机制,保证数据传输的安全性。UDP 则没有,即使网络非常拥堵了,也不会影响 UDP 的发送速率。 首部开销
TCP 首部长度较长,会有一定的开销。首部在没有使用选项字段时是20 个字节,如果使用了选项字段则会变长的。UDP 首部只有8个字节,并且是固定不变的,开销较小。 传输方式
TCP是流式传输,没有边界,但保证顺序和可靠UDP是一个包一个包的发送,是有边界的,但可能会丢包和乱序
传输控制协议TCP(Transmission Control Protocol)是面向连接的,提供可靠交付,有流量控制,拥塞控制,提供全双工通信,面向字节流(把应用层传下来的报文看成字节流,把字节流组织成大小不等的数据块),每一条 TCP 连接只能是点对点的(一对一)。用户数据报协议UDP(User Datagram Protocol)是无连接的,尽最大可能交付,没有拥塞控制,面向报文(对于应用程序传下来的报文不合并也不拆分,只是添加 UDP 首部),支持一对一、一对多、多对一和多对多的交互通信。 为什么 UDP 头部没有「首部长度」字段,而 TCP 头部有「首部长度」字段呢?
TCP 有可变长的「选项」字段,而 UDP 头部长度则是不会变化的,无需多⼀个字段去记录 UDP 的首部长度。
为什么 UDP 头部有「包长度」字段,而 TCP 头部则没有「包长度」字段呢?为了补全UDP首部长度是 4 字节的整数倍,才补充了「包长度」字段。
1.1.2 TCP连接建立TCP三次握手四次挥手
TCP三次握手第一次握手:客户端将SYN标志位置1,随机初始化序号(client_isn)作为TCP首部的【序列号】seq,然后把第一个SYN报文发送给服务端。第二次握手:服务端收到了来自客户端的报文,通过SYN=1,知道了这是要请求建立连接,于是随机初始化序号(server_isn)作为TCP首部的【序列号】,然后把TCP首部的【确认应答号】ack=client_isn+1,将SYN和ACK的标志位置为1后发送该报文给客户端。第三次握手:客户端收到服务端的报文后,还要向服务端回应最后一个应答报文。首先将应答报文TCP首部ACK标志位置为1,【确认应答号】ack=server_isn+1,【序列号】seq=client_isn+1,最后将报文发送给服务端。这次报文可以携带数据。 为什么不能是两次握手?
如果是两次握手,第一次握手时,客户端发送的SYN发生网络拥堵,造成服务器无法进行第二次握手,客户端迟迟未收到回复,又发送了一次请求。服务端收到第一次的SYN进行第二次握手,客户端收到后建立连接。之后服务端又收到客户端第二次发送的SYN进行第二次握手,客户端收到后又建立连接。建立多个冗余的无效链接,造成了不必要的浪费。如果是三次握手,客户端收到第一个ACK时会发现这是一个历史连接,然后第三次握手会发送RST报文,以此中止历史连接,收到第二个ACK发现这不是历史连接就发送ACK报文,成功建立连接。
为什么不能是四次握手?三次握手就已经理论上最少可靠连接建立,所以不需要使用更多的通信次数。
为什么是三次握手?防止旧的重复连接初始化造成混乱(主要)同步双方初始化序列号避免造成资源浪费 为什么要传回SYN?
接收端传回发送端所发送的SYN是为了证明双方的通信通道没有问题。
为什么要传ACK?确认信息的准确无误。
半打开和半关闭的区别半打开:连接中的一方已经崩溃下线了,另外一端还不知道半关闭:连接中的一方已经发送了FIN报文,等待另一方发送 1.1.3 TCP连接断开 TCP四次挥手
第一次挥手:客户端请求断开连接,发送一个TCP首部FIN=1的报文,表示请求断开连接。第二次挥手:服务端收到客户端的FIN报文后,向客户端发送ACK应答报文,表示收到请求。第三次挥手:经过前两次挥手,客户端不再发送数据给服务端,但还可以接收服务端的数据。服务端把数据发送完毕后,发送一个FIN报文,请求断开连接。第四次挥手:客户端收到服务端的FIN报文,回复一个ACK应答报文,然后进入等待(TIME_WAIT)。之后服务端收到ACK应答报文后成功断开连接,客户端等待2MSL后也断开连接。 为什么需要TIME_WAIT状态?
主动请求关闭连接的一方才有TIME_WAIT状态
防止具有相同四元组的旧连接数据包被收到
经过2MSL,足以让两个方向上的数据包被丢弃,使得原来连接的数据包在网络中都自然消失,再出现的数据包一定都是新建立连接所产生的。
保证连接正确关闭
等待足够的时间以确保最后的 ACK 能让被动关闭方接收(没收到就会重发第三次挥手的FIN报文),从而帮助其正常关闭。
如果客户端没有等待或者时间过短,当最后一个发送的ACK报文碰到网络拥堵或者丢失时,服务端迟迟不能收到导致不能正确关闭。所以当客户端发送新的请求连接时,服务端就会发送RST报文终止连接的建立。
如果客户端等待时间过长就会造成内存资源和端口资源的浪费。
MSL和TTL的定义?MSL(Maximum Segment Lifetime):报文最大生存时间,它是任何报文在网络上存在的最长时间,超过这个时间报文将被丢弃。
TTL:IP 数据报可以经过的最大路由数,每经过一个处理它的路由器此值就减 1,当此值为 0 则数据报将被丢弃,同时发送 ICMP 报文通知源主机。
MSL 应该要大于等于 TTL 消耗为 0 的时间,以确保报文已被自然消亡。
为什么TIME_WAIT等待的时间是2MSL?网络中可能存在来自发送方的数据包,当这些发送方的数据包被接收方处理后又会向对方发送响应,所以一来一回需要等待 2 倍的时间。
比如,如果被动关闭方没有收到断开连接的最后的 ACK 报文,就会触发超时重发 FIN 报文,另一方接收到 FIN 后,会重发 ACK 给被动关闭方, 一来一去正好 2 个 MSL。
2MSL 的时间是从客户端接收到 FIN 后发送 ACK 开始计时的。如果在 TIME_WAIT 时间内,因为客户端的 ACK 没有传输到服务端,客户端又接收到了服务端重发的 FIN 报文,那么 2MSL 时间将重新计时。
在 Linux 系统里 2MSL 默认是 60 秒,那么一个 MSL 也就是 30 秒。
为什么挥手需要四次?因为第一次挥手只是断开从客户端到服务端的数据传送,但是客户端还是可以接收服务端的数据,可能此时服务端的数据还没发送完。所以第二次挥手服务端只是告诉客户端收到了消息,等到服务端不再发送数据才进行第三次挥手,表示服务端同意关闭连接。
服务端通常需要等待数据传送完成,所以服务端的ACK和FIN一般需要分开发送,所以比三次握手多一次。
1.1.4 TCP粘包这是一个超链接
发送端为了将多个发往接收端的包,更加高效的发给接收端,于是采用了优化算法**(Nagle算法)**,将多次间隔较小、数据量较小的数据,合并成一个数据量大的数据块,然后进行封包。
什么是TCP粘包问题?TCP粘包就是指发送方发送的若干包数据到达接收方时粘成了一包,从接收缓冲区来看,后一包数据的头紧接着前一包数据的尾。
TCP粘包的原因
发送方
收集多个小分组,在一个确认到来时一起发送可能会出现粘包问题
接收方
TCP接收数据包到缓存的速度大于应用程序从缓存中读取数据包的速度,多个包就会被缓存,应用程序就有可能读取到多个首尾相接粘到一起的包。
什么时候处理粘包现象?当tcp发送一个数据块的时候,里面包含了多组不相关的数据,就需要处理粘包
如何解决粘包现象?发送端关闭Nagle算法发送端发送每一组数据对应的长度,应用层根据长度处理出每一组数据的开头和结束位置
1.2 TCP重传、滑动窗口、流量控制和拥塞控制 1.2.1 重传机制 超时重传UDP传输接收方一次只接受一条独立的信息,不会产生粘包问题
发送数据时设置一个定时器,超过指定时间没有收到ACK就会重发数据。
两种情况发生超时重传
数据包丢失确认应答丢失
超时时间的设置
RTT(Round-Trip Time):数据从网络一端传送回到这一端所需要的时间,即包的往返时间。
RTO(Retransmission Timeout):超时重传时间
RTO的值应该略大于RTT的值
快速重传不以时间为驱动,而是以数据驱动重传。
发送端收到三个重复的ACK=2,知道了Seq2没有收到,会在定时器过期之前,重传丢失的Seq2。
但不知道需要重传Seq2还是重传Seq2-5。
SACK方法在快速重传的基础上,TCP头部【选项】字段加一个SACK,将缓存的地图发给发送方,这样发送方就知道哪个数据没收到,只重传丢失的数据。
D-SACK(Duplicate SACK)又称D-SACK,使用了SACK来告诉发送方有哪些数据被重复接收了。
ACK丢包
接收方发现数据是重复收到的,于是回了一个SACK=3000~3500,告诉发送方这个数据早已被接收了,因为ACK都已经到4000了。这个SACK代表D-SACK。
网络延时
接收方收到重复的数据毁了一个SACK=1000~1500,因为ACK已经到3000,所以这个SACK是D-SACK,表示收到了重复的包。
D-SACK的好处
可以让发送方知道是数据包丢了还是ACK丢了可以知道是不是数据包被延迟了可以知道数据包是不是在网络中被复制了 1.2.2 滑动窗口
什么是滑动窗口?
滑动窗口类似于一个窗口(一次批量可以发送多少数据)的东西,用来告诉发送端可以发送数据的大小或者说是窗口标记了接收端缓冲区的大小。
为什么会出现滑动窗口?
每一个发送的数据段,都要收到一个ACK确认应答,收到后再发送下一个数据段,性能较差。使用滑动窗口,就可以一次发送多条数据,提高性能。
窗口
(1)接收端将自己可以接收的缓冲区大小放入TCP首部的“窗口大小”字段,通过ACK来通知发送端,所以窗口大小由接收方的窗口大小决定。
(2)窗口大小字段越大,网络的吞吐率越高。
(3)窗口大小指的是无需等待确认应答而可以继续发送数据的最大值。
(4) *** 作系统内核为了维护滑动窗口,需要开辟发送缓冲区,记录当前哪些数据没有应答,只有确认应答过的数据,才能从缓冲区删掉。如果发送缓冲区过大就会有空间开销。
(5)接收端一旦发现自己的缓冲区快满了,就会将窗口大小设置成一个更小的值通知给发送端,发送端收到这个值后,就会减慢自己的发送速度。
(6)如果接收端发现自己的缓冲区满了,就会将窗口大小设置为0,此时发送端将不再发送数据,但是需要定期发送一个窗口探测数据段,使接收端把窗口大小告诉发送端。
发送方的滑动窗口数据类型
已发送,但是还没收到确认的可以发送,但是还没发送的
发送窗口不变的情况下,已发送的收到ACK后,整个滑动窗口会往右移动。
接收方的滑动窗口数据类型
未收到,但可以收到的数据
接收窗口的大小约等于发送窗口的大小,并不是完全相等的。(存在延时,接收方变大了,告诉发送方需要时间)
滑动窗口的优点
可以高效可靠的发送大量的数据
1.2.3 流量控制(1)接收端抑制发送端的依据:接收端缓冲区的大小
(2)流量控制的目标是接收端,是怕接收端来不及处理
(3)流量控制的机制是丢包
什么是流量控制?
防止发送方发的太快,耗尽接收方的资源,从而使接收方来不及处理。
怎样实现流量控制?
使用滑动窗口。接收方指明希望从发送方接收数据的大小。
1.2.4 拥塞控制什么是拥塞控制?
防止发送方发的太快,使得网络来不及处理,从而导致网络拥塞。
拥塞控制使用的机制:AIMDslow start
slow start:慢启动
A:additive(加法的)
I:increase(增加)
M:multiplicative(乘法的)
D:decrease(减少)
就是加法增加,乘法减少—>加增乘减
加法增加
执行拥塞避免算法后,在收到所有报文段的确认后(即经过一个往返时间),就把拥塞窗口cwnd(好比网络限速)增加一个MSS大小,使拥塞窗口缓慢增大,以防止网络过早出现阻塞。
乘法减少
出现一次超时(即出现一次网络阻塞),就把慢开始门限值ssthresh设置为当前阻塞窗口值乘以0.5。
什么是拥塞窗口?
拥塞窗口cwnd是发送方维护的一个状态变量,会根据网络的拥塞程度动态变化。
发送窗口swnd=min(cwnd,rwnd【接收窗口】)
发送端如何知道已经丢包?(怎么知道当前网络出现拥塞?)
定时器超时或者收到三个重复的ACK
为什么会有拥塞控制?
流量控制虽然可以高效可靠的传送大量的数据,但是如果在刚开始阶段就发送大量的数据,可能会导致网络拥堵。
拥塞控制的表现
丢包
延时变长
拥塞控制的工作机制
初始化阶段
初始拥塞窗口cwnd为1
慢开始阶段:拥塞窗口cwnd以指数增长
在执行慢开始算法时,拥塞窗口cwnd的初始值为1,发送第一个报文段M0。发送端每收到一个确认,就把cwnd加1。于是cwnd变为2,发送端可以接着发送M1和M2两个报文段。之后发送端会收到两个确认,cwnd就会增长到4,这时就可以接着发送后面的4个报文段,因此拥塞端口cwnd以指数增长。
拥塞避免阶段:拥塞窗口按线性规律增长
当cwnd增长到慢开始门限值ssthresh时,就改为执行拥塞避免算法,cwnd每经过一个往返延时就增加一个MSS的大小,以线性规律增长。
拥塞调整阶段:慢开始门限值ssthresh设置为当前阻塞窗口值乘以0.5
假定拥塞窗口数值增长到24时,网络出现超时,表明网络阻塞了。更新后的ssthresh值变为12,cwnd重新设置为1,并执行慢开始算法。
流量控制和拥塞控制的区别相同点
现象都是丢包实现的机制都是让发送方发慢点,发少点
不同点
丢包位置不同
流量控制丢包位置是在接收端上
拥塞控制丢包位置是在路由器上
作用对象不同
流量控制的对象是接收方,怕发送方发的太快,使得接收方来不及处理
拥塞控制的对象是网络,怕发送方发的太快,造成网络拥塞,使得网络来不及处理
HTTP(HyperText Transfer Protocol)是超文本传输协议
协议
计算机之间(两个及以上的参与者)交流通信的规范(行为的约定和规范)。
传输
HTTP协议是双向协议,专门用来在两点之间传输数据的约定和规范。
超文本
超越了普通文本的文本,文字、图片、视频等的混合体。
HTTP常见状态码
1××
提示信息,很少用到
2××
【200 OK】最常见的成功状态码,响应头有body数据【201】请求成功并且服务器创建新的资源【202】接受请求但还未处理【204 No Content】成功,但响应头无body数据【206 Partial Content】响应头返回的body数据只是部分数据
3××
【301 Moved Permanently】永久重定向。请求的资源已不存在,需改用新的URL再次访问【302 Found】临时重定向。资源还在,但暂时需要用另一个URL访问。
301和302都会在响应头里使用Location字段,指明后续要跳转的URL,浏览器会自动重定向新的URL。
【304 Not Modified】缓存重定向,用于缓存控制。不具有跳转含义,表示资源未修改,重定向已存在的缓冲文件。
4××
【400 Bad Request】报文有错误,但是个笼统的概念。【403 Forbidden】服务器禁止访问资源【404 Not Found】请求的资源在服务器不存在或未找到【408】请求超时
5××
【500】笼统的错误【501】客户端请求的功能还不支持【502】服务器作为网关或代理,从上游服务器收到无效响应【503】服务器当前很忙,暂时无法响应【505】服务器不支持请求所用的HTTP协议版本 HTTP常见字段
Host字段
用来指定服务器的域名
Content-Length字段
服务器本次回应数据的长度
Connection字段
常用于客户端要求服务器使用TCP持久连接,以便其他请求复用,直到客户端或服务器主动请求关闭连接。
Connection: keep-alive
Content-Type字段
服务器回应时,告诉客户端本次数据是什么格式
客户端请求时,可以使用Accept字段声明自己可以接受哪些数据格式
Content-Encoding字段
服务器返回的数据使用了什么压缩格式
客户端请求时,可以使用Accept-Encoding字段声明自己可以接受哪些压缩方法
GET和POST的区别作用:get用于获取资源,post用于上传数据参数:get的参数在url中,post的参数存储在实体主体安全性:get是安全的,post不安全。因为get只是获取资源,不会改变服务器状态,而post会修改服务器的资源,改变服务器的状态幂等:get是幂等的,post不是幂等的。
http和https的区别安全:请求方法不会破坏服务器上的资源
幂等:多次执行相同的 *** 作,结果都是一样的
端口号:http的端口号是80,https的端口号是443。连接建立:http在TCP三次握手后便可进行报文传输,https在TCP三次握手后还需进行SSL/TLS的握手过程才可进入加密报文传输。安全性:http上的数据是明文传输的,存在安全风险问题。https在TCP和HTTP网络层之间加入了SSL/TLS安全协议,使得报文能够加密传输。HTTPS协议需要向CA(证书权威机构)申请数字证书,来保证服务器的身份是可信的。 http的长连接和短连接
http1.0默认用短连接。客户端每次与服务端进行一次http *** 作就会建立一个连接,任务结束就断开连接。从http1.1起改用长连接。打开网页后,客户端和服务端之间用于传输http数据的tcp连接不会断开,客户端再次访问这个服务端会继续使用这个连接。http协议的长连接和短连接实质上是tcp协议的长连接和短连接。
如何理解HTTP协议是无状态的?HTTP协议是无状态的,指的是协议对于事务处理没有记忆能力,服务器不知道客户端是什么状态。也就是说,打开一个服务器上的网页和上一次打开这个服务器上的网页之间没有任何联系。
HTTP是不保存状态的协议,如何保存用户状态?通过Session机制,服务端给特定用户创建特定的Session后,就可以标识这个用户并跟踪这个用户,Session会有一个保存时间限制,过了这个时间,会销毁这个Session。
cookie和session的作用和区别cookie和Session作用一样,都是用来跟踪浏览器用户身份的会话方式,区别在于cookie一般用来保存用户信息,Session用来记录用户状态。cookie数据保存在本地,Session数据保存在服务端。
如何保证https的安全性?混合加密
对称加密
加密和解密使用同一个密钥,常用算法有DES、AES
非对称加密
密钥成对出现,公钥加密需要私钥解密,私钥加密需要公钥解密,常用算法有RSA、DSA
摘要算法(HASH算法)
摘要算法用来实现完整性,能够为数据生成独一无二的【指纹】,用来校验数据的完整性。不属于加解密算法。
数字证书
借助第三方权威机构CA(数字证书认证机构),将服务器公钥放在数字证书,只要证书可信,公钥就可信。
客户端发出请求( ClientHello)
首先,由客户端向服务器发起加密通信请求,也就是 ClientHello 请求。
发送以下信息:
(1)客户端支持的SSL/TLS协议版本,如TLS 1.2版本
(2)客户端生成的随机数(Client Random),后面用于生成【会话密钥】
(3)客户端支持的加密算法,如RSA加密算法
(4)客户端支持的压缩方法
服务器回应(SeverHello)
服务器收到客户端请求后,向客户端发出响应,也就是 SeverHello 。
(1)确认使用的SSL/TLS协议版本(如果浏览器与服务器支持的版本不一致,服务器就关闭加密通信)
(2)确认使用的加密算法
(3)服务器生成的随机数(Sever Random),后面用于生成【会话密钥】
(4)服务器的数字证书
客户端回应
客户端收到服务器的回应之后,首先通过浏览器或者 *** 作系统中的 CA 公钥,确认服务器的数字证书的真实性。如果证书没有问题,客户端会从数字证书中取出服务器的公钥,然后使用它加密报文。
(1)一个随机数(pre-master key)。该随机数使用服务器的公钥加密
(2)加密通信算法改变通知,表示以后都使用【会话密钥】加密通信
(3)客户端握手结束通知,并把之前所有内容做个摘要发给服务端校验
服务器最后回应
(1)加密通信算法改变通知
(2)服务端握手结束通知,并把之前所有内容做个摘要发给客户端校验
客户端和服务器使用三个一样的随机数根据约定好的加密算法算法各自生成本次通信的【会话密钥】
SSL和TLS同一个东西的不同阶段
2.2 HTTP/1.1、HTTP/2、HTTP/3演变 http/1.0和http/1.1区别长连接
http1.0默认是短连接,需要使用keep-alive参数来告知服务器要建立一个长连接,而http1.1默认支持长连接,改善了短连接造成的性能开销。
节约带宽
http1.1支持只发送header信息(不带任何body信息)。如果服务器认为客户端有权限请求服务器,则返回100,客户端收到100才把请求body信息发送到服务器,否则返回401,客户端就不用发送请求body,节约了带宽。http1.1支持传送内容的一部分。客户端可能只需要某个对象的一部分,这样服务器就不用将整个对象发送过来,节约了带宽。http1.1支持文件断点续传功能。传输文件时,不必从头开始下载,而是从指定的位置继续下载。
host域
Host头域指定请求资源的Intenet主机和端口号,表示请求url的原始服务器或网关的位置。
HTTP1.0中认为每台服务器都绑定一个唯一的IP地址,因此,请求消息中的URL并没有传递主机名,HTTP1.0没有host域。但是一台物理服务器上可以存在多个虚拟主机,并且共享一个IP地址。所以http1.1的请求响应消息都支持host域,且请求消息没有host域会报错(400)。
头部压缩
http2使用HPACK算法对header的数据进行压缩,提高网络传输速度。
HPACK算法:在客户端和服务端同时维护一张头信息表,所有字段都会存入这个表,生成一个索引号,以后就不用发送同样字段,只发送索引号。
二进制格式
http1.1采用纯文本形式的报文,而http2全面采用二进制格式,头信息和数据体都是二进制,统称为帧:头信息帧和数据帧。计算机无需将明文的报文转化为二进制,直接解析二进制报文,增加了数据传输的效率。
多路复用
HTTP/2 是可以在一个连接中并发多个请求或回应,而不用按照顺序⼀⼀对应。移除了 HTTP/1.1 中的串行请求,降低了延迟,大幅度提高了连接的利用率。
举例:有A和B两个请求,发现A处理很耗时,就回应A处理好的部分,接着回应B,完成后,再去回应A剩下的部分。
服务器推送
http2支持的服务器推送是一种在客户端请求之前发送数据的机制。浏览器请求数据时,服务器会顺便把一些客户端需要的资源一起推送到客户端,免得客户端再次创建连接发送请求到服务器端获取。这样客户端可以直接从本地加载这些资源,不用再通过网络,减少延时的等待。
IP 处于网络层,作用是实现主机之间通信。
MAC 的作用则是实现直连的两个设备之间通信,而 IP 负责在没有直连的两个网络之间进行通信传输。
源IP地址和目标IP地址在传输过程中是不会变化的,只有源MAC地址和目标MAC地址一直在变化。
端口的作用端口分为三类
周知端口:范围0~1023,广为人知的端口号,比如http是80,https是443注册端口:范围1024~49151,分配给用户进程或应用程序。这些主要是用户安装的一些应用程序动态端口:范围49152~65535,一般不固定分配某种服务,而是动态分配
作用:端口是tcp/ip协议中传输层的概念,用于区分同一台主机中的不同应用。
3.2 IP地址的基础知识 IP地址的分类主机号全为1指定某个网络下的所有主机,用于广播主机号全为0指定某个网络 广播地址
广播地址用于在同一个链路中相互连接的主机之间发送数据包。
本地广播
在本网络内广播的叫本地广播。
直接广播
在不同网络之间的广播叫直接广播。
多播地址多播用于将包发送给特定组内的所有主机。
无分类地址CIDR子网掩码就是将某个IP地址划分成网络地址和主机地址两部分,必须结合IP地址一起使用。
子网划分子网掩码还有⼀个作用,那就是划分子网。子网划分实际上是将主机地址分为两个部分:子网网络地址和子网主机地址。
假设对C类地址进行划分,网络地址为192.168.1.0,使用子网掩码255.255.255.192对其进行子网划分。
3.3 IP协议相关技术 3.3.1 DNS 层级关系越靠右的位置表示层级越高,类似于树状结构
根DNS服务器顶级域DNS服务器(com)权威DNS服务器(server.com) DNS解析过程
首先会在浏览器缓存中查看是否有记录域名和IP地址的映射,如果没有,就从本机hosts文件和路由缓存中找,如果也没有,那么就去本地DNS服务器寻找,如果还没有,就会向根域名服务器查询。根域名服务器会告诉本地DNS服务器下一级要去的域名服务器,然后进行迭代,直到找到对应的IP地址,回溯的时候,本地DNS服务器会记录下这个域名与IP地址的映射,同理 *** 作系统和浏览器也会记录下来,这样下次查询的时候就不需要再找一遍。
为什么DNS基于UDP?从浏览器到本地DNS服务器是递归
从本地DNS服务器到外网属于迭代
因为UDP是面向无连接,不要求准确,但速度快。DNS解析是一种查询服务,要求的是速度,所以使用UDP,如果用TCP一个查询需要等很久。
3.3.2 ARPARP协议,就是通过已知的目标IP地址,找到该IP地址所对应的物理设备的MAC地址。
ARP解析过程简单地说,ARP是借助ARP请求和ARP响应两种类型的包确定MAC地址的。
通过已知的目标IP地址,定位下一个应该接收数据分包的物理设备的MAC地址。起初通过广播发送ARP请求,使链路上所有主机和路由器接收。若目标IP和当前发送端的主机处于同一网段,这个节点就会将自己的MAC地址塞入ARP响应包返回给发送端。若不在同一网段,当前发送端会发送给与当前主机在同一网段的一个路由器的MAC地址,然后由该路由器进行转发到下一个网段。
ARP缓存*** 作系统通常会把第一次通过ARP获取的MAC地址缓存起来,以便下次直接找到,但缓存是有一定期限的,超过期限缓存内容就会被清除。
3.4 ping的工作原理 3.4.1 ICMP协议Internet Control Message Protocol,互联网控制报文协议
主要功能包括:确认IP包是否成功送达目标地址、报告发送过程中IP包被废弃的原因和改善网络设置等。
常见ICMP报文类型 ICMP报文格式 3.4.2 ping某个域名的过程ping一个域名,首先进行DNS解析,获得和域名绑定的IP地址,得到目标IP地址后,进行ARP解析,得到IP地址所对应的MAC地址,然后发送ICMP请求报文,当发送端收到接收端的ICMP响应报文后,说明网络是连通可达的。
4、网络综合 从浏览器输入URL,都发生了什么?ping过程中ICMP的头是没什么影响,源IP地址和目标IP地址都不会变,需要换的是MAC头里面的MAC地址。
这时一个超链接
进行DNS解析,将域名解析为对应的IP地址浏览器向web服务器发起http请求服务器收到请求后返回html响应浏览器解析后渲染页面 从浏览器输入URL,都用到了哪些协议?
DNS协议。将域名解析为对应的IP地址TCP协议。连接服务器IP协议。tcp连接发送的数据在网络层中使用ip协议ospf协议(open shortest path fast,开放式最短路径优先)。路由器之间选择使用ospf协议ARP协议。路由器与服务器通信,需要通过ARP协议将IP地址转换为MAC地址HTTP协议。在tcp连接后,采用http协议访问网页 计算机网络体系
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)