- 91 unsigned short get_new_socknum(struct proto *prot, unsigned short base)
- 92 {
- 93
- static int start=0;
- 94 /*
- 95 * Used to cycle through the port numbers so the
- 96 * chances of a confused connection drop.
- 97 */
- 98 int i, j;
- 99 int best = 0;
- 100 int size = 32767; /* a big num. */
- 101 struct sock *sk;
- 102 if (base == 0)
- 103 base = PROT_SOCK+1+(start % 1024);
- 104 if (base <= PROT_SOCK)
- 105 {
- 106 base += PROT_SOCK+(start % 1024);
- 107 }
- 108 /* Now look through the entire array and try to find an empty ptr. */
- 109 for(i=0; i < SOCK_ARRAY_SIZE; i++)
- 110 {
- j = 0;
- sk = prot->sock_array[(i+base+1) &(SOCK_ARRAY_SIZE -1)];
- while(sk != NULL)
- {
- sk = sk->next;
- j++;
- }
- if (j == 0)
- {
- start =(i+1+start )%1024;
- return(i+base+1);
- }
- if (j < size)
- {
- best = i;
- size = j;
- }
- while(sk_inuse(prot, base +best+1))
- {
- best += SOCK_ARRAY_SIZE;
- }
- return(best+base+1);
- } /*这里是找到一个端口号*/
复制代码- 后面inet_bind代码中,出现的这个
- static int inet_autobind(struct sock *sk){
- if (sk->sum == 0)
- {
- sk->num = get_num_socknum(sk->prot, 0);
- if (sk == 0)
- return (-EAGAIN);
- put_sk(sk->num, sk);
- sk->dummy_th.source = ntohs(sk->num); /对sock结构中tcphdr结构的dummy_th结构进行赋值,对原端口进行赋值,此dummy_th为了快速建立tcp头部。*/
- }
- return 0;
- }
复制代码但是通篇我没有看到,包内数据部分被变成
网络字节序?这步是从哪里完成的?
难道是memcpy_fromfs(skb->data + skb->len, from, copy);
这个函数在将数据从
用户空间复制到
内核空间时候,转换的字节序么?
回答:
?此回答先待定:找到答案了,在开发网络应用程序的时候,涉及到发送的部分数据时就已经将数据变成了网络字节序.
同样的,在接受到数据时,就默认的将网络字节序变成主机字节序.
这是默认的.
所以在
但是如果遇到这种情况会首先判断cpu的类型,如果本来就是大端,那么就不需要改变字节序。
好复杂.
—————————————————
在网络堆栈中,所以只会将端口等新建的信息改变字节序。
处理器 操作系统 字节排序
Alpha 全部 Little endian
HP-PA NT Little endian
HP-PA UNIX Big endian
Intelx86 全部 Little endian <-----x86系统是小端字节序系统
Motorola680x() 全部 Big endian
MIPS NT Little endian
MIPS UNIX Big endian
PowerPC NT Little endian
PowerPC 非NT Big endian <-----PPC系统是大端字节序系统
RS/6000 UNIX Big endian
SPARC UNIX Big endian
IXP1200 ARM核心 全部 Little endian
网络优先使用utf-8字符集。即使出现汉字编码格式,最后得用本地字符集(也就是类似应用程序)来解决编码问题。
因为接口,地址等并不是面向普通应用程序的,只能交给cpu处理,cpu只是按照自己的大小端格式进行处理,所以要进行本机到->网络字节序的转化。
为了统一,发送到网络上的字节序都是大端格式。这是因为powerpc处理器是大端处理,而这个处理器主导网络市场。
Endianness of Networking:网络协议的Endianness定义了数据在发送和接收时的byte和bit顺序。
这里介绍一个概念:wire address。
处于较低wire address的bit或者byte总是先于处于较高wire address的bit或byte被发送或者接收。
最后的差错检测,会在数据zhen后加上n bit位的 CRC检测码:这里才用bit 序转换,网卡有错误检测功能,假如出现了错误,就简单的抛弃数据。然后启动重传机制,否则就开始确认。
网卡一般来说和它所支持的网络协议保持相同的Endianness type,它可能与所在系统分别拥有不同的Endianness type。大部分网络协议是Big Endianness的.
以太网和802.3的硬件设备都是遵循上述的动作,对于它们来说byte和bit序正好是相反的。网卡需要对bit序列做出调整以符合它所在系统的bit序列,而对于byte序列的调整则需要系统自己来完成
看样子,bit序是由网卡决定的,但是byte序列调整是由系统完成的。具体完成的地点还不清楚。
阅读(1947) | 评论(0) | 转发(0) |