[网络原理] TCP 协议的相关特性

Posted 菠萝猫yena

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[网络原理] TCP 协议的相关特性相关的知识,希望对你有一定的参考价值。

TCP和UDP都是传输层的协议.

文章目录


1. TCP协议格式

TCP的特点是有连接,可靠性,面向字节流,全双工.

  1. 源端口和目的端口
    TCP的源端口与目的端口一样,表示端口号.
  2. 32位序号和32位确认序号我们放在后面的知识里学习
  3. 首部长度,代表一个TCP报头.TCP的首部长度不固定,图中的首部长度为4字节,也就是16个比特位,如果首部长度为6,那么整个TCP报头就为48个比特位.
  4. 保留位,提高TCP的可扩展性.以防TCP想引入新的功能,操作的成本很高,这时就可以使用这些保留位字段,在不影响原有结构的基础上进行升级.
  5. 校验和与UDP原理相同.
  6. 窗口大小和紧急指针我们放在后面详细解释.
  7. 选项,这个部分是对TCP报文的一些属性进行说明.

2. TCP连接及断开连接管理

正常情况下,TCP连接要进行三次握手,断开连接要进行四次挥手.
TCP连接及断开连接问题,是面试中常考的问题,我们需要画图解释.

2.1 三次握手

如下图,是客户端与服务器建立连接的流程图.

图中我们要注意两个状态
A. 服务器的第二个状态,LISTEN,代表服务器服务器已经做好连接的准备,可随时与客户端建立连接.
B. 客户端与服务器的最后一个状态都是ESTABLISHED,代表此次连接建立成功,可以正常通信.
如果面试题中,要求描述三次握手的过程,我们只需画出下图.
三次握手的本质是,各自要向对方发起一次建立连接的请求,并在接收到对方的请求时立即返回一个ACK.

  1. 首先,必须由客户端主动发起建立连接的请求,发送的syn为同步报文段
  2. 服务器在收到建立连接请求后,会立即返回一个ack.
  3. 之后,由服务器发起建立连接的请求.
  4. 最后,客户端在接收请求后立即返回一个ack.

有同学会有疑问了,为什么一共有四次交互,却是三次握手呢?
由于第2,3步之间时间间隔很短,可以合并.所以协议将这两步封装到一起.所以成了三次握手.也可以节省开销.

那两次握手可不可以呢?答案是不行.为啥呢?
其实,三次握手还有一个意义,就是验证客户端和服务器的收发功能都没问题.
如下图,当客户端发送请求时,只有服务器返回ack了,才确定客户端的发送能力没问题,服务器也保证自己的接收能力没问题.
而只有当客户端在接收请求后返回ack时,才保证了服务器的发送能力没问题,客户端的接受能力没问题.
之后才可以进行数据的发送.

2.2 四次挥手

如下图,是断开连接四次挥手的具体流程.

这里有两个重要的状态

  1. 服务器端的CLOSED_WAIT,此时正等待close方法关闭socket.
  2. TIME_WAIT,客户端进入到TIME_WAIT状态时代表四次挥手已经完事了.但是有一点要注意,在服务器端还没收到ACK之前,TCP连接还不能断.由于最后这个ACK有丢包的可能,一旦这个ACK没发过去,服务器也就无法得知自己的FIN是否成功发送,在一段时间之后,服务器会再次尝试发送一次FIN,一旦连接断开了,就发不了了.
    所以,客户端进入到TIME_WAIT状态后,会等待2MSL(MSL为两个节点之间数据传输消耗的最长时间,可人工规定),过了这个时间,确认未丢包后,则彻底释放连接.

面试中如问到这个问题,画出下图即可.

  1. 客户端的应用程序主动调用socket的close方法或者进程退出,会触发FIN.注意,断开连接可能由客户端发起,也可能由服务器发起.
  2. 客户端接收到断开请求,自动返回一个ACK.
  3. 服务器的应用程序执行到对应的close方法,会触发FIN.
  4. 客户端接收断开请求,自动返回ACK

