-
TCP是什么?
-
传输控制协议(TCP,Transmission Control Protocol)是一种面向连接的、可靠的、基于字节流的传输层通信协议。可以通过百度百科了解。
-
如何理解面向链接?
面向链接并不是物理意义上使用网线将两端进行链接,而是通过三次握手,建立虚拟链接。(即两端开辟资源,创建socket)。
-
如何理解可靠性?
可靠性个人认为主要是通过:1、确认机制 2、重传输机制 3、差错检测。
这里直接引用百度百科中的内容:TCP为了保证不发生丢包,就给每个包一个序号,同时序号也保证了传送到接收端实体的包的按序接收。然后接收端实体对已成功收到的包发回一个相应的确认(ACK);如果发送端实体在合理的往返时延(RTT)内未收到确认,那么对应的数据包就被假设为已丢失将会被进行重传。TCP用一个校验和函数来检验数据是否有错误;在发送和接收时都要计算校验和。
-
-
TCP的三次握手
-
三次握手过程图:
-
三次握手过程
-
客户端发送SYN(SYN=1,ACK=0,seq=x)报文给服务器端,进入SYN_SEND状态。
- SYN=1,ACK=0表示该报文段为连接请求报文。
- x为本次TCP通信的字节流的初始序号。
- TCP规定:SYN=1的报文段不能有数据部分,但要消耗掉一个序号。
-
服务器端收到SYN报文,回应一个SYN (SYN=1,ACK=1,seq=y,ack=x+1)报文,进入SYN_RECV状态。
- SYN=1,ACK=1表示该报文段为连接同意的应答报文。
- seq=y表示服务端作为发送者时,发送字节流的初始序号。
- ack=x+1表示服务端希望下一个数据报发送序号从x+1开始的字节。
-
客户端收到服务器端的SYN报文,回应一个ACK(ACK=1,seq=x+1,ack=y+1)报文,客户端发送后进入Established状态,服务端收到这个应答后也进入ESTABLISHED状态,此时连接的建立完成!
有两个注意点:1、TCP有延迟确认的功能 ,主要作用也是提高传输效率。可参考博客:https://blog.csdn.net/shawei_/article/details/81809027
2、TCP报文段中含有两个ack。
3、报文中seq(序号)的作用:一方面是保证报文传输的可靠,同时也保证了传送到接收端实体的包的按序接收(个人认为,报文在传输中链路网络情况不可预期,所以应该是使得服务端可以对于接收到的报文进行重排序)。
-
-
抓个包看看:
-
使用命令:tcpdump -nn -i eth0 port 80
-
也可以使用命令查看详情: tcpdump -nn -X -i eth0 port 80
-
-
为什么是三次握手?
- 三次握手的目的:为了防止已失效的连接请求报文段突然又传送到了服务端,因而产生错误。三次通信是理论上的最小值。
- 举个例子:client发出的第一个连接请求报文段并没有丢失,而是在某个网络结点长时间的滞留了,以致延误到连接释放以后的某个时间才到达server。本来这是一个早已失效的报文段。但server收到此失效的连接请求报文段后,就误认为是client再次发出的一个新的连接请求。于是就向client发出确认报文段,同意建立连接。假设不采用“三次握手”,那么只要server发出确认,新的连接就建立了。由于现在client并没有发出建立连接的请求,因此不会理睬server的确认,也不会向server发送数据。但server却以为新的运输连接已经建立,并一直等待client发来数据。这样,server的很多资源就白白浪费掉了。采用“三次握手”的办法可以防止上述现象发生。例如刚才那种情况,client不会向server的确认发出确认。server由于收不到确认,就知道client并没有要求建立连接。
- 若建立连接只需两次握手,客户端并没有太大的变化,仍然需要获得服务端的应答后才进入ESTABLISHED状态,而服务端在收到连接请求后就进入ESTABLISHED状态。此时如果网络拥塞,客户端发送的连接请求迟迟到不了服务端,客户端便超时重发请求,如果服务端正确接收并确认应答,双方便开始通信,通信结束后释放连接。此时,如果那个失效的连接请求抵达了服务端,由于只有两次握手,服务端收到请求就会进入ESTABLISHED状态,等待发送数据或主动发送数据。但此时的客户端早已进入CLOSED状态,服务端将会一直等待下去,这样浪费服务端连接资源。
链接:https://www.zhihu.com/question/24853633/answer/254224088 - 可以参考知乎:https://www.zhihu.com/question/24853633
-
-
四次分手
-
四次分手过程图:
-
四次分手过程:
- 第一次挥手:若A认为数据发送完成,则它需要向B发送连接释放请求。该请求只有报文头,头中携带的主要参数为:FIN=1,seq=u。此时,A将进入FIN-WAIT-1状态。
- FIN=1表示该报文段是一个连接释放请求。
- seq=u,u-1是A向B发送的最后一个字节的序号。
- 第二次挥手:B收到连接释放请求后,会通知相应的应用程序,告诉它A向B这个方向的连接已经释放。此时B进入CLOSE-WAIT状态,并向A发送连接释放的应答,其报文头包含:ACK=1,seq=v,ack=u+1。
- ACK=1:除TCP连接请求报文段以外,TCP通信过程中所有数据报的ACK都为1,表示应答。
- seq=v,v-1是B向A发送的最后一个字节的序号。
- ack=u+1表示希望收到从第u+1个字节开始的报文段,并且已经成功接收了前u个字节。
- A收到该应答,进入FIN-WAIT-2状态,等待B发送连接释放请求。
- 第二次挥手完成后,A到B方向的连接已经释放,B不会再接收数据,A也不会再发送数据。但B到A方向的连接仍然存在,B可以继续向A发送数据。
- 第三次挥手:当B向A发完所有数据后,向A发送连接释放请求,请求头:FIN=1,ACK=1,seq=w,ack=u+1。B便进入LAST-ACK状态。
- 第四次挥手:A收到释放请求后,向B发送确认应答,此时A进入TIME-WAIT状态。该状态会持续2MSL时间,若该时间段内没有B的重发请求的话,就进入CLOSED状态,撤销TCB。当B收到确认应答后,也便进入CLOSED状态,撤销TCB。
- 为什么A要先进入TIME-WAIT状态,等待2MSL时间后才进入CLOSED状态?
- 为了保证B能收到A的确认应答。
若A发完确认应答后直接进入CLOSED状态,那么如果该应答丢失,B等待超时后就会重新发送连接释放请求,但此时A已经关闭了,不会作出任何响应,因此B永远无法正常关闭。
- 为了保证B能收到A的确认应答。
- 第一次挥手:若A认为数据发送完成,则它需要向B发送连接释放请求。该请求只有报文头,头中携带的主要参数为:FIN=1,seq=u。此时,A将进入FIN-WAIT-1状态。
-
为什么是四次分手?
- 因为TCP连接是全双工模式,即客户端和服务端都可以发送、接收数据。每次发送FIN报文都表示该方向不会再进行数据传输,每个FIN都需要进行确认,保证消息的可靠性,所以需要四次分手。(客户端 -> 服务端方向FIN + ACK; 服务端 ->客户端方向FIN + ACK)
-
-
滑动窗口机制
-
窗口:
-
发送窗口:发送方一次能发送多少字节的大小。
-
接收窗口:接收方缓冲区用于接受数据空间大小。
-
发送窗口与接收窗口的关系:TCP是双工的协议,会话的双方都可以同时接收、发送数据。TCP会话的双方都各自维护一个“发送窗口”和一个“接收窗口”。其中各自的“接收窗口”大小取决于应用、系统、硬件的限制(TCP传输速率不能大于应用的数据处理速率)。各自的“发送窗口”则要求取决于对端通告的“接收窗口”,要求相同。
-
-
TCP拥塞控制算法(也称AIMD算法):
-
慢启动:每当建立一个TCP连接时或一个TCP连接发生超时重传后,该连接便进入慢启动阶段。进入慢启动后,TCP实体将拥塞窗口的大小初始化为一个报文段,即:cwnd=1。此后,每收到一个报文段的确认(ACK),cwnd值加1,即拥塞窗口按指数增加。当cwnd值超过慢启动阐值(ssthresh)或发生报文段丢失重传时,慢启动阶段结束。前者进入拥塞避免阶段,后者重新进入慢启动阶段。
-
拥塞避免:在慢启阶段,当cwnd值超过慢启动阐值(ssthresh)后,慢启动过程结束,TCP连接进入拥塞避免阶段。在拥塞避免阶段,每一次发送的cwnd个报文段被完全确认后,才将cwnd值加1。在此阶段,cwnd值线性增加。
- 快速重传:快速重传是对超时重传的改进。当源端收到对同一个报文的三个重复确认时,就确定一个报文段已经丢失,因此立刻重传丢失的报文段,而不必等到重传定时器(RTO)超时。以此减少不必要的等待时间。
- 快速恢复:快速恢复是对丢失恢复机制的改进。在快速重传之后,不经过慢启动过程而直接进入拥塞避免阶段。每当快速重传后,置ssthresh=cwnd/2、ewnd=ssthresh+3。此后,每收到一个重复确认,将cwnd值加1,直至收到对丢失报文段和其后若干报文段的累积确认后,置cwnd=ssthresh,进入拥塞避免阶段。
-
-
流量控制:TCP还能提供流量控制。TCP连接的每一方都有固定大小的缓冲空间。TCP的接收端只允许另一端发送接收端缓冲区所能接纳的数据。这将防止较快主机致使较慢主机的缓冲区溢出。
-
流量控制:TCP还能提供流量控制。TCP连接的每一方都有固定大小的缓冲空间。TCP的接收端只允许另一端发送接收端缓冲区所能接纳的数据。这将防止较快主机致使较慢主机的缓冲区溢出。
-
浅析TCP协议
于 2021-01-14 09:38:55 首次发布