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报文
欢迎关注公众号