那么这里第2,3步为什么不能合并呢?由于服务器端在接收到断开请求后,还能做一些事情(根据代码而定),所以第2,3步之间有一定的时间差,不能进行封装.

3. TCP可靠性机制

3.1 确认应答

确认应答是实现TCP可靠性的最核心机制.

  1. 应答报文,确认应答机制由应答报文(ACK)实现.A给B发个消息,当B收到消息后,会立即给A返回一个ACK,那么A收到ACK后就知道自己的消息发送成功了,来保证可靠性.
  2. 确认序号,另外,要保证消息的顺序不能乱.所以,我们需要给消息进行编号,为确认序号.序号按字节排序,第一个字节为序号1.
    如下图所示,第一组数据报为1-1000字节,确认序号为1,第二组数据报为1001-2000字节,确认序号为1001,当确认序号为1001时,就确认了1-1000组的数据报已经成功发送.当确认序号为2001时,就代表2000之内的数据已正确发送.

3.2 超时重传

如果发送端迟迟没有收到接收端返回的ACK,就无法确认数据是否被正确传输.
TCP引入了重传机制,程序员可以根据具体情况,设置一个时间域值,在发送端发送数据之后,开始计时,一旦超过这个时间阈值,无论数据是否丢失,都视为数据丢失,发送端重新传送数据.
但这里会出现一个问题,一个消息传的很慢,超过时间阈值之后仍未传达.此时,发送端重新发送数据,那么这同一个消息可能会发送了两次.
如何解决这个问题呢?TCP的接收端有接收缓冲区,会以优先级队列的方式,将消息进行排序,将相同的消息进行去重.

4. 滑动窗口

由于每发送一条消息,就要返回一个ACK,之后才可以发送下一条消息,很消耗时间.因而,TCP设置了滑动窗口机制.
如下图,一次发送多条消息,之后,等待这一组数据的ACK.节省了很多时间

把不需要等待就能直接发送的数据的最大的量称为窗口大小.
需要注意的点是,在客户端等待一组数据的ACK时,并不需要等待所有ACK都到,再集中发下一组数据,而是到一部分就可以发下一部分.例如客户端收到1001的ACK,就代表1-1000之间的ACK已经全部被确认,就可以发送下一个1000数据报即(3001-4000)了.
若有1-1000出现丢包情况,则只需重传1-1000的数据报即可,之后在接收缓冲区进行重新排队.

5. 流量控制

滑动窗口有几个问题.

  1. 若一次性发太多消息,但接收端处理不过来,就白发了.发送端的发送速度不能超过接收方的处理能力.
  2. 窗口太大,也会消耗过多系统资源.
    所以,要根据接收缓冲区的大小确定下一次发送的窗口大小.
    每发送一组信息,就返回一次接收缓冲区大小,从而调整发送方的窗口大小.当窗口为0时,暂停发送.
    之后,发送方定期发送窗口探测报文,触发ACK查看窗口大小的机制.

6. 拥塞控制

流量控制和拥塞控制共同决定发送方窗口大小.
滑动窗口有个问题,就是一开始的时候,并不知道窗口大小,若此时贸然发送大量数据,可能加重网络拥塞.
因而TCP引入拥塞控制,引用慢启动机制,先发送少量数据,确认一下当前网络的拥堵状态,在确定之后的窗口大小.

如下图,为拥塞窗口变化图.

  1. 刚开始,窗口大小为1,试探网络拥塞程度
  2. 发现未丢包,以指数形式扩大窗口
  3. 引入慢启动阈值,达到阈值,这里阈值为16,则停止指数增长,开始进行线性增长.
  4. 网络拥塞达到极限,窗口重新回到慢开始阶段.
  5. 进行新一轮的重复.

7. 延迟应答

延时应答也是提升效率的机制.是在收到数据后,不要立即返回ACK,而是延时以下,处理一下接受缓冲区里的数据,以便下一次的发送窗口能更大一些.

8. 捎带应答

