1、TCP连接的建立
TCP协议是一种可靠的连接,为了保证连接的可靠性,TCP的连接要分为几个步骤.我们把这个连接过程称为"三次握手".下面我们从一个实例来分析建立连接的过程.
第一步客户机向服务器发送一个TCP数据包,表示请求建立连接. 为此,客户端将数据包的SYN位设置为1, 并且设置序列号seq=1000(我们假设为1000).
第二步服务器收到了数据包,并从SYN位为1(syn为1的时候,表示请求建立连接)知道这是一个建立请求的连接.于是服务器也向客户端发送一个TCP数据包. 因为是响应客户机的请求, 于是服务器设置ACK为1,sak_seq=1001(1000+1)同时设置自己的序列号.seq=2000(我们假设为2000).(ack_seq确认序列号,表示接受方下一次接受的数据序列号. )
第三步客户机收到了服务器的TCP,并从ACK为1和ack_seq=1001知道是从服务器来的确认信息.于是客户机也向服务器发送确认信息. 客户机设置ACK=1,和ack_seq=2001,seq=1001,发送给服务器.至此客户端完成连接.(ack如果确认号正确,那么为1 )
最后一步服务器受到确认信息,也完成连接.
通过上面几个步骤,一个TCP连接就建立了.当然在建立过程中可能出现错误,不过TCP协议可以保证自己去处理错误的. 说一说其中的一种错误. 听说过DOS吗?(可不是操作系统啊).之前,美国的五大网站一起受到攻击.攻击者用的就是DOS(拒绝式服务)方式. 概括的说一下原理.客户机先进行第一个步骤.服务器收到后,进行第二个步骤.按照正常的TCP连接,客户机应该进行第三个步骤. 不过攻击者实际上并不进行第三个步骤.因为客户端在进行第一个步骤的时候,修改了自己的IP地址,就是说将一个实际上不存在的 IP填充在自己IP 数据包的发送者的IP一栏.这样因为服务器发的IP地址没有人接收,所以服务端会收不到第三个步骤的确认信号, 这样服务务端会在那边一直等待,直到超时.这样当有大量的客户发出请求后,服务端会有大量等待,直到所有的资源被用光, 而不能再接收客户机的请求.这样当正常的用户向服务器发出请求时,由于没有了资源而不能成功. 于是就出现了这种情况.
2、线程 创建线程成功后,新创建的线程则运行参数三和参数四确定的函数,原来的线程则继续运行下一行代码。
互斥锁用来保证一段时间内只有一个线程在执行一段代码。 pthread_mutex_lock声明开始用互斥锁上锁,此后的代码直至调用pthread_mutex_unlock为止,均被上锁,即同一时间只能被一个 线程调用执行。当一个线程执行到pthread_mutex_lock处时,如果该锁此时被另一个线程使用,那此线程被阻塞,即程序将等待到 另一个线程释放此互斥锁。
pthread_join一般是主线程来调用,用来等待子线程退出,因为是等待,所以是阻塞的,一般主线程会依次join所有它创建的子线程。 pthread_exit一般是子线程调用,用来结束当前线程。 子线程可以通过pthread_exit传递一个返回值,而主线程通过pthread_join获得该返回值,从而判断该子线程的退出是正常还是异常。
|