TCP/IP 总结

http://blog.csdn.net/xtzmm1215/article/details/47385079(三次握手,tcp漏洞)

1. TCP 为什么要三次握手,而不是两次

1)要保证保证全双工通信,为了保证服务端能接受到客户端的信息并能做出正确的应答而进行前两次(第一次和第二次)握手,为了保证客户端能够接收到服务端的信息并能做出正确的应答而进行后两次(第二次和第三次)握手。

2)TCP连接是一条双向连接,需要client和server都对对方的sequence number进行确认,因此在client发送SYN后,服务端会对客户端的SYN报文中的sequence number进行确认,再将自己的sequence number携带给client,等待client端的确认。在TCP的三次握手中,双方会针对连接中的一些参数进行协商。

3)防止已失效的请求报文段突然又传送到了服务端而产生连接的误判。

1.1.  第2个syn的作用


1.2 三次握手的漏洞,可能受到哪些攻击:SYN flood 攻击

原理
攻击者首先 伪造地址对服务器发起SYN请求,服务器回应(SYN+ACK)包,而 真实的IP会认为,我没有发送请求, 不作回应。服务器没有收到回应,这样的话,服务器不知道(SYN+ACK)是否发送成功,默认情况下 会重试5次(tcp_syn_retries)。这样的话, 对于服务器的内存,带宽都有很大的消耗。攻击者如果处于公网,可以伪造IP的话,对于服务器就很难根据IP来判断攻击者,给防护带来很大的困难。
防护措施,主要通过以下3种方式:
1)无效连接监视释放

这种方法不停的监视系统中半开连接和不活动连接,当达到一定阈值时拆除这些连接,释放系统资源。这种绝对公平的方法往往也会将正常的连接的请求也会被释放掉,”伤敌一千,自损八百“。

2)延缓TCB分配方法,SYN Flood关键是利用了,SYN数据报文一到,系统立即分配TCB资源,从而占用了系统资源,因此有俩种技术来解决这一问题:

Syn Cache技术,这种技术在收到SYN时不急着去分配TCB,而是先回应一个ACK报文,并在一个专用的HASH表中(Cache)中保存这种半开连接,直到收到正确的ACK报文再去分配TCB。

Syn Cookie技术,Syn Cookie技术则完全不使用任何存储资源,它使用一种特殊的算法生成Sequence Number,这种算法考虑到了对方的IP、端口、己方IP、端口的固定信息,以及对方无法知道而己方比较固定的一些信息,如MSS、时间等,在收到对方 的ACK报文后,重新计算一遍,看其是否与对方回应报文中的(Sequence Number-1)相同,从而决定是否分配TCB资源

3)使用 syn proxy(代理) 防火墙

原理:对试图穿越的SYN请求进行验证之后才放行


2.拥塞控制的概念,过程,解决的问题

http://www.cnblogs.com/newwy/p/3254029.htmlhttp://blog.csdn.net/sicofield/article/details/9708383

所谓拥塞控制就是防止过多的数据注入到网络中,这样可以使网络中的路由器或链路不致过载。拥塞控制所要做的都有一个前提,就是网络能承受现有的网络负荷。拥塞控制是一个全局性的过程

发送报文段速率(发送窗口大小)接收窗口和拥塞窗口两个状态量确定。接收端窗口又称通知窗口,是接收端根据目前的接收缓存大小所许诺的最新窗口值,是来自接收端的流量控制。拥塞窗口是发送端根据自己估计的网络拥塞程度而设置的窗口值,是来自发送端的流量控制,并且动态地在变化

拥塞控制方法:

1)慢启动和拥塞避免

慢启动,从小到达逐渐增大发送端的拥塞控制窗口数值(当主机开始发送数据时,不要一开始就发送大量的数据,先探测一下网络的拥塞程度),为了防止拥塞窗口cwind的增长引起网络拥塞,还需要另外一个变量---慢开始门限ssthresh。慢启动算法只是在TCP建立时才使用。

拥塞控制具体过程为:

(1)TCP连接初始化,将拥塞窗口设置为1。
(2)执行慢开始算法,cwind按 乘法(*2)规律增长 ,知道cwind == ssthress开始执行 拥塞避免算法 ,cwnd按 线性规律(加法 +1)增长 。(未拥塞时)
(3)当 网络发生拥塞 ,把ssthresh值更新为拥塞前ssthresh值的一半( 乘法减小 /2 ),cwnd重新设置为1,按照步骤(2)执行 慢启动算法 。(拥塞时)
2) 快重传和快恢复

