TCP特点概述
- 点对点的传输 point to point
- 可靠的,按序的字节流传输 reliable, in-order byte stream
- 流水线机制:有助于拥塞控制和流量控制 pipelined
- 全双工 full deplux data 数据双向流动
- 面向连接connection oriented
- 连接状态只在两端进行维护,并在数据交互之前就通过handshaking建立
TCP Segment Structure 段结构
![130b5eb2955805949ac92f109a0da932.png](https://i-blog.csdnimg.cn/blog_migrate/c3afa1d618675d11d29ab590e58dac33.jpeg)
- receive window 即愿意接受的字节数,用于流量控制flow control
- acknowledgement number 用来确认ACK号是否启用有效
- SYN是三次握手建立连接用到,FIN在四次挥手用到
TCP 连接的建立 3-Way Handshake 三次握手
- Step1: client host sends TCP SYN segment to server 发送SYN报文段
- 客户端发送的SYN置1
- 设定初始序列号seq(一般随机,即第一个字节的编号)
- 无任何data
- Step2: server host receives SYN, replie with SYN ACK segment 答复SYN ACK报文段
- server allocates buffers服务器分配缓存
- 设定server的初始序列号seq(也是随机,第一个字节的编号)
- 确认收到客户机的请求
- Step3: client receives SYNACK, replies with ACK segment, which may contain data
- 表示"我已经收到了你同意建立连接"
- 这一步也有Seq,按照下图即应该是Seq=x+1(但是ppt没写出来)
- 总结:
- 三次握手的思想是要互相完成确认acknowledgement,ack即是指期待对方的下一个报文段的序列号,因此是对方上次发过来的报文段的序列号seq+1(回忆一下TCP是顺序传输的,逆序传输情况是由应用自己负责)
- 序列号seq:占4个字节,即第一个字节的编号,由本地随机产生
- 确认号ack:占4个字节,即是指期待对方的下一个报文段的序列号,因此是对方上次发过来的报文段的序列号seq+1
- Syn bit和ACK bit都是确认位,SYN代表请求建立连接,建立连接则置1。而ACK代表确认号是否有效。
![8d4cb249e491b38c5ed47aaf8d503769.png](https://i-blog.csdnimg.cn/blog_migrate/1980f44c1dec45784814c470937468cb.jpeg)
- 问题:为什么要握手?
- UDP就不需要握手,直接发数据,但是TCP 是可靠通信协议,要保证接收方收到的数据是完整, 有序, 无差错的。
2. 问题:握手是怎样保证数据可靠的呢?
- 通过seq序列号和ack确认号,ack即是指期待对方的下一个报文段的序列号,因此是对方上次发过来的报文段的序列号seq+1,从而保证连接传输是可靠的。当然checksum等机制在这里就不全列叙了,这部分回答只是针对tcp握手这部分的。
![8041ce0f2a1b0c2cee13aa9f4cea56a6.png](https://i-blog.csdnimg.cn/blog_migrate/f3a57894311f9a4c702e81c6f15adebe.png)
3. 问题:为什么需要三次握手,两次握手不行吗
- 正如上文所描述的,为了实现可靠传输,发送方和接收方始终需要同步( SYNchronize )序列号seq。 需要注意的是, 序号seq并不是从 0 开始的,而是由发送方随机选择的初始序列号 ( Initial Sequence Number, ISN )开始,是第一个字节的编号。由于 TCP 是一个双向通信协议,通信双方都有能力发送信息,并接收响应。因此,通信双方都需要各自随机产生一个初始的序列号,并且把这个起始值告诉对方,所以要三次握手。
- 三次握手的过程即是通信双方相互告知序列号起始值, 并确认对方已经收到了序列号起始值的必经步骤。如果只是两次握手, 至多只有连接发起方的起始序列号能被确认, 另一方选择的序列号则得不到确认
4. 问题:如果很多台计算机同时发送很多SYN请求,但攻击者无意完成三次握手过程,即已完成SYN,SYN-ACK但尚未得到最终ACK的连接呢?
- 这被称为SYN-Flooding攻击,是DoS攻击的一种,攻击者要么使用欺骗性的假的IP地址,要么不要继续完成整个三次握手过程。通过这种攻击,攻击者可以淹没用于半连接的受害者队列,当这个队列已满时,受害者不能再进行任何连接。