⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 46.htm

📁 unix高级编程原吗
💻 HTM
字号:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<title>CTerm非常精华下载</title>
</head>
<body bgcolor="#FFFFFF">
<table border="0" width="100%" cellspacing="0" cellpadding="0" height="577">
<tr><td width="32%" rowspan="3" height="123"><img src="DDl_back.jpg" width="300" height="129" alt="DDl_back.jpg"></td><td width="30%" background="DDl_back2.jpg" height="35"><p align="center"><a href="http://apue.dhs.org"><font face="黑体"><big><big>123</big></big></font></a></td></tr>
<tr>
<td width="68%" background="DDl_back2.jpg" height="44"><big><big><font face="黑体"><p align="center">               ● UNIX网络编程                       (BM: clown)                </font></big></big></td></tr>
<tr>
<td width="68%" height="44" bgcolor="#000000"><font face="黑体"><big><big><p   align="center"></big></big><a href="http://cterm.163.net"><img src="banner.gif" width="400" height="60" alt="banner.gif"border="0"></a></font></td>
</tr>
<tr><td width="100%" colspan="2" height="100" align="center" valign="top"><br><p align="center">[<a href="index.htm">回到开始</a>][<a href="19.htm">上一层</a>][<a href="47.htm">下一篇</a>]
<hr><p align="left"><small>  <br>

Linux网络编程--7. TCP/IP协议 <br>

http://linuxc.51.net 作者:hoyt (2001-05-08 11:22:40) <br>

    你也许听说过TCP/IP协议,那么你知道到底什么是TCP,什么是IP吗?在这一章里面,我 <br>

们一起来学习这个目前网络上用最广泛的协议. <br>

7.1 网络传输分层 <br>

如果你考过计算机等级考试,那么你就应该已经知道了网络传输分层这个概念.在网络上 <br>

,人们为了传输数据时的方便,把网络的传输分为7个层次.分别是:应用层,表示层,会话层 <br>

,传输层,网络层,数据链路层和物理层.分好了层以后,传输数据时,上一层如果要数据的 <br>

话,就可以直接向下一层要了,而不必要管数据传输的细节.下一层也只向它的上一层提供 <br>

数据,而不要去管其它东西了.如果你不想考试,你没有必要去记这些东西的.只要知道是 <br>

分层的,而且各层的作用不同. <br>

7.2 IP协议 <br>

IP协议是在网络层的协议.它主要完成数据包的发送作用. 下面这个表是IP4的数据包格 <br>

式 <br>

 0      4       8       16                      32 <br>

-------------------------------------------------- <br>

|版本   |首部长度|服务类型|    数据包总长       | <br>

-------------------------------------------------- <br>

|    标识                 |DF |MF| 碎片偏移      | <br>

-------------------------------------------------- <br>

|   生存时间    |  协议   |  首部较验和         | <br>

------------------------------------------------ <br>



|               源IP地址                        | <br>

------------------------------------------------ <br>

|               目的IP地址                      | <br>

------------------------------------------------- <br>

|               选项                            | <br>

================================================= <br>

|               数据                            | <br>

------------------------------------------------- <br>

下面我们看一看IP的结构定义 <br>

struct ip <br>

  { <br>

#if __BYTE_ORDER == __LITTLE_ENDIAN <br>

        unsigned int ip_hl:4;           /* header length */ <br>

        unsigned int ip_v:4;            /* version */ <br>

#endif <br>

#if __BYTE_ORDER == __BIG_ENDIAN <br>

        unsigned int ip_v:4;            /* version */ <br>

        unsigned int ip_hl:4;           /* header length */ <br>

#endif <br>

        u_int8_t ip_tos;                /* type of service */ <br>

        u_short ip_len;                 /* total length */ <br>

        u_short ip_id;                  /* identification */ <br>



        u_short ip_off;                 /* fragment offset field */ <br>

#define IP_RF 0x8000                    /* reserved fragment flag */ <br>

#define IP_DF 0x4000                    /* dont fragment flag */ <br>

#define IP_MF 0x2000                    /* more fragments flag */ <br>

#define IP_OFFMASK 0x1fff               /* mask for fragmenting bits */ <br>

        u_int8_t ip_ttl;                /* time to live */ <br>

        u_int8_t ip_p;                  /* protocol */ <br>

        u_short ip_sum;                 /* checksum */ <br>

        struct in_addr ip_src, ip_dst;  /* source and dest address */ <br>

  }; <br>

ip_vIP协议的版本号,这里是4,现在IPV6已经出来了 <br>

ip_hlIP包首部长度,这个值以4字节为单位.IP协议首部的固定长度为20个字节,如果IP包 <br>