由于上面的延时应答机制,客户端发送数据,服务器并不会立即返回ACK,而是会延迟一下.而此时,若到了服务器发送下一条消息的时机,服务器可把上次的ACK捎带上,一同发送给发送方.

9. 面向字节流

TCP面向字节流,接收缓冲区会把收到的数据放在一起,从而难以区分读到那算是完整的一条数据.这种情况称为粘包问题.
解决办法

  1. 约定好分隔符
  2. 约定好每个包的长度

10. 异常情况

  1. 进程终止,释放文件描述符表,正常断开连接.
  2. 主机关机,先关进程,再关机,与上一种情况相同
  3. 主机断电/网线断开,若是接收方断电了,发送方一直等不来ACK,超时重传几次依旧等不到,就放弃连接了.若是发送方断电,接收方发现没数据了,会周期性向发送方发送一个消息(心跳包),确认对方是否工作正常.

网络原理

欢迎指正

网络模型与相关协议

OSI七层模型:

物理层
数据链路层
网络层:IP
运输层: TCP、UDP
会话层
表示层
应用层:DNS、HTTP、SMTP等

TCP/IP四层协议

网络接口层
网际层:IP
运输层:TCP、UDP
应用层:HTTP、SMTP、FTP等

五层协议

物理层:实现相邻计算机之间比特流的透明传递
数据链路层:将IP数据报组装成帧,控制信息在相邻两节点的链路上进行传输
网络层:IP,为不同主机分组交换信息服务
运输层:TCP、UDP,为两台主机之间的通信提供通用的数据传输服务
应用层:HTTP、SMTP、FTP等

数据链路层

交换机与路由器的区别

1、工作层次不同,交换机工作在数据链路层,路由器工作在网络层
2、寻址依据不同,交换机的数据转发依据是利用物理地址或者说MAC地址来确定转发数据的目的地址,而路由器是依据ip地址进行工作的
3、交换机分割冲突域,不划分广播域,即隶属一个交换机的主机属于一个局域网。通过路由器连接的主机可能数据不同的广播域,所以路由器可以划分广播域
4、转发的数据对象不同 ,交换机转发的是数据帧、路由器转发的是分组报文

网络层

IP协议

IP协议是TCP/IP协议的核心,所有的TCP,UDP,IMCP,IGMP的数据都以IP数据格式传输。要注意的是,IP不是可靠的协议,这是说,IP协议没有提供一种数据未传达以后的处理机制,这被认为是上层协议:TCP或UDP要做的事情。

IP地址

在数据链路层中我们一般通过MAC地址来识别不同的节点,而在IP层我们也要有一个类似的地址标识,这就是IP地址。

32位IP地址分为网络位和地址位,这样做可以减少路由器中路由表记录的数目,有了网络地址,就可以限定拥有相同网络地址的终端都在同一个范围内,那么路由表只需要维护一条这个网络地址的方向,就可以找到相应的这些终端了。

  • A类IP地址: 0.0.0.0~127.255.255.255
  • B类IP地址:128.0.0.0~191.255.255.255
  • C类IP地址:192.0.0.0~239.255.255.255

IP协议头

八位的TTL字段:规定该数据包在穿过多少个路由之后才会被抛弃。某个IP数据包每穿过一个路由器,该数据包的TTL数值就会减少1,当该数据包的TTL成为零,它就会被自动抛弃。
这个字段的最大值也就是255,也就是说一个协议包也就在路由器里面穿行255次就会被抛弃了,根据系统的不同,这个数字也不一样,一般是32或者是64。

ARP协议

在OSI模型中ARP协议属于链路层;而在TCP/IP模型中,ARP协议属于网络层。
ARP是IP地址解析为MAC地址 RARP 将MAC地址解析为IP地址

ARP攻击

①ARP缓存表基于"后到优先"原则,IP与MAC的映射信息能被覆盖;
②ARP攻击基于伪造的ARP回应包,黑客通过构造"错位"的IP和MAC映射,覆盖主机的ARP表(也被称为"ARP毒化"),最终截取用户的数据流;
③一旦遭受ARP攻击,账号密码都可能被窃取(如果通信协议不是加密的);
④通过Wireshark数据包分析,我们掌握了真实网络中ARP底层攻击原理及数据包组成。

