TCP整理

TCP模型参考

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fGdF3UEv-1587368605900)(.\计网.assets\计网1.png)]

TCP通过检验和、序列号、确认应答、重发控制、连接管理以及窗口控制等机制实现可靠性传输。

确认应答

  • TCP中,当发送端的数据到达接收主机时,接收端主机会返回一 个已收到消息的通知。这个消息叫做确认应答(ACK(Positive Acknowled-gement)意指已经接收。)
    TCP通过肯定的ACK实现可靠的数据传输。当发送端将数据发出之后会等待对端的确认应答。如果有确认应答,说明数据已经成功到达对端。反之,则数据丢失的可能性很大。在一定时间内没有等到确认应答,发送端就可以认为数据已经丢失,并进行重发。
  • 注意:未收到确认应答并不意味着数据一定丢失。也有可能是数据对方已经收到,只是返回的确认应答在途中丢失。这种情况也会导致发送端因没有收到确认应答,而认为数据没有到达目的地,从而进行重新发送。但是对于目标主机来说,这简直是一种“灾难”。它会反复收到相同的数据。而为了对上层应用提供可靠的传输,必须得放弃重复的数据包。为此,就必须引入一种机制,它能够识别是否已经接收数据,又能够判断是否需要接收。

序列号

上述这些确认应答处理、重发控制以及重复控制等功能都可以通过序列号实现。序列号是按顺序给发送数据的每一个字节(8位字节)都标上号码的编号(序列号的初始值并非为0。而是在建立连接以后由随 机数生成。而后面的计算则是对每一字节加一) 。接收端查询接收数据TCP首部中的序列号数据的长度,将自己下一步应该接收的序号作为确认应答返送回去。就这样,通过序列号和确认应答号TCP可以实现可靠传输。

TCP的数据长度并未写入TCP首部。实际通信中求得TCP包的长度的计算公式是:IP数据包长度(IP首部里)-IP首部长度(IP首部里)-TCP首部长度。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4esmhFap-1587368605903)(计网.assets/1797490-c16f882b22a5a9ed.webp)]

重发超时

重发数据之前,从发出数据到收到确认应答中间的时间,超过这个时间,则需要重发。为了保证在不同网络环境下确保间隔时间的适宜,每次在发包时都会计算往返时间(Round Trip Time也叫RTT,指报文段的往返时间。)以及偏差(RTT值,方差波动),将这个时间和偏差相加,确定适合的间隔时间。

数据也不会被无限、反复地重发。达到一定重发次数之后,如果仍没有任何确认应答返回,就会判断为网络或对端主机发生了异常,强制关闭连接。并且通知应用通信异常强行终止。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9eJcZanZ-1587368605905)(计网.assets/1797490-25cd0f2914e515ce.webp)]

连接管理

TCP提供面向有连接的通信传输。面向有连接是指在数据通信开始之前先做好通信两端之间的准备工作。它会在数据通信之前,通过TCP首部发送一个SYN包作为建立连接的请求等待确认应答(TCP中发送第一个SYN包的一方叫做客户端,接收这个的一方叫做服务端。) 如果对端发来确认应答,则认为可以进行数据通信。如果对端的确认应答未能到达,就不会进行数据通信。此外,在通信结束时会进行断开连接的处理(通过发送FIN包)。

可以使用TCP首部用于控制的字段来管理TCP连接(也叫控制域) 。一个连接的建立与断开,正常过程至少需要来回发送7个包才能完成(“三次握手”、“四次挥手”) 。

MSS

在建立tcp连接的同时确定发包长度的单位,叫做最大消息长度(Maximum Segment Size),两端主机在建立连接时,会在tcp首部写上MSS选项,以告诉对方自己能适应的MSS大小

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cFVdsyT4-1587368605906)(计网.assets/1797490-5f1a4162d36742bb.webp)]

窗口控制

每发一个包进行一次应答在往返时间较长的情况下性能就很低。为了解决这个问题,tcp引入窗口的概念,确认应答不再以单个包进行,而是以更大的窗口为单位。

窗口大小即为无需等待确认应答可发送包的最大值。

tcp首部中有一个字段用来存储窗口大小,接收端把所能接受的窗口大小填入这个字段,通知发送端,发送端每次发包就不会超过这个限度,这个即流控制。窗口越大网络吞吐量越高。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EL6TZk6S-1587368605907)(计网.assets/1797490-bd967f977e83d59e.webp)]

收到确认应答的情况下,窗口移动到确认应答序列号的位置。这样也叫滑动窗口机制。

窗口控制下的重发控制