没有选项,那么这个值为5. <br>

ip_tos服务类型,说明提供的优先权. <br>

ip_len说明IP数据的长度.以字节为单位. <br>

ip_id标识这个IP数据包. <br>

ip_off碎片偏移,这和上面ID一起用来重组碎片的. <br>

ip_ttl生存时间.没经过一个路由的时候减一,直到为0时被抛弃. <br>

ip_p协议,表示创建这个IP数据包的高层协议.如TCP,UDP协议. <br>

ip_sum首部校验和,提供对首部数据的校验. <br>

ip_src,ip_dst发送者和接收者的IP地址 <br>

关于IP协议的详细情况,请参考 RFC791 <br>



7.3 ICMP协议 <br>

ICMP是消息控制协议,也处于网络层.在网络上传递IP数据包时,如果发生了错误,那么就 <br>

会用ICMP协议来报告错误. <br>

ICMP包的结构如下: <br>

 0              8               16                              32 <br>

--------------------------------------------------------------------- <br>

|       类型    |       代码    |       校验和                  | <br>

-------------------------------------------------------------------- <br>

|               数据            |       数据                    | <br>

-------------------------------------------------------------------- <br>

ICMP在中的定义是 <br>

struct icmphdr <br>

{ <br>

  u_int8_t type;                /* message type */ <br>

  u_int8_t code;                /* type sub-code */ <br>

  u_int16_t checksum; <br>

  union <br>

  { <br>

    struct <br>

    { <br>

      u_int16_t id; <br>

      u_int16_t sequence; <br>



    } echo;                     /* echo datagram */ <br>

    u_int32_t   gateway;        /* gateway address */ <br>

    struct <br>

    { <br>

      u_int16_t __unused; <br>

      u_int16_t mtu; <br>

    } frag;                     /* path mtu discovery */ <br>

  } un; <br>

}; <br>

关于ICMP协议的详细情况可以查看 RFC792 <br>

7.4 UDP协议 <br>

UDP协议是建立在IP协议基础之上的,用在传输层的协议.UDP和IP协议一样是不可靠的数 <br>

据报服务.UDP的头格式为: <br>

 0                      16                      32 <br>

--------------------------------------------------- <br>

|       UDP源端口       |       UDP目的端口     | <br>

--------------------------------------------------- <br>

|       UDP数据报长度   |       UDP数据报校验   | <br>

--------------------------------------------------- <br>

UDP结构在中的定义为: <br>

struct udphdr { <br>

  u_int16_t     source; <br>



  u_int16_t     dest; <br>

  u_int16_t     len; <br>

  u_int16_t     check; <br>

}; <br>

关于UDP协议的详细情况,请参考 RFC768 <br>

7.5 TCP <br>

TCP协议也是建立在IP协议之上的,不过TCP协议是可靠的.按照顺序发送的.TCP的数据结 <br>

构比前面的结构都要复杂. <br>

0       4       8  10           16              24              32 <br>

------------------------------------------------------------------- <br>

|               源端口          |               目的端口        | <br>

------------------------------------------------------------------- <br>

|                               序列号                          | <br>

------------------------------------------------------------------ <br>

|                               确认号                          | <br>

------------------------------------------------------------------ <br>

|        |            |U|A|P|S|F|                               | <br>

|首部长度| 保留       |R|C|S|Y|I|       窗口                    | <br>

|        |            |G|K|H|N|N|                               | <br>

----------------------------------------------------------------- <br>

|               校验和          |               紧急指针        | <br>

----------------------------------------------------------------- <br>



|                       选项                    |    填充字节   | <br>

----------------------------------------------------------------- <br>

TCP的结构在中定义为: <br>

struct tcphdr <br>

  { <br>

    u_int16_t source; <br>

    u_int16_t dest; <br>

    u_int32_t seq; <br>

    u_int32_t ack_seq; <br>

#if __BYTE_ORDER == __LITTLE_ENDIAN <br>

    u_int16_t res1:4; <br>

    u_int16_t doff:4; <br>

    u_int16_t fin:1; <br>

    u_int16_t syn:1; <br>

    u_int16_t rst:1; <br>

    u_int16_t psh:1; <br>

    u_int16_t ack:1; <br>

    u_int16_t urg:1; <br>

    u_int16_t res2:2; <br>

#elif __BYTE_ORDER == __BIG_ENDIAN <br>

    u_int16_t doff:4; <br>

    u_int16_t res1:4; <br>



    u_int16_t res2:2; <br>

    u_int16_t urg:1; <br>

    u_int16_t ack:1; <br>

    u_int16_t psh:1; <br>

    u_int16_t rst:1; <br>

    u_int16_t syn:1; <br>

    u_int16_t fin:1; <br>

#endif <br>

    u_int16_t window; <br>

    u_int16_t check; <br>

    u_int16_t urg_prt; <br>

}; <br>

