网络一些问题

  1. connect方法会阻塞,请问有什么方法可以避免其长时间阻塞?

    当在一个非阻塞的TCP套接字上调用connect时,connect将立即返回一个EINPROGRESS错误,不过已经发起的TCP三路握手继续进行。然后用select检测连接是否成功。给select设置超时值,就可以避免长时间阻塞。

    非阻塞connect有三个用途:

    (1)在三路握手期间,可以做其他操作。

    (2)同时建立多个连接。这个用途已随着Web浏览器流行起来。

    (3)缩短connect的超时,避免长时间阻塞。

    select+非阻塞connect:两个规则:(1)当连接成功建立时,描述符可写(2)当连接建立遇到错误时,描述符变为既可读又可写。  

    所以可以用getsockopt查看是否connect出错。

  2. 网络中,如果客户端突然掉线或者重启,服务器端怎么样才能立刻知道?

    如果server用select,客户重启,进程结束时发送FIN,server可读,读取长度为0 。

    如果客户端突然掉线,不会发送FIN,服务器需要主动发送数据才能知道。

  3. TTL是什么?有什么用处,通常那些工具会用到它?(ping? traceroute? ifconfig? netstat?)

    TTL(time to live)生存时间字段(8位,在IP首部)设置了ip数据报可以经过的最多路由器数。TTL的初始值由主机设置,一旦经过一个处理它的路由器,它的值减去1。当该字段的值为0时,数据报就被丢弃,并发送ICMP报文通知源主机。

    TTL字段的用处:目的是防止数据报在选路时无休止地在网络中流动。(例如,当路由器瘫痪或者两个路由器之间连接丢失,选路协议有时会检测丢失的路由并一直进行下去。)

    Traceroute会用到TTL,当路由器接收IP数据报中的TTL是1或者0,不转发,丢弃后给信源发ICMP“超时”信息。包含这份ICMP信息的IP报文的信源地址是该路由器的IP地址。当Traceroute发送TTL为1的IP数据报,得到第一个路由器的地址,发送TTL为2则得到第二个路由器地址,最后IP数据报到达目的主机时,由于Tracerout发送的UDP数据报中的端口选择了一个不可能的值,使得目的主机的UDP模块产生一份“端口不可达”错误的ICMP报文,Tracerout收到后结束。

  4. 路由表示做什么用的?在linux环境中怎么来配置一条默认路由?

    路由表是用来决定如何将包从一个子网传送到另一个子网的。在Linux上可以用 “route add  default gw <默认路由器IP>”来配置一条默认路由。

  5. 在网络中有两台主机A和B,并通过路由器和其他交换设备连接起来,已经确认物理连接正确无误,怎么来测试这两台机器是否连通?如果不通,怎么来判断故障点?怎么排除故障?

    从一台机器ping另一台机器,测试是否连通。若ping不通,用traceroute可以确定是哪个路由器不能连通,然后再找问题是在交换设备、hup、cable等。

  6. deamon进程如何实现?

    关于deamon进程:deamon进程,也就是守护进程,是在UNIX后台运行不受终端控制的进程。守护进程常常在系统引导装入时启动,系统关闭时终止。由于没有控制终端,syslog函数是输出消息的标准方式。守护进程通过读取环境变量而获得配置信息。

    守护进程的创建,首先调用fork,为避免挂起控制终端,将守护进程放入后台执行。调用setsid函数脱离控制终端,登录会话和进程组,使该进程成为无终端的会话组长。通过不让进程成为会话组长来禁止进程重新打开控制终端,这就需要第二次调用fork,父进程(会话组长)退出,子进程继续执行,并不再拥有打开控制终端的能力。

    // unistd.h  syslog.h  signal.h  fcntl.h
    int deamon_init(const char *pname,int facility)
    {
        int i;   int deamon_proc;   pid_t pid;
        if((pid = fork())<0)
            return -1;
        else if(pid)
            exit(0);
        if(setsid()<0)
            return -1;
        signal(SIGHUP,SIG_IGN);
        if((pid = fork())<0)
            return -1;
        else if(pid)
            exit(0);
        daemon_proc = 1;
        chdir("/"); //改变工作路径
        for(i=0;i<64;i++)
            close(i);
        open("/dev/null",O_RDONLY);
        open("/dev/null",O_RDWR);
        open("/dev/null",O_RDWR);
        openlog(pname,LOG_PID,facility);
        return 0;
    }
  7. 用UDP协议通讯时怎样得知目标机是否获得了数据包

    可以在每个数据包中插入一个唯一的ID,比如timestamp或者递增的int。

    发送方在发送数据时将此ID和发送时间记录在本地。

    接收方在收到数据后将ID再发给发送方作为回应。

    发送方如果收到回应,则知道接收方已经收到相应的数据包;如果在指定时间内没有收到回应,则数据包可能丢失,需要重复上面的过程重新发送一次,直到确定对方收到。

posted @ 2013-02-19 23:16  wongzawing  阅读(396)  评论(0编辑  收藏  举报