需要重发的情况:1数据送达,应答没收到;2数据未送达

在这里插入图片描述

应答未收到的情况:不需要重发,若没有窗口控制就需要重发

数据未送达:接收端会一直发送缺失的序列号作应答,发送端收到三次同一个确认应答时,重发对应的数据。这种机制比超时重传更高效,因此也叫高速重发控制。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XZiQJU0z-1587368605908)(计网.assets/1797490-b85db2363d7b7e2f.webp)]

拥塞控制

概念:某段时间内,某资源的请求大于其提供的可用部分,网络性能发生变化,这种情况叫阻塞

拥塞控制:防止过多的数据进入网络,使网络中的链路不至过载。拥塞控制是一个全局的过程涉及到所有主机路由器及降低网络传输的所有因素,与流量控制的端到端不同。

方法:慢开始,拥塞避免,快重传,快恢复

  • 发送方维护一个拥塞窗口(cwnd)的状态变量,其值取决于网络的拥塞程度,且动态变化
    cwnd维护原则:网络拥塞程度大,cwnd变大一些,反之亦然。
    判断拥塞程度依据:是否重传
  • 发送方将初始cwnd大小作为发送窗口(swnd)大小
  • 维护一个慢开始门限变量(ssthresh)
    cwnd<ssthresh,使用慢开始方法
    cwnd>ssthresh,停止慢开始,使用拥塞控制
    cwnd=ssthresh,两种方法均可

慢开始

假设当前发送端cwnd为1,因此当前只能发送一个报文段(发送窗口等于拥塞窗口),接收端收到并回复后,拥塞窗口变为2,继续发送报文段,当拥塞窗口值到门限值时(每次2的指数增长),改用拥塞避免方法。

拥塞避免

每个传输轮次(发送端发送并收到应答)cwnd加一,若发送端丢失了几个报文段,一段时间后,丢失的重传计时器超时,发送端判断可能会出现拥塞,,更改cwnd和ssthresh,并重新开始慢开始方法

快速重传

接收端收到一个失序的报文,立刻报告发送端,当发送端收到三次同一个应答时,重传。

即发送端尽快重传,而不是等计时器超时再重传。

要求:接受端收到报文立即发送确认,而不是发送数据时才确认;收到失序报文也需要立即发送重复确认;发送端收到三次重复立即重传;

快速恢复

发送端需要重传时,执行快速恢复算法。

发送端将ssthresh和cwnd调整为当前窗口的一半,开始执行拥塞避免算法。

TCP首部格式

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Ir8P8mW8-1587368605909)(计网.assets/1797490-442b3c96204460ae.webp)]

**源端口号:**表示发送端端口号,字段长16位。

**目标端口号:**表示接收端端口号,字段长度16位。

序列号:字段长32位。序列号是指发送数据的位置。每发送一次数据,就累加一次该数据字节数的大小(用来标记数据段的顺序)。序列号不会从0或1开始,而是在建立连接时由计算机生成的随机数作为其初始值,通过SYN包传给接收端主机。然后再将每转发过去的字节数累加到初始值上表示数据的位置。此外,在建立连接和断开连接时发送的SYN包和FIN包虽然并不携带数据,但是也会作为一个字节增加对应的序列号。

确认应答号:字段长度32位。是指下一次应该收到的数据的序列号。 实际上,它是指已收到确认应答号减一为止的数据。发送端收到这个确认应答以后可以认为在这个序号以前的数据都已经被正常接收。因此当前报文段最后一个字节的编号+1即为确认应答号

数据偏移:该字段表示TCP所传输的数据部分应该从TCP包的哪个位开始计算,当然也可以把它看作TCP首部的长度。该字段长4位,单位为4字节。(比如该值为4就表示TCP所传输的数据从16个字节的地方开始);如果不包括选项字段的话,此数据偏移字段可以设置为5。反之,如果该字段的值为5,那说明从TCP包的最一开始到20字节为止都是TCP首部,余下的部分为TCP数据。

**保留:**该字段主要是为了以后扩展时使用,其长度为4位,一般设置为0。

**窗口大小:**该字段长为16位。用于通知从相同TCP首部的确认应答号所指位置开始能够接收的数据大小TCP不允许发送超过此处所示大小的数据。不过,如果窗口为0,则表示可以发送窗口探测,以了解最新的窗口大小。

紧急指针: 该字段长为16位。只有在URG控制位为1时有效。该字段的数值表示本报文段中紧急数据的指针。

选项:用于提高TCP的传输性能。

控制位