快重传算法并非取消了重传机制,只是在某些情况下更早重传丢失的报文段(如果当发送端接收到三个重复确认ACK时,则断定分组丢失,立即重传丢失的报文段,而不必等待重传计时器超时)。

快恢复算法两个要点:

(1)当发送方连续收到三个重复确认时,就执行“乘法减小”算法,把慢开始门限减半,为了预防网络发生拥塞。

(2)由于发送方现在认为网络很可能没有发生拥塞(如果网络出现拥塞的话就不会收到好几个重复的确认),因此现在不执行慢开始算法,而是把cwnd值设置为慢开始门限减半后的值,然后开始执行拥塞避免算法,使拥塞窗口线性增大。

3.流量控制的概念,过程,解决的问题

http://blog.csdn.net/sicofield/article/details/9708311

所谓的流量控制就是让发送方的发送速率不要太快,让接收方来得及接受。利用滑动窗口机制可以很方便的在TCP连接上实现对发送方的流量控制。TCP的窗口单位是字节,不是报文段,发送方的发送窗口不能超过接收方给出的接收窗口的数值。流量控制往往指的是点对点通信量的控制,是个端到端的问题。流量控制所要做的就是控制发送端发送数据的速率,以便使接收端来得及接受。

4.滑动窗口机制

http://blog.csdn.net/sicofield/article/details/9708311

发送窗口的大小受TCP数据报中窗口大小的影响,TCP数据报中的窗口大小是接收端通知发送端其还可以接收多少数据,所以发送窗口根据接收到的窗口大小的值动态变化

发送窗口中数据的属性分为两种:已发送但未收到确认的,允许发送但未发送的(决定可用窗口大小)。

当发送窗口中的已发送但未收到确认的数据报被确认时,发送窗口可向前滑动,使得发送窗口中的可用窗口增大。


传输效率问题1:小分组连续传输(每次传输的数据量较小),网络效率低。

解决:Nagle算法:规定一个TCP连接最多只能有一个未被确认的未完成的小分组。在该分组的确认到达之前不能发送其他的小分组。

传输效率问题2:糊涂窗口综合症,当接收方的缓存已满的时候,交互应用程序一次只从缓存中读取一个字节(这时候缓存中腾出一个字节),然后向发送方发送确认信息,此时发送方再发送一个字节(收到的窗口大小为1),这样网络的效率很低。

解决:可以让接收方等待一段时间,使得接收缓存已有最够的空间容纳一个最长报文段,或者等到接收缓存已有一半的空间。只要这两种情况出现一种,就发送确认报文,同时发送方可以把数据积累成大的报文段发送

5.四种TCP计时器

http://blog.csdn.net/theone10211024/article/details/13016187

1)重传计时器

保证数据可靠传输的,带确认的重传机制

2)持久计时器

接收窗口“零窗口”状态,确认丢失,死锁,发送端周期探测报文

3)保活计时器

预防发收两端长时间空闲,服务器探测报文,判断客户端是否出现故障

4)时间等待计时器

四次挥手阶段,time-wait状态,2MSL,确定服务器端收到客户端的ack


6.socket 编程,服务器,客户端的基本流程

客户端

1)用socket函数创建一个socket套接字 

SOCKET sockClient=socket(AF_INET,SOCK_STREAM,0);

2)创建一个服务器的远程地址结构体

SOCKADDR_IN addrSrv;

3)connect客户端socket连接到服务方,使用远程地址;(发生三次握手)

 connect(sockClient,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));
4) 在套接字上使用 recv函数 接收数据,send函数发送数据;

int send( SOCKET s, const char FAR *buf, int len, int flags );

int recv( SOCKET s, char FAR *buf, int len, int flags);   

5)用closesocket函数关闭套接字socket

 closesocket(sockClient);

服务器:

1)socket函数创建一个服务器套接字

        SOCKET sockSrv=socket(AF_INET,SOCK_STREAM,0);

2)   bind socket 绑定到本地服务器地址; 
      SOCKADDR_IN addrSrv;
      bind(sockSrv,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));
3) listen 侦听 sock 套接字;
      listen(sockSrv,5);

4)accept函数接收客户方的连接,返回用于通信套接字;(发生于三次握手后)

      SOCKET sockConn=accept(sockSrv,(SOCKADDR*)&addrClient,&len);
5)在套接字上使用recv函数接收数据,send函数发送数据;
     send(sockConn,sendBuf,strlen(sendBuf)+1,0);
     recv(sockConn,recvBuf,100,0);
6)用closesocket函数关闭套接字sockSrv和SockConn;

7.tcp和udp的优缺点

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值