ICMP协议

它是TCP/IP协议族的一个子协议,用于在IP主机、路由器之间传递控制消息。控制消息是指网络通不通、主机是否可达、路由是否可用等网络本身的消息。这些控制消息虽然并不传输用户数据,但是对于用户数据的传递起着重要的作用。

运输层

TCP协议、UDP协议的区别

? TCP提供可靠的、面向连接的运输服务。在传输数据之前必须三次握手建立连接,数据传输结束之后,4次挥手释放连接,而且在数据传递时,又有确认应答、超时重传、滑动窗口、拥塞控制等机制保证传送数据的可靠性。TCP经常用于对网络通信质量有很高要求的地方,如文件传输,邮件发送,远程登录等场景。SMTP、TELNET、HTTP、FTP

? UDP在传送数据之前不需要建立连接,目的主机收到UDP报文后,不需要给出确认。UDP不提供可靠交付,一般用于即时通信,如语音、视频、直播等。RIP(路由选择协议),DNS

技术图片

TCP三次握手

技术图片

1)主机A向主机B发送TCP连接请求数据包,其中包含主机A的初始序列号seq(A)=x。(其中报文中同步标志位SYN=1,ACK=0,表示这是一个TCP连接请求数据报文;序号seq=x,表明传输数据时的第一个数据字节的序号是x);

2)主机B收到请求后,发回连接确认数据包。(其中确认报文段中,标识位SYN=1,ACK=1,表示这是TCP连接响应数据报文,并含主机B的初始序列号seq(B)=y,以及主机B对主机A初始序列号的确认ack(B)=seq(A)+1=x+1)

3)第三次,主机A收到主机B的确认报文后,还需作出确认,即发送一个序列号seq(A)=x+1;确认号为ack(A)=y+1的报文;

为什么要三次握手?
为了防止已失效的连接请求报文段突然又传送到了服务端,因而产生错误。

TCP四次挥手

技术图片

1、客户端发送请求释放连接报文,FIN=1,seq=u;客户端进入FIN-WAIT-1状态;

2、服务器收到请求,发送确认报文。ACK=1,seq=v,ack=u+1;服务器进入CLOSE-WAIT状态。客户端收到后进入终止等待2FIN-WAIT-2;

3、服务器发送完数据之后,向客户端发送请求释放连接报文,FIN=1,ACK=1,seq=w,ack=u+1;进入LAST-ACK状态

4、客户端收到请求后,发送确认报文,ACK=1,seq=u+1,ack=w+1。客户端进入TIME-WAIT状态,等待2MSL后进如CLOSED状态,服务器收到确认后进如CLOSED状态。

为什么要四次分手?
TCP协议是一种面向连接的、可靠的、基于字节流的运输层通信协议。TCP是全双工模式,这就意味着,当主机1发出FIN报文段时,只是表示主机1已经没有数据要发送了,主机1告诉主机2,它的数据已经全部发送完毕了;但是,这个时候主机1还是可以接受来自主机2的数据;当主机2返回ACK报文段时,表示它已经知道主机1没有数据发送了,但是主机2还是可以发送数据到主机1的;当主机2也发送了FIN报文段时,这个时候就表示主机2也没有数据要发送了,就会告诉主机1,我也没有数据要发送了,之后彼此就会愉快的中断这次TCP连接。

TIME_WAIT状态为什么要等待2MSL?

因为第四次的确认报文可能丢失,这个状态是用来重发可能丢失的ACK报文。

为什么会有CLOSE_WAIT?

因为服务器可能有数据未发送完毕,这段时间是继续发送数据的。

如果建立连接之后出现故障?

TCP有个保活计时器,通常设置为2小时,两小时内没有收到客户端发送的数据,服务器发送探测报文,每75s发送一次,10次之后探测报文没有反应,认为出现故障,关闭连接。