字段长为8位,每一位从左至右分别为CWR、ECE、URG、ACK、 PSH、RST、SYN、FIN。这些控制标志也叫做控制位。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-03OvqHhF-1587368605910)(计网.assets/1797490-4f93e2400fa120c0.webp)]

CWR(Congestion Window Reduced:拥塞窗口减少): CWR标志与后面的ECE标志都用于IP首部ECN字段。ECE标志为1时,则通知对方已将拥塞窗口缩小。

ECE ECNEcho。置为1会通知通信对方,从对方到这边的网络有拥塞。在收到数据包的IP首部ECN为1时将TCP首部中的ECE设置为1。

URG 紧急指针是否有效。为1,表示某一位需要被优先处理

ACK 确认应答号是否有效,1为有效。TCP规定除了最初建立连接时的SYN包之外该位必须设置为1

PSH 为1时,表示需要将收到的数据立刻传给上层应用协议;为0时,则不需要立即传而是先进行缓存。

RST 为1时表示TCP连接中出现异常必须强制断开连接。

SYN 用于建立连接。SYN为1表示希望建立连接,并在其序列号的字段进行序列号初始值的设定。

FIN 为1时,表示今后不会再有数据发送,希望断开连接。

校验和

TCP和UDP一样在计算校验和的时候使用TCP伪首部。为了让其全长为16位的整数倍,需要在数据部分的最后填充0。首先将TCP校验和字段设置为0。然后以16位为单位进行1的补码和计算,再将它们总和的1的补码和放入校验和字段。 接收端在收到TCP数据段以后,从IP首部获取IP地址信息构造TCP 伪首部,再进行校验和计算。由于校验和字段里保存着除本字段以外其 他部分的和的补码值,因此如果计算校验和字段在内的所有数据的16位和以后,得出的结果是“16位全部为1(1的补码中该值为0(负数0)、 二进制中为1111111111111111,十六进制中为FFFF,十进制中则为正整 数65535。) ”说明所收到的数据是正确的。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CXNl06E1-1587368605910)(计网.assets/1797490-d0f6dd9c4c096412.webp)]

TCP三次握手

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FfSCwLHa-1587368605911)(.\计网.assets\计网2.png)]

第一次握手:

客户端向服务端发送连接请求报文段。该报文段的头部中SYN=1,ACK=0,同时选择一个初始序号seq=x。请求发送后,客户端便进入SYN-SENT状态。

第二次握手:

服务端收到连接请求报文段后,如果同意连接,会发送一个应答:SYN=1,ACK=1,seq=y,ack=x+1。发送完应答后服务端进入SYN-RCVD状态。

第三次握手:

客户端收到服务端连接同意的应答后,还会向服务端发送一个确认报文段,表示:服务端发来的连接同意应答已经成功收到。该报文段的头部为:ACK=1,seq=x+1,ack=y+1。该报文发送完毕后,客户端和服务器端都进入ESTABLISHED状态,完成TCP三次握手。

  • 为什么是三次握手,而不是两次或四次?

为什么不是两次握手:是为了防止已失效的连接请求报文段突然又传送到了服务端,造成服务端资源的浪费。

在一次TCP连接中,客户端A向服务端B发送连接请求SYN报文段,假如这个报文段没有及时被服务端B接收,而是滞留在网络的某处,于是客户端A超时重传,再次发送请求连接并且顺利与服务端B建立了连接,交换数据后断开连接。滞留在网络中的某处的陈旧报文就变成了失效的连接请求报文。

但如果这个失效的请求SYN报文段,现在又突然传送到了服务端B处,设想这时是使用两次握手而不是三次握手,服务端B就以为客户端A现在建立请求连接,于是服务端B发出确认,新的连接就建立了,服务端B分配资源,等待客户端A传送数据,但客户端A并没有想要建立TCP连接,不会理会服务端B发送的应答,也不会向服务端B传送数据,于是服务端B就白白等待,空耗资源。

使用三次握手可以避免这个情况。服务端B收到客户端A的失效的陈旧SYN报文段,向客户端A发送SYN报文段,选择自己的序号seq=y,确认收到客户端A的SYN报文段,确认号ack=x+1。第三次握手客户端A收到B的SYN报文段后,从确认号就可得知不应理睬这个SYN报文段(因为A现在并没有发送seq=x的报文段)。这时,客户端A会发送复位报文段,这个复位报文段中,RST=1,ACK=1,确认号ack=y+1。服务端B收到A的复位报文,就知道不建立TCP连接,不会分配资源等待A发送数据。

  • 为什么不是四次握手?

因为三次握手已经能说明握手时的通信是正常的,四次握手、五次握手就显得浪费了。

TCP四次挥手

