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内核网络栈实现源代码分析