TCP传输控制协议总结

 TCP位于TCP/IP四层协议的第三层,属于传输层协议。它提供面向连接的 可靠的字节流服务。

 TCP通过一下方式提供服务:

   1. 应用数据被分割成TCP认为最合适发送的数据块。这和UDP完全不一样,应用程序产生的数据报长度保持不变。由TCP传递给IP的信息单位称为报文段或段。

   2.当TCP发出一个段后,它启动一个定时器,等待目的端确认收到这个报文段。如果不能即是收到一个确认,将重发这个报文段。

   3.当TCP收到法子TCP连接另一端的数据,它将发送一个确认。这个确认不是立即发送,通常将推迟几分之一妙。

   4.Tcp将保持它首部和数据的检验和。这是一个端到端的检验和,目的是检测数据在传输过程中的任何变化。如果收到检验和有错误,Tcp将丢弃这个报文段和不确认该报文。

   5.Tcp报文段作为ip数据报来传输,而IP数据包的到达可能会失序,因此TCP报文段的到达可能会失序。如果有必要,TCP将对收到的数据进行排序,以正确的顺序将数据交给应用层。

  6. 既然IP数据包会发生重复,tcp的接收端必须丢弃重复的数据。

  7.TCP还能提供流量控制。TCP连接的每一方都有固定大小的缓冲空间。tcp的接受端只允许另一端发送接收端所能接纳的数据。

一.TCP首部:


TCP的愿端口和目的端口以及ip报文中的源IP和目的IP构成唯一的一个连接。一个IP地址和一个端口号成为一个插口。   

序列号的选择:系统初始序列号为0,每个0.5秒增加6400,并每隔9.5小时又回到0.另外每建立一个连接后,这个变量将增加64000;

在TCP首部中有6个bit的标志位。它们中的多个可同时被设置成1.其中:

   URG:紧急指针有效

   ACK:确认一个报文

   PSH:希望将这个报文交给应用成

   RST:重建连接

   SYN:同步序号用来发起一个连接。

   FIN :发端完成发生任务。

   最常见的可选字段是最长报文大小,又称为MSS。每个连接方通常都在通信的第一个报文段(SYN)中指明这个选项。

   TCP报文段的数据部分是可选的。在一个连接建立和一个连接终止时,双方交换的报文段仅有TCP首部。如果一方没有数据要发送,也使用没有任何数据的首部来确认收到的数据。在处理超时的情况下也会发送不带任何数据的报文段。

URG和PSH的区别:

     URG标志 URG 紧急指针有效。当URG=1时,表示分段中有紧急数据应当加速传送。
PSH标志 PSH 紧急位。当PSH=1时,要求发送方马上发送该分段,而接收方尽快的将报文交给应用层,不做队列处理。
URG=1,表示紧急指针指向包内数据段的某个字节(数据从第一字节到指针所指字节就是紧急数据),不进入接收缓冲(一般不都是待发送的数据要先进入发送缓存吗?就直接交给上层进程,余下的数据都是要进入接收缓冲的;一般来说TCP是要等到整个缓存都填满了后再向上交付,但是如果PSH=1的话,就不用等到整个缓存都填满,直接交付,但是这里的交付仍然是从缓冲区中交付的,URG是不要经过缓冲区的,千万记住!


二、TCP连接的建立和终止



连接的建立需要三次握手。

三次握手超时异常说明:

情形1:当client的SYN发送之后,sever离线;

client处理:在client发起SYN之后,client会重启一个定时器,初始值为1秒,在Linux下,默认重试次数为5次,重试的间隔时间从1s开始每次都翻售,5次的重试时间间隔为1s, 2s, 4s, 8s, 16s,总共31s,第5次发出后还要等32s都知道第5次也超时了,所以,总共需要 1s + 2s + 4s+ 8s+ 16s + 32s = 2^6 -1 = 63s,TCP才会把断开这个连接。

至于为什么初始值为1秒可查看http://www.tuicool.com/articles/qmauEnb

至于为什么会传5次,可设置net.ipv4.tcp_syn_retries = 1,详情可查看http://www.2cto.com/os/201307/230155.html

情形2:关于SYN Flood攻击

一些恶意的人就为此制造了SYN Flood攻击——给服务器发了一个SYN后,就下线了,于是服务器需要默认等63s才会断开连接,这样,攻击者就可以把服务器的syn连接的队列耗尽,让正常的连接请求不能处理。于是,Linux下给了一个叫tcp_syncookies的参数来应对这个事——当SYN队列满了后,TCP会通过源地址端口、目标地址端口和时间戳打造出一个特别的Sequence Number发回去(又叫cookie),如果是攻击者则不会有响应,如果是正常连接,则会把这个 SYN Cookie发回来,然后服务端可以通过cookie建连接(即使你不在SYN队列中)。请注意,请先千万别用tcp_syncookies来处理正常的大负载的连接的情况。因为,synccookies是妥协版的TCP协议,并不严谨。对于正常的请求,你应该调整三个TCP参数可供你选择,第一个是:tcp_synack_retries 可以用他来减少重试次数;第二个是:tcp_max_syn_backlog,可以增大SYN连接数;第三个是:tcp_abort_on_overflow 处理不过来干脆就直接拒绝连接了。

Linux系统对该参数设置方法如下:

net.ipv4.tcp_syncookies = 1
SYN Cookie是对TCP服务器端的三次握手协议作一些修改,专门用来防范SYN Flood攻击的一种手段。它的原理是,在TCP服务器收到TCP SYN包并返回TCP SYN+ACK包时,不分配一个专门的数据区,而是根据这个SYN包计算出一个cookie值。在收到TCP ACK包时,TCP服务器在根据那个cookie值检查这个TCP ACK包的合法性。如果合法,再分配专门的数据区进行处理未来的TCP连接。




  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值