TCP连接是双向的,在四次挥手中,前两次挥手用于断开一个方向的连接,后两次挥手用于断开另一方向的连接。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QQTU3e8s-1587368605911)(.\计网.assets\计网3.png)]
第一次挥手

客户端数据发送完成,则它向服务端发送连接释放请求。该请求只有报文头,头中携带的主要参数为:FIN=1,seq=u。此时,客户端将进入FIN-WAIT-1状态。TCP规定,FIN报文段即使不携带数据,也要消耗一个序号。

第二次挥手

服务器收到客户端连接释放报文,通知相应的高层应用进程,告诉它客户端向服务器这个方向的连接已经释放了。此时服务端进入了CLOSE-WAIT(关闭等待)状态,并向客户端发出连接释放的应答,其报文头包含:ACK=1,ack=u+1,seq=v。

客户端收到该应答后,进入FIN-WAIT-2状态,等待服务器发送连接释放报文(在这之前还需要接受服务器发送的最后的数据)。

第二次挥手完成后,客户端到服务端方向的连接已经释放,服务端不会再接收客户端的数据,客户端也没有数据要发送了。但服务端到客户端方向的连接仍然存在,服务器若发送数据,客户端依然要接受。这个状态还要持续一段时间,也就是整个CLOSE-WAIT状态持续的时间。

第三次挥手

服务端将最后的数据发送完毕后,就向客户端发送连接释放报文,其报文头包含:FIN=1,ack=u+1,由于在CLOS-WAIT状态,服务端很可能又发送了一些数据,假定此时的序列号为seq=w,此时,服务器就进入了LAST-ACK(最后确认)状态,等待客户端的确认。

第四次挥手

客户端收到服务器的连接释放报文后,向服务端发出确认应答,报文头:ACK=1,ack=w+1,seq=u+1,此时,客户端就进入了TIME-WAIT(时间等待)状态。该状态会持续2MSL(最长报文段寿命)时间,这个期间TCP连接还未释放,若该时间段内没有服务端的重发请求的话,客户端就进入CLOSED状态,服务端只要收到了客户端发出的确认,立即进入CLOSED状态。就结束了这次的TCP连接。可以看到,服务器结束TCP连接的时间要比客户端早一些。

TCP与UDP区别

1、基于连接与无连接;

2、对系统资源的要求(TCP较多,UDP少);

3、UDP程序结构较简单;

4、流模式与数据报模式 ;

5、TCP保证数据正确性,UDP可能丢包;

6、TCP保证数据顺序,UDP不保证。

HTTP协议参考

​ HTTP(超文本传输协议,HyperText Transfer Protocol)是互联网上应用最为广泛的一种网络协议。所有的WWW文件都必须遵守这个标准。设计HTTP最初的目的是为了提供一种发布和接收HTML页面的方法。是用于从WWW服务器传输超文本到本地浏览器的传输协议。默认使用80端口,HTTP客户端发起一个请求,建立一个到服务器指定端口(默认是80端口)的TCP连接。HTTP协议和TCP协议是不冲突的,HTTP定义在七层协议中的应用层,TCP解决的是传输层的逻辑。

HTTP1.0

1.0规定每次请求必须建立连接,服务器处理完请求必须断开连接,服务器不记录和跟踪过去的请求。

缺陷:

  • 连接无法复用:例如一个包含多图片(js,css同理)的页面中不包含图片本身的数据,而是图片URL,当访问这些图片时,又需要重新与服务器建立连接,下载图片数据,若图片较多,每次连接的建立与关闭是很耗时的过程。
  • head of line blocking:导致带宽无法被充分利用,以及后续健康请求被影响

HTTP1.1

为克服1.0的缺陷,1.1支持持久连接,在一个tcp上可有多个HTTP请求和响应,减少了建立与关闭连接的消耗延迟。1.1还允许客户端不用等待前一次请求的应答而发出下一次请求,这样显著减少了下载时间。

1.1支持Host请求字段,这样web浏览器可以通过这个字段根据主机头名明确访问服务器的哪个web站点(使得服务器可以在同一个ip和端口上使用不同主机名创建多个虚拟web站点)。1.1的持续连接通过加Connection字段实现,若值为Keep-Alive,即服务器处理完请求不关闭连接,值为Close反之。1.0每次传文件从头开始,

<code>RANGE:bytes=XXXX</code>
是HTTP/1.1新增内容,表示要求服务器从文件XXXX字节处开始传送,这就是平时所说的断点续传

