TCP/IP af_inet.c

1. 如果客户端connect前没有指定源端口号,系统自动分配一个并绑定。

 

/*
 *      Automatically bind an unbound socket.
 */

static int inet_autobind(struct sock *sk)
{
        /* We may need to bind the socket. */
        if (sk->num == 0)
        {
                sk->num = get_new_socknum(sk->prot, 0);
                if (sk->num == 0)
                        return(-EAGAIN);
                put_sock(sk->num, sk);
                sk->dummy_th.source = ntohs(sk->num);
        }
        return 0;
}

 

2. in function inet_create(),   拥塞窗口大小为1, 慢启动

 

sk->cong_window = 1; /* start with only sending one packet at a time. */

 

3. in function inet_dup(),

 

inet_dup 函数被服务器端调用。服务器端用于实际通信的套接字与其监听套接字是不同的。当应用程序在服务器端使用accept 函数接收一个客户端请求时,会创建一个新的套接字用于与客户端进行具体的数据通信, 而监听套接字仍然只负责监听其它客户端的请求。在sock_accept(accept 系统调用的BSD 层处理函数)在分配一个新的socket 结构后,调用inet_dup函数对此新创建的socket 结构进行初始化,而初始化信息主要来自监听套接字,inet_dup 函数的输入参数中newsock 即表示新创建的socket 结构,而oldsock 则表示监听套接字socket 结构。从inet_dup 实现来看,该函数调用inet_create 函数完成具体的功能:分配新socket 结构对应的下层sock 结构,此处只使用了监听socket 结构的protocol 字段。

 

4. 对于不同的协议使用相同的端口号不会引起任何问题.

 

5. 对于适用同一种协议的所有套接字都被插入到该协议对应proto(如tcp_prot)结构中sock_array 数组

 

6. 关于socket函数,

 

应用程序在使用套接字前,首先必须拥有一个套接字,系统调用socket()向应用程序提供创建套接字的手段,其调用格式如下:

SOCKET PASCAL FAR socket(int af, int type, int protocol);

该调用要接收三个参数:af、type、protocol。参数af指定通信发生的区域,:AF_UNIX、AF_INET、AF_NS等,而DOS、WINDOWS中仅支持AF_INET,它是网际网区域。因此,地址族与协议族相同。

 

reference: LINUX-2.4.0内核网络栈实现源代码分析

你可能感兴趣的:(socket,function,服务器,pascal,reference,代码分析)