Chinaunix首页 | 论坛 | 博客

分类: LINUX

2011-10-20 10:34:20

 
  1. 91 unsigned short get_new_socknum(struct proto *prot, unsigned short base)
  2. 92 {
  3. 93
  4. static int start=0;
  5. 94 /*
  6. 95 * Used to cycle through the port numbers so the
  7. 96 * chances of a confused connection drop.
  8. 97 */
  9. 98 int i, j;
  10. 99 int best = 0;
  11. 100 int size = 32767; /* a big num. */
  12. 101 struct sock *sk;
  13. 102 if (base == 0)
  14. 103 base = PROT_SOCK+1+(start % 1024);
  15. 104 if (base <= PROT_SOCK)
  16. 105 {
  17. 106 base += PROT_SOCK+(start % 1024);
  18. 107 }
  19. 108 /* Now look through the entire array and try to find an empty ptr. */
  20. 109 for(i=0; i < SOCK_ARRAY_SIZE; i++)
  21. 110 {
  22. j = 0;
  23. sk = prot->sock_array[(i+base+1) &(SOCK_ARRAY_SIZE -1)];
  24. while(sk != NULL)
  25. {
  26. sk = sk->next;
  27. j++;
  28. }
  29. if (j == 0)
  30. {
  31. start =(i+1+start )%1024;
  32. return(i+base+1);
  33. }
  34. if (j < size)
  35. {
  36. best = i;
  37. size = j;
  38. }
  39. while(sk_inuse(prot, base +best+1))
  40. {
  41. best += SOCK_ARRAY_SIZE;
  42. }
  43. return(best+base+1);
  44. }  /*这里是找到一个端口号*/
复制代码
  1. 后面inet_bind代码中,出现的这个
  2. static int inet_autobind(struct sock *sk){
  3. if (sk->sum == 0)
  4. {
  5.   sk->num = get_num_socknum(sk->prot, 0);
  6.   if (sk == 0)
  7.    return (-EAGAIN);
  8.   put_sk(sk->num, sk);
  9. sk->dummy_th.source = ntohs(sk->num); /对sock结构中tcphdr结构的dummy_th结构进行赋值,对原端口进行赋值,此dummy_th为了快速建立tcp头部。*/
  10.   }
  11. return 0;
  12. }
复制代码
但是通篇我没有看到,包内数据部分被变成网络字节序?这步是从哪里完成的?
难道是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序列调整是由系统完成的。具体完成的地点还不清楚。
阅读(1906) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~