TIME_WAIT存在的两个理由

1、可靠的实现TCP全双工连接的终止
2、允许老的重复的分节在网络上的消逝(TCP不允许处于TIME_WAIT状态的连接启动一个新的化身,因为TIME_WAIT状态持续2MSL,就可以保证当成功建立一个TC连接的时候,来自连接先前化身的重复分组已经在网络中消逝。)

滑动窗口

TCP通过滑动窗口的概念来进行流量控制,抑制发送端发送数据的速率,以便接收端来得及接收。
窗口:对应一段发送者可以发送的字节序列。这个序列是可以改变的。接收端发给发送端自己的接受能力。然后发送端根据已确认接受的序列号和接受能力滑动窗口,一下子全部发送,等待接收端确认。

拥塞控制和流量控制的区别

拥塞控制是防止过多的数据注入到网络中,可以使网络中的路由器或链路不致过载,是一个全局性的过程。

流量控制是点对点通信量的控制,主要就是抑制发送端发送数据的速率,以便接收端来得及接收。
(设置拥塞控制窗口cwnd, 在发送数据时,将拥塞窗口的大小与接收端ack的窗口大小做比较,取较小者作为发送数据量的上限。)

慢开始: 设置拥塞控制窗口cwnd = 1MSS(最大报文段),每收到一个ACK,cwnd++;每过1RTT,cwnd = cwnd * 2;呈指数增长。

拥塞避免:当拥塞窗口 cwnd 达到一个阈值时(cwnd >= ssthresh),窗口大小不再呈指数上升,而是以线性上升,避免增长过快导致网络拥塞。每当过了一个RTT,cwnd = cwnd + 1;

无论是在慢开始阶段还是在拥塞避免阶段,只要发送方判断网络出现拥塞(没有收到确认ACK);拥塞窗口设置为1,阈值为拥塞时发送窗口的一半,执行慢开始算法。

快重传:当发送方连续收到三个重复确认时,就立即重传对方尚未收到的报文段。并执行快恢复算法

快恢复:将cwnd设置为ssthresh的大小,然后执行拥塞避免算法。

技术图片

ping

ping可以说是ICMP的最著名的应用,是TCP/IP协议的一部分。利用“ping”命令可以检查网络是否连通,可以很好地帮助我们分析和判定网络故障。
它利用ICMP协议包来侦测另一个主机是否可达。原理是用类型码为0的ICMP发请求,受到请求的主机则用类型码为8的ICMP回应。
ping程序来计算间隔时间,并计算有多少个包被送达。用户就可以判断网络大致的情况。 ping给出来了传送的时间和TTL的数据。

Traceroute

Traceroute是用来侦测主机到目的主机之间所经路由情况的重要工具,也是最便利的工具。
原理:它收到目的主机的IP后,首先给目的主机发送一个TTL=1的UDP数据包,而经过的第一个路由器收到这个数据包以后,就自动把TTL减1,而TTL变为0以后,路由器就把这个包给抛弃了,并同时产生一个主机不可达的ICMP数据报给主机。主机收到这个数据报以后再发一个TTL=2的UDP数据报给目的主机,然后刺激第二个路由器给主机发ICMP数据报。如此往复直到到达目的主机。这样,traceroute就拿到了所有的路由器IP。

应用层

浏览器输入url并回车的过程以及相关协议

1、根据域名,进行DNS域名解析。
2、拿到解析的IP地址,建立TCP连接
3、发送HTTP请求
4、服务器处理请求
5、返回HTTP报文
6、关闭TCP链接
7、浏览器解析HTML
8、浏览器渲染页面

使用的协议:DNS(获取域名的IP的地址);TCP(与服务器建立TCP连接);IP(建立TCP协议时,需发送数据,在网络层用到IP协议);OPSF(IP数据包在路由之间传送,路由选择使用OPSF协议);ARP(路由器与服务器通信时,将IP地址转化为MAC地址,使用ARP协议);HTTP(TCP建立之后,使用HTTP协议访问网页);

DNS寻址

先查找浏览器缓存,如果没命中,查询系统缓存,即hosts文件。
如果没命中,查询路由器缓存。
如果没命中,请求本地域名服务器解析域名,没有命中就进入根服务器进行查询。
没有命中就返回顶级域名服务器IP给本地DNS服务器。
本地DNS服务器请求顶级域名服务器解析,没有命中就返回主域名服务器给本地DNS服务器。
本地DNS服务器请求主域名服务器解析域名,将结果返回给本地域名服务器。
本地域名服务器缓存结果并反馈给客户端。

DNS协议运行在UDP协议之上,使用端口号53。

HTTP1.1与1.0之间的区别:

1、HTTP1.1默认开启长连接,在一个TCP连接上可以传送多个HTTP请求和响应。而1.0不支持长连接。客户端和服务器每进行一次HTTP操作,就建立一次连接。
2、缓存处理:在HTTP1.0中主要使用header里的If-Modified-Since,Expires来做为缓存判断的标准,HTTP1.1则引入了更多的缓存控制策略例如Entity tag,If-Unmodified-Since, If-Match, If-None-Match等更多可供选择的缓存头来控制缓存策略。
3、Host头处理:1.0请求的url并没有传递主机名(服务器与IP地址绑定),1.1请求和响应都支持Host头域(虚拟主机共享IP地址)

4、1.1新增24个错误状态响应码。409:请求的资源和资源的当前状态冲突,410:服务器资源永久性删除。
5、带宽优化以及网络连接的使用:1.1允许只请求资源的某个部分.

HTTP2.0和HTTP1.X相比的新特性

1、新的二进制格式:1.x的解析是基于文本的,而2.0的协议解析是采用二进制格式。
2、多路复用,即连接共享,即每一个request都是是用作连接共享机制的。一个request对应一个id,这样一个连接上可以有多个request。
3、header压缩。
4、服务端推送。

HTTP与HTTPS

1、HTTPS协议需要到CA申请证书,一般免费证书很少,需要交费。
2、HTTP协议运行在TCP之上,传输的内容都是明文。HTTPS运行在SSL/TLS(运行在TCP之上)之上,内容加密。3、连接端口不一样,http是80,https是443.
4、http连接简单,没有状态,https是ssl加密的传输,身份认证的网络协议,更安全。

HTTPS在传统的HTTP和TCP之间加了一层用于加密解密的SSL/TLS采用对称加密和非对称加密结合的方式来保护浏览器和服务端之间的通信安全。对称加密:加密和解密都是同一个密钥。非对称加密:密钥成对出现,分为公钥和私钥,公钥和私钥之间不能互相推导,公钥加密需要私钥解密,私钥加密需要公钥解密。

SSL四次握手

1、 客户端发出请求
首先,客户端(通常是浏览器)先向服务器发出加密通信的请求,这被叫做ClientHello请求。

2、服务器回应
服务器收到客户端请求后,向客户端发出回应,这叫做SeverHello。

3、客户端回应
客户端收到服务器回应以后,首先验证服务器证书。如果证书不是可信机构颁布、或者证书中的域名与实际域名不一致、或者证书已经过期,就会向访问者显示一个警告,由其选择是否还要继续通信。

4、服务器的最后回应
服务器收到客户端的第三个随机数pre-master key之后,计算生成本次会话所用的"会话密钥"。然后,向客户端最后发送下面信息。
(1)编码改变通知,表示随后的信息都将用双方商定的加密方法和密钥发送。
(2)服务器握手结束通知,表示服务器的握手阶段已经结束。这一项同时也是前面发送的所有内容的hash值,用来供客户端校验。

至此,整个握手阶段全部结束。接下来,客户端与服务器进入加密通信,就完全是使用普通的HTTP协议,只不过用"会话密钥"加密内容。

HTTP请求有哪些

get:请求特定资源
post:向指定资源提交数据进行处理请求
Put:向指定资源上传最新内容
Delete:请求删除资源。

get和post区别

