1.TCP协议

- 1.
TCP(Transmission Control Protocol):传输控制协议 - 2.
TCP协议是一种面向连接的、可靠的、 基于字节流的传输层通信协议 - 1.
面向连接:两个使用TCP协议的应用(通常一个客户和一个服务器)在彼此交换数据包之前必须先建立一个TCP连接 - 2.
可靠的 - 1.数据传输之前都要建立连接(
三次握手),数据传输结束后都要释放连接(四次挥手) - 2.数据被分割成
TCP认为适合发送的数据块,而采用UDP协议的数据长度将保持不变 - 3.由
TCP传递给IP的信息单位称为报文段或段segment - 4.当
TCP发出一个段后将启动一个定时器,等待目的端确认收到这个报文段,如果不能及时收到一个确认,将重发这个报文段 - 5.等待协议:客户发送一次数据到服务端,必须等到服务端响应后才发第二次数据,中间的等待时间占了大部分时间,中间如果出现差错(超时或确认丢失)都需要重新传输
- 5.
TCP将保存首部和数据的检验和,这是一个端到端的检验和,目的是检测数据在传输过程中的任何变化,如果收到段的检验和有差错,TCP将丢弃这个报文段并不确认收到此报文段,发送端需要重新发送
- 3.
TCP位码即TCP标志位共有六种 - 1.
SYN(建立) - 2.
ACK(确认) - 3.
PSH(传送) - 4.
FIN(结束) - 5.
RST(重置)、 - 6.
URG(紧急) - 7.
Sequence number(顺序号码) - 8.
Acknowledge number(确认号码)
1.三次握手


- 1.
TCP协议中建立连接需要经过三次握手,开始时客户端处于CLOSED的状态,服务端处于LISTEN状态 - 1.
第一次握手 - 1.客户端发送
SYN报文(包)到服务器并指明客户端的初始化序列号seq,此时客户端处于SYN_SEND状态,等待服务器确认 - 2.首部的同步位
SYN=1,初始化序列号sqe=x,x是一个随机生成的值
- 2.
第二次握手 - 1.服务器收到客户端的
SYN报文,发送一个SYN+ACK报文作为应答并且指定自己的初始化序列号 - 2.将客户端的初始化序列号加一,即
x + 1作为ack的值,表示已经收到了客户端的 SYN报文,此时服务器处于SYN_REVD的状态 - 3.确认报文段中
SYN=1,ACK=1,确认号ack=x+1,初始化序列号seq=y
- 3.
第三次握手 - 1.客户端收到服务器
SYN+ACK报文后,会向服务器发送一个ACK报文表示已经收到了服务端的报文 - 2.此时客户端处于
ESTABLISHED状态,服务器收到ACK报文之后,也处于ESTABLISHED状态,此时双方已建立起了连接,完成三次握手 - 3.确认报文段中
ACK=1,确认号ack=y+1,初始化序列号seq=x+1
- 2.三次握手(
Three-way Handshake)本质:指建立一个TCP连接时需要客户端和服务器总共发送3个包 - 3.三次握手的作用:确认双方的接收能力和发送能力是否正常,指定自己的初始化序列号为后面的可靠性传送做准备,实质上是连接服务器指定端口建立
TCP连接并同步连接双方的序列号和确认号,交换TCP窗口大小信息 - 4.理想状态下
TCP连接一旦建立,则在通信双方中的任何一方主动关闭连接之前TCP 连接都将被一直保持下去 - 5.一般握手过程中传送的包里不包含数据,三次握手完成后客户端与服务器才正式开始传送数据
- 6.注意
- 1.
SYN=1报文段不能携带数据,ACK报文段可以携带数据,不携带数据则不消耗序号,即三次握手的前两次不能携带数据,而第三次可以携带数据 - 2.
ACK和ack的区别 - 1.三次握手发送的数据包中有两个
ACK,习惯通过一个大写一个小写加以区分 - 2.
ACK:确认标志(Acknowledgement),值为1表示确认连接 - 3.
ack:确认编号(Acknowledgement Number),值为发送方传来的seq+1,表示已经成功接收上一次所有数据
- 3.需要三次握手的原因
- 1.第一次握手:客户端发送网络包,服务端接收;结论:
服务端可知客户端的发送能力正常 - 2.第二次握手:服务端发送网络包,客户端接收;结论:
客户端可知服务端的接收,发送能力正常,但是此时服务端并不能确认客户端的接收能力正常所以需要第三次的确认 - 3.第三次握手:客户端发送网络包,服务端接收;结论:
服务端可知客户端的接收,发送能力正常
- 4.两次握手的问题
- 1.客户端发出连接请求但因连接请求报文丢失而未收到确认,于是客户端再重传一次连接请求
- 2.服务端后来收到了确认,建立了连接,数据传输完毕后,就释放了连接
- 3.客户端共发出了两个连接请求报文段,其中第一个丢失,第二个到达了服务端,但是第一个丢失的报文段只是在某些网络结点长时间滞留,从而延误到连接释放以后的某个时间才到达服务端
- 4.此时服务端误认为客户端又发出一次新的连接请求,于是就向客户端发出确认报文段,同意建立连接
- 5.不采用三次握手,只要服务端发出确认就建立新的连接,此时客户端忽略服务端发来的确认也不发送数据,则服务端一致等待客户端发送数据,浪费资源
- 5.半连接队列和全连接队列
- 1.服务器第一次接收到客户端的
SYN报文后会处于SYN_RCVD状态,此时双方还没有完全建立其连接,服务器会把此种状态下请求连接放在一个队列里,把这种队列称之为半连接队列 - 2.全连接队列:已经完成三次握手建立起连接的会放在全连接队列中,如果队列满了有可能会出现丢包现象
- 3.服务器发送完
SYN+ACK包后如果未收到客户确认包,服务器进行首次重传,等待一段时间仍未收到客户确认包进行第二次重传,如果重传次数超过系统规定的最大重传次数,系统将该连接信息从半连接队列中删除,且每次重传等待的时间不一定相同,一般会是指数增长
1.初始化序列号ISN