在http1.1,request和reponse头中都有可能出现一个connection的头,此header的含义是当client和server通信时对于长链接如何进行处理。
在http1.1中,client和server都是默认对方支持长链接的, 如果client使用http1.1协议,但又不希望使用长链接,则需要在header中指明connection的值为close;如果server方也不想支持长链接,则在response中也需要明确说明connection的值为close。不论request还是response的header中包含了值为close的connection,都表明当前正在使用的tcp链接在当天请求处理完毕后会被断掉。以后client再进行新的请求时就必须创建新的tcp链接了。

HTTP/1.1与 1.0 的主要区别

1 缓存处理

2 带宽优化及网络连接的使用

3 错误通知的管理

4 消息在网络中的发送

5 互联网地址的维护

6 安全性及完整性

常用的请求方式

GET 请求获取Request-URI所标识的资源

POST 在Request-URI所标识的资源后附加的数据

HEAD 请求获取由Request-URI所标识的资源的响应消息报头

PUT 请求服务器存储一个资源,并用Request-URI作为其标识

DELETE 请求服务器删除Request-URI所标识的资源

TRACE 请求服务器回送收到的请求信息,主要用于测试或诊断

CONNECT 保留将来使用

OPTIONS 请求查询服务器的性能,或者查询与资源相关的选项和需求

// 请求头示例
GET / HTTP/1.1

Host:xxx.xxxx.com

User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.0.10) Gecko/2016042316 Firefox/3.0.10

Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8

Accept-Language: en-us,en;q=0.5

Accept-Encoding: gzip,deflate

Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7

Keep-Alive: 300

Connection: keep-alive

If-Modified-Since: Mon, 25 May 2016 03:19:18 GMT


//响应
HTTP/1.1 200 OK

Cache-Control: private, max-age=30

Content-Type: text/html; charset=utf-8

Content-Encoding: gzip

Expires: Mon, 25 May 2016 03:20:33 GMT

Last-Modified: Mon, 25 May 2016 03:20:03 GMT

Vary: Accept-Encoding

Server: Microsoft-IIS/7.0

X-AspNet-Version: 2.0.50727

X-Powered-By: ASP.NET

Date: Mon, 25 May 2016 03:20:02 GMT

Content-Length: 12173

消息体的内容(略)

HTTP 1.1状态代码及其含义

状态代码有三位数字组成,第一个数字定义了响应的类别,且有五种可能取值:

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

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

3xx:重定向–要完成请求必须进行更进一步的操作

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

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

HTTP特性

多路复用

多路复用指单一的HTTP/2连接能发起多重请求响应消息。

HTTP/2 把 HTTP 协议通信的基本单位缩小为一个一个的帧,这些帧对应着逻辑流中的消息。并行地在同一个 TCP 连接上双向交换消息。

在1.x版本中同一域名下的请求有数量限制,超过限制的请求会被阻塞,这样解决了同一域名的请求阻塞限制,且不依赖于创建多个tcp连接。

二进制分帧

HTTP/2在 应用层(HTTP/2)和传输层(TCP or UDP)之间增加一个二进制分帧层。在不改动 HTTP/1.x 的语义、方法、状态码、URI 以及首部字段的情况下, 解决了HTTP1.1 的性能限制,改进传输性能,实现低延迟和高吞吐量。

首部压缩

HTTP/1.1并不支持 HTTP 首部压缩,为此 SPDY 和 HTTP/2 应运而生, SPDY 使用的是通用的DEFLATE 算法,而 HTTP/2 则使用了专门为首部压缩而设计的 HPACK 算法。

服务端推送

服务端推送是一种在客户端请求之前发送数据的机制。在 HTTP/2 中,服务器可以对客户端的一个请求发送多个响应。Server Push 让 HTTP1.x 时代使用内嵌资源的优化手段变得没有意义;如果一个请求是由你的主页发起的,服务器很可能会响应主页内容、logo 以及样式表,因为它知道客户端会用到这些东西。这相当于在一个 HTML 文档内集合了所有的资源,不过与之相比,服务器推送还有一个很大的优势:可以缓存!也让在遵循同源的情况下,不同页面之间可以共享缓存资源成为可能。

HTTPS

HTTPS=HTTP+SSL

HTTP协议传输的数据都是未加密的,也就是明文的,因此使用HTTP协议传输隐私信息非常不安全。为了保证这些隐私数据能加密传输,于是网景公司设计了SSL(Secure Sockets Layer)协议用于对HTTP协议传输的数据进行加密,从而就诞生了HTTPS。现在的HTTPS都是用的TLS协议,但是由于SSL出现的时间比较早,并且依旧被现在浏览器所支持,因此SSL依然是HTTPS的代名词。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值