Get是从指定资源请求数据,而Post是向指定资源提交要被处理的数据。
Get请求刷新无害,而post刷新,数据会被重复提交。
Get请求的数据会附加到URL中,多个参数用&连接,URL编码采用ASCII编码。而POST请求会把请求的数据放到body中。因此get请求的数据会暴露在地址栏中,而post不会。又浏览器和服务器对url的长度有限制,所以get传输数据的大小受到url的限制。
Get请求的资源会被浏览器缓存。
post比get慢,因为post在发送数据之前会先将请求头发送给服务器进行确认,然后才真正发送数据。而get请求直接发送请求头和数据。

状态码

? 304:客户端请求一个有缓存的资源,服务器返回304告诉客户端,自上次请求后,资源并没有更新,原本的缓存可以继续使用。

1xx:指示信息--表示请求已接收,继续处理

100 --客户端必须继续发出请求 101-客户端要求服务器转换HTTP协议版本。

2xx:成功--表示请求已被成功接收、理解、接受

? 200—OK 204--请求收到,但返回信息为空 206--服务器已经完成了部分用户的GET请求

3xx:重定向--信息不完整需要进一步补充

? 300 --- 请求资源在多处可得到。301—永久重定向,隐式重定向。302 临时重定向,显示重定向。

? 304—请求的资源没有改变,可以使用缓存。

4xx:客户端错误--请求有语法错误或请求无法实现

? 401---未授权 403—禁止访问。 404 –找不到。409:对当前资源状态,请求不能完成

5xx:服务器端错误--服务器未能实现合法的请求

? 500内部服务器错误,501未实现, 502网关错误,503服务不可用,504 网关超时。

转发和重定向的区别

转发(forward)是服务器行为,重定向是客户端行为。
转发是服务器直接向目标地址访问URL,将相应内容读取之后发给浏览器,地址栏URL不变,转发页面和转发到的页面可以共享request里面的数据。效率高,可用于用户登录之后将角色转发到相应的模块。
重定向是利用服务器返回的状态码来实现的,如果服务器返回301或者302,浏览器到新的网址重新请求资源。地址栏url会发生改变,而且不能共享数据。效率低,可用于用户注销之后,跳转到其他网站。

Session和Cookie的区别:

? Cookie技术是客户端的解决方案,Cookie就是由服务器发给客户端的特殊信息,而这些信息以文本文件的方式存放在客户端, 然后客户端每次向服务器发送请求的时候都会带上这些特殊的信息。

? 客户端发送一个http请求到服务器端
? 服务器端发送一个http响应到客户端,其中包含Set-Cookie头部
? 客户端发送一个http请求到服务器端,其中包含Cookie头部
服务器端发送一个http响应到客户端

Cookie的不可跨域名性

? Session保存在服务器上。 客户端浏览器访问服务器的时候,服务器把客户端信息以某种形式记录在服务器上。这就是Session。 客户端浏览器再次访问时只需要从该Session中查找该客户的状态就可以了。服务器一般把Session放在内存中。 每个用户都会有一个独立的Session。Session在用户第一次访问服务器的时候自动创建, 创建Session的同时,服务器会为该Session生成唯一的session id,session id会以cookie的方式发送个客户端。客户端下次访问时,带上这个session id,就可以跟踪会话了。如果浏览器不支持cookie,可以用url重写的方式,将sessionId写入url传给服务器。

内容来源:
https://www.nowcoder.com/discuss/344311?type=2&order=0&pos=9&page=4
https://mp.weixin.qq.com/s/qn5fw8yHvjBou6Ps2Xo9Lw
https://www.nowcoder.com/tutorial/94/f44157f2ea724754a82dd352f8b82498








































































以上是关于[网络原理] TCP 协议的相关特性的主要内容,如果未能解决你的问题,请参考以下文章

谈计算机网络TCP协议的仿真与实现

TCP三次握手原理

网络原理

网络编程TCP/UDP协议(传输层特性)

网络编程TCP/UDP协议(传输层特性)

TCP/IP简记