- 1.客户端和服务端在建立
TCP连接时,双方都会发送SYN报文并初始化序列号(Initial Sequence Number,ISN) - 2.使用相同
ISN导致的问题 - 1.假设
A和B使用固定的序号,A使用序号1和B建立TCP连接,发送一个SYN报文,此时seq = 1,经过三次握手后A和B之间建立TCP连接完成 - 2.当
A和B建立TCP连接后,A又使用相同的序号1向B发送了200字节数据,不过因为网络拥塞问题,这个TCP数据报一直在网络中逗留并没有立即到达B - 3.由于
A发送的TCP数据报一直没到达B,正好此时A发生故障并重启,于是B就释放这条TCP连接,然后A重启后又使用序号1和B建立新的TCP连接 - 4.当
TCP连接建立后A又使用序号1向B发送了240字节的数据,不过这次网络很稳定B马上就收到A发送的数据,注意此时A发送数据使用新的TCP连接 - 5.
A之前发送的TCP数据报经过一段时间后终于到达B,不过该TCP数据报属于之前已经释放的旧TCP连接,B应该把这个数据报丢弃掉,但是由于A每次发送报文都使用了相同的序号(seq = 1)从而会让B误认为该数据报属于新建立的TCP连接,因此B会对该数据照收不误导致B在收到新TCP连接的数据后又收到旧TCP连接的数据从而出现数据乱序的问题
- 3.
ISN的作用:保证消息的顺序性 - 1.由于
A和B之间的一个TCP连接通常是由A和B的2个ip地址,2个端口号构成的四元组 - 2.因此当
A出现了故障把该TCP连接断开之后再以相同的四元组建立新的TCP连接(A和B两次建立TCP连接都是使用相同的ip地址和端口),就会出现数据乱序的问题 - 3.因为只要
A发送了一个TCP报文段且这个TCP报文段的四元组和序号和之前的TCP连接(四元组和序号)相同的话就会被B确认 - 4.这反映了
TCP的一些缺点,如果被一些恶意攻击者加以利用TCP的这种缺点,选择合适的序号,ip地址和端口就能伪造出一个TCP报文段从而打断正常的TCP连接 - 5.但是初始化序号的方式(通过算法来随机生成序号)就会使序号难以猜出,也就不容易利用这种缺点来进行一些恶意攻击行为,且如何序号不同那么
B在接收到这个序号为1的TCP报文时,发现该TCP报文的序号不在新TCP连接的接收范围内时会把这个TCP报文丢弃掉从而避免了数据乱序的问题
2.四次挥手

- 1.
TCP协议中断开连接需要经过四次挥手,开始时客户端和服务端都处于ESTABLISHED状态,假定客户端先发起关闭请求