TCP

221 阅读6分钟

TCP(传输控制协议):是一种面向连接的、可靠的、基于字节流的传输层通信协议。

优点:面向连接的、可靠的、有流量控制、拥塞控制、面向字节流传输,在端与端之间进行通信

1、当应用层向TCP层发送用于网间传输的、用8位字节流表示的数据流,TCP则把数据流分割成适当长度的报文,最大传输段大小(MSS

2、TCP为了保证报文传输的可靠,就给每一个包一个序号,同时序号也保证了传送到接收端实体的包是按顺序接收。然后接收端实体对已成功收到的字节发回一个相应的确认(ACK),如果发送端实体在合理的往返时延(RTT)内未收到确认,那么对应的数据将会被重传。在数据正确性与合法性上,TCP用一个校验和函数来检验数据是否有错误,在发送和接收时都要计算校验和,同时可以使用md5认证对数据进行加密;在保证可靠性上,采用超时重传和捎带确认机制;在流量控制上,采用滑动窗口协议,协议中规定对于窗口内未经确认的分组需要重传。

3、采用TCP拥塞控制算法

报文结构


1、源端口号

2、目标端口号

3、序列号:因为TCP是面向字节流的,它会将报文分成一个个字节,给每个字节进行序号编写,然后分成几部分来进行传输

4、确认应答:就是告诉对方要传第多少个字节了

5、首部长度

6、保留:给以后有需要再用

7、控制位:目前的控制位有6个

      URG:紧急,为1时表明紧急指针字段有效,标识该报文是一个紧急报文,传送到目标主机后,不用排队,应该让该报文尽量往下排,让其早点让应用程序给接受

      ACK:确认,为1时,确认序号才有效,为0时,确认序号没用

      PSH:推送,当为1时,当遇到此报文时,会减少数据向上交付,本来向应用进程交付数据是要等到一定的缓存大小才发送的,但是遇到它时,就不用再等足够多的数据才向上交付

      RST:复位,报文遇到严重的差错时,比如TCP连接出错等会将RST置为1,然后释放连接,全部重新来过

      SYN:同步,在进行连接的时候使用

      FIN:终止,释放连接时使用

8、窗口:指发送报文段一方的接受窗口大小,用来控制对方发送的数据量

9、校验和:校验首部和数据这两部分

10、选项:长度可变,介绍一种选项,最大报文段长度,MSS

11、填充:为了让其称为整数个字节

面向连接

三次握手

第一次:客户端想与服务器进行连接了,状态变为主动打开,发送一个连接请求报文给服务器端,SYN=1,seq=x,发送完请求连接报文之后,客户端的状态变为SYN_SENT(等待发送确认)

第二次:服务端收到连接请求报文后,从LSTTEN状态变为被动打开状态,然后给客户端返回一个报文SYN=1,seq=y,ACK=1,ack=x+1,发送完状态变为SYN_RCVD状态。

第三次:客户端得到服务端的确认和知道服务器也准备好了连接后,还会发送一个确认报文到服务器端,ACK=1,ack=y+1,告诉服务器端我接收到了你发送的报文,进入ESTABLISHED,服务器接收到了也变为ESTABLISHED。

可靠传输

1、数据编号:将每个字节进行编号

     积累确认:服务器端不是接收到一个字节就发一个确认,而是当接收到4、5个时,再发送一个确认

2、滑动窗口:每次能发送的数据是在此窗口这的,接到了多少数据,就往后滑多少数据

3、超时重传时间:如果等待一段时间后,还没有确认报文,那么就重新传

4、快速重传

流量控制

在传输层中,有接受缓存和发送缓存这两个东西存在,所以每次发送数据过去另一端时,就会把这些数据给带过去,让对方知道自己的这两个缓存的大小,然后来合理的设置自己的发送窗口的大小。如果对方的缓存快满了,对方在传送数据过来的时候就会告诉自己少发送一些数据过来,自己就设置滑动窗口小一点,让对方有缓冲的机会,而不会导致缓存溢出,不让自己的报文被丢弃。

阻塞控制

考虑了对方接收不过来,缓存太多导致溢出,也考虑在线路中,线路上的传输速率就那么大,但是很多人同时在用,发送的数据太多,就会使线路发生拥塞。

当检测到有网络拥塞时,就会让自己的滑动窗口变小

释放连接

四次挥手

第一次挥手:从ESTABLISHED变为主动关闭状态,客户端主动发送释放连接请求给服务器端,FIN=1,seq=i,发送完之后就变为FIN_WAIT_1状态

第二次挥手:服务器接收到客户端发来的释放请求后,状态变为CLOSE_WAIT,然后发送确认报文给客户端,ACK=1,ack=i+1

第三次挥手:服务端所有的数据都发送完了,认为可以关闭连接了,向客户端发送释放连接报文,FIN=1,seq=j,发送完之后变为LAST_WAIT

第四次挥手:客户端接到释放连接报文后,发送一个确认报文ACK=1,ack=j+1,自己变为TIME_WAIT,客户端不马上关闭是因为客户端发送的报文可能会丢失,服务器端会重传一个FIN报文


                                                           欢迎关注公众号