source发送TCP数据的源端口 <br>

dest接受TCP数据的目的端口 <br>

seq标识该TCP所包含的数据字节的开始序列号 <br>

ack_seq确认序列号,表示接受方下一次接受的数据序列号. <br>

doff数据首部长度.和IP协议一样,以4字节为单位.一般的时候为5 <br>

urg如果设置紧急数据指针,则该位为1 <br>

ack如果确认号正确,那么为1 <br>

psh如果设置为1,那么接收方收到数据后,立即交给上一层程序 <br>

rst为1的时候,表示请求重新连接 <br>

syn为1的时候,表示请求建立连接 <br>



fin为1的时候,表示亲戚关闭连接 <br>

window窗口,告诉接收者可以接收的大小 <br>

check对TCP数据进行较核 <br>

urg_ptr如果urg=1,那么指出紧急数据对于历史数据开始的序列号的偏移值 <br>

关于TCP协议的详细情况,请查看 RFC793 <br>

7.6 TCP连接的建立 <br>

TCP协议是一种可靠的连接,为了保证连接的可靠性,TCP的连接要分为几个步骤.我们把这 <br>

个连接过程称为"三次握手". <br>

下面我们从一个实例来分析建立连接的过程. <br>

第一步客户机向服务器发送一个TCP数据包,表示请求建立连接. 为此,客户端将数据包的 <br>

SYN位设置为1,并且设置序列号seq=1000(我们假设为1000). <br>

第二步服务器收到了数据包,并从SYN位为1知道这是一个建立请求的连接.于是服务器也 <br>

向客户端发送一个TCP数据包.因为是响应客户机的请求,于是服务器设置ACK为1,sak_se <br>

q=1001(1000+1)同时设置自己的序列号.seq=2000(我们假设为2000). <br>

第三步客户机收到了服务器的TCP,并从ACK为1和ack_seq=1001知道是从服务器来的确认 <br>

信息.于是客户机也向服务器发送确认信息.客户机设置ACK=1,和ack_seq=2001,seq=100 <br>

1,发送给服务器.至此客户端完成连接. <br>

最后一步服务器受到确认信息,也完成连接. <br>

通过上面几个步骤,一个TCP连接就建立了.当然在建立过程中可能出现错误,不过TCP协议 <br>

可以保证自己去处理错误的. <br>

  说一说其中的一种错误. <br>

  听说过DOS吗?(可不是操作系统啊).今年春节的时候,美国的五大网站一起受到攻击.攻 <br>



击者用的就是DOS(拒绝式服务)方式.概括的说一下原理. <br>

  客户机先进行第一个步骤.服务器收到后,进行第二个步骤.按照正常的TCP连接,客户机 <br>

应该进行第三个步骤. <br>

不过攻击者实际上并不进行第三个步骤.因为客户端在进行第一个步骤的时候,修改了自 <br>

己的IP地址,就是说将一个实际上不存在的IP填充在自己IP数据包的发送者的IP一栏.这 <br>

样因为服务器发的IP地址没有人接收,所以服务端会收不到第三个步骤的确认信号,这样 <br>

服务务端会在那边一直等待,直到超时. <br>

这样当有大量的客户发出请求后,服务端会有大量等待,直到所有的资源被用光,而不能再 <br>

接收客户机的请求. <br>

这样当正常的用户向服务器发出请求时,由于没有了资源而不能成功.于是就出现了春节 <br>

时所出现的情况. <br>

---------------------------------------------------------------------------- <br>

---- <br>

相关文章 关键词 <br>

Linux网络编程--6. 高级套接字函数 (2001-05-08 11:22:09) <br>

Linux网络编程--5. 用户数据报发送 (2001-05-08 11:21:31) <br>

Linux网络编程--4. 完整的读写函数 (2001-05-08 11:20:52) <br>

Linux网络编程--3. 服务器和客户机的信息函数 (2001-05-08 11:20:14) <br>

Linux网络编程--2. 初等网络函数介绍(TCP) (2001-05-08 11:19:34) <br>

Linux网络编程--1. Linux网络知识介绍 (2001-05-08 11:16:55) <br>

 樊强制作 欢迎分享 2001 <br>

  <br>

</small><hr>
<p align="center">[<a href="index.htm">回到开始</a>][<a href="19.htm">上一层</a>][<a href="47.htm">下一篇</a>]
<p align="center"><a href="http://cterm.163.net">欢迎访问Cterm主页</a></p>
</table>
</body>
</html>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -