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

📄 linux网络编程--7. tcpip协议.html

📁 Linux网络编程
💻 HTML
📖 第 1 页 / 共 2 页
字号:
</tr><td align=center><table border="0" width="80%"  cellspacing="0" cellpadding="0" align=center><tr><td valign=top><font color=#cccccc>
<br>&nbsp;&nbsp;&nbsp;&nbsp;你也许听说过TCP/IP协议,那么你知道到底什么是TCP,什么是IP吗?在这一章里面,我们一起来学习这个目前网络上用最广泛的协议.&nbsp;
<br>
<br>
<br>7.1&nbsp;网络传输分层&nbsp;
<br>如果你考过计算机等级考试,那么你就应该已经知道了网络传输分层这个概念.在网络上,人们为了传输数据时的方便,把网络的传输分为7个层次.分别是:应用层,表示层,会话层,传输层,网络层,数据链路层和物理层.分好了层以后,传输数据时,上一层如果要数据的话,就可以直接向下一层要了,而不必要管数据传输的细节.下一层也只向它的上一层提供数据,而不要去管其它东西了.如果你不想考试,你没有必要去记这些东西的.只要知道是分层的,而且各层的作用不同.&nbsp;
<br>
<br>7.2&nbsp;IP协议&nbsp;
<br>IP协议是在网络层的协议.它主要完成数据包的发送作用.&nbsp;下面这个表是IP4的数据包格式&nbsp;
<br>
<br>&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;8&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;16&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;32
<br>--------------------------------------------------
<br>|版本&nbsp;&nbsp;&nbsp;|首部长度|服务类型|&nbsp;&nbsp;&nbsp;&nbsp;数据包总长&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|
<br>--------------------------------------------------
<br>|&nbsp;&nbsp;&nbsp;&nbsp;标识&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|DF&nbsp;|MF|&nbsp;碎片偏移&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|
<br>--------------------------------------------------
<br>|&nbsp;&nbsp;&nbsp;生存时间&nbsp;&nbsp;&nbsp;&nbsp;|&nbsp;&nbsp;协议&nbsp;&nbsp;&nbsp;|&nbsp;&nbsp;首部较验和&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|
<br>------------------------------------------------
<br>|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;源IP地址&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|
<br>------------------------------------------------
<br>|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;目的IP地址&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|
<br>-------------------------------------------------
<br>|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;选项&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|
<br>=================================================
<br>|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;数据&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|
<br>-------------------------------------------------&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<br>
<br>下面我们看一看IP的结构定义<netinet/ip.h>&nbsp;
<br>
<br>struct&nbsp;ip
<br>&nbsp;&nbsp;{
<br>#if&nbsp;__BYTE_ORDER&nbsp;==&nbsp;__LITTLE_ENDIAN
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;int&nbsp;ip_hl:4;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;header&nbsp;length&nbsp;*/
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;int&nbsp;ip_v:4;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;version&nbsp;*/
<br>#endif
<br>#if&nbsp;__BYTE_ORDER&nbsp;==&nbsp;__BIG_ENDIAN
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;int&nbsp;ip_v:4;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;version&nbsp;*/
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;int&nbsp;ip_hl:4;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;header&nbsp;length&nbsp;*/
<br>#endif
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;u_int8_t&nbsp;ip_tos;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;type&nbsp;of&nbsp;service&nbsp;*/
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;u_short&nbsp;ip_len;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;total&nbsp;length&nbsp;*/
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;u_short&nbsp;ip_id;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;identification&nbsp;*/
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;u_short&nbsp;ip_off;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;fragment&nbsp;offset&nbsp;field&nbsp;*/
<br>#define&nbsp;IP_RF&nbsp;0x8000&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;reserved&nbsp;fragment&nbsp;flag&nbsp;*/
<br>#define&nbsp;IP_DF&nbsp;0x4000&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;dont&nbsp;fragment&nbsp;flag&nbsp;*/
<br>#define&nbsp;IP_MF&nbsp;0x2000&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;more&nbsp;fragments&nbsp;flag&nbsp;*/
<br>#define&nbsp;IP_OFFMASK&nbsp;0x1fff&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;mask&nbsp;for&nbsp;fragmenting&nbsp;bits&nbsp;*/
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;u_int8_t&nbsp;ip_ttl;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;time&nbsp;to&nbsp;live&nbsp;*/
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;u_int8_t&nbsp;ip_p;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;protocol&nbsp;*/
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;u_short&nbsp;ip_sum;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;checksum&nbsp;*/
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;struct&nbsp;in_addr&nbsp;ip_src,&nbsp;ip_dst;&nbsp;&nbsp;/*&nbsp;source&nbsp;and&nbsp;dest&nbsp;address&nbsp;*/
<br>&nbsp;&nbsp;};
<br>
<br>ip_vIP协议的版本号,这里是4,现在IPV6已经出来了&nbsp;
<br>
<br>ip_hlIP包首部长度,这个值以4字节为单位.IP协议首部的固定长度为20个字节,如果IP包没有选项,那么这个值为5.&nbsp;
<br>
<br>ip_tos服务类型,说明提供的优先权.&nbsp;
<br>
<br>ip_len说明IP数据的长度.以字节为单位.&nbsp;
<br>
<br>ip_id标识这个IP数据包.&nbsp;
<br>
<br>ip_off碎片偏移,这和上面ID一起用来重组碎片的.&nbsp;
<br>
<br>ip_ttl生存时间.没经过一个路由的时候减一,直到为0时被抛弃.&nbsp;
<br>
<br>ip_p协议,表示创建这个IP数据包的高层协议.如TCP,UDP协议.&nbsp;
<br>
<br>ip_sum首部校验和,提供对首部数据的校验.&nbsp;
<br>
<br>ip_src,ip_dst发送者和接收者的IP地址&nbsp;
<br>
<br>关于IP协议的详细情况,请参考&nbsp;RFC791
<br>
<br>7.3&nbsp;ICMP协议&nbsp;
<br>ICMP是消息控制协议,也处于网络层.在网络上传递IP数据包时,如果发生了错误,那么就会用ICMP协议来报告错误.&nbsp;
<br>
<br>ICMP包的结构如下:&nbsp;
<br>
<br>&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;8&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;16&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;32
<br>---------------------------------------------------------------------
<br>|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;类型&nbsp;&nbsp;&nbsp;&nbsp;|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;代码&nbsp;&nbsp;&nbsp;&nbsp;|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;校验和&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|
<br>--------------------------------------------------------------------
<br>|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;数据&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;数据&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|
<br>--------------------------------------------------------------------
<br>
<br>ICMP在<netinet/ip_icmp.h>中的定义是&nbsp;
<br>struct&nbsp;icmphdr
<br>{
<br>&nbsp;&nbsp;u_int8_t&nbsp;type;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;message&nbsp;type&nbsp;*/
<br>&nbsp;&nbsp;u_int8_t&nbsp;code;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;type&nbsp;sub-code&nbsp;*/
<br>&nbsp;&nbsp;u_int16_t&nbsp;checksum;
<br>&nbsp;&nbsp;union
<br>&nbsp;&nbsp;{
<br>&nbsp;&nbsp;&nbsp;&nbsp;struct
<br>&nbsp;&nbsp;&nbsp;&nbsp;{
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;u_int16_t&nbsp;id;
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;u_int16_t&nbsp;sequence;
<br>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;echo;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;echo&nbsp;datagram&nbsp;*/
<br>&nbsp;&nbsp;&nbsp;&nbsp;u_int32_t&nbsp;&nbsp;&nbsp;gateway;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;gateway&nbsp;address&nbsp;*/
<br>&nbsp;&nbsp;&nbsp;&nbsp;struct
<br>&nbsp;&nbsp;&nbsp;&nbsp;{
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;u_int16_t&nbsp;__unused;
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;u_int16_t&nbsp;mtu;
<br>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;frag;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;path&nbsp;mtu&nbsp;discovery&nbsp;*/
<br>&nbsp;&nbsp;}&nbsp;un;
<br>};
<br>
<br>关于ICMP协议的详细情况可以查看&nbsp;RFC792
<br>
<br>7.4&nbsp;UDP协议&nbsp;
<br>UDP协议是建立在IP协议基础之上的,用在传输层的协议.UDP和IP协议一样是不可靠的数据报服务.UDP的头格式为:&nbsp;
<br>
<br>
<br>&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;16&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;32
<br>---------------------------------------------------
<br>|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;UDP源端口&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;UDP目的端口&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|
<br>---------------------------------------------------
<br>|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;UDP数据报长度&nbsp;&nbsp;&nbsp;|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;UDP数据报校验&nbsp;&nbsp;&nbsp;|
<br>---------------------------------------------------
<br>
<br>UDP结构在<netinet/udp.h>中的定义为:&nbsp;
<br>struct&nbsp;udphdr&nbsp;{
<br>&nbsp;&nbsp;u_int16_t&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;source;
<br>&nbsp;&nbsp;u_int16_t&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dest;
<br>&nbsp;&nbsp;u_int16_t&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;len;
<br>&nbsp;&nbsp;u_int16_t&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;check;
<br>};
<br>
<br>关于UDP协议的详细情况,请参考&nbsp;RFC768
<br>7.5&nbsp;TCP&nbsp;
<br>TCP协议也是建立在IP协议之上的,不过TCP协议是可靠的.按照顺序发送的.TCP的数据结构比前面的结构都要复杂.&nbsp;
<br>
<br>0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;8&nbsp;&nbsp;10&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;16&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;24&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;32
<br>-------------------------------------------------------------------
<br>|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;源端口&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;目的端口&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|
<br>-------------------------------------------------------------------
<br>|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;序列号&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|
<br>------------------------------------------------------------------
<br>|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;确认号&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|
<br>------------------------------------------------------------------
<br>|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|U|A|P|S|F|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|
<br>|首部长度|&nbsp;保留&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|R|C|S|Y|I|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;窗口&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|
<br>|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|G|K|H|N|N|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|
<br>-----------------------------------------------------------------
<br>|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;校验和&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;紧急指针&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|
<br>-----------------------------------------------------------------
<br>|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;选项&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|&nbsp;&nbsp;&nbsp;&nbsp;填充字节&nbsp;&nbsp;&nbsp;|
<br>-----------------------------------------------------------------
<br>
<br>TCP的结构在<netinet/tcp.h>中定义为:&nbsp;
<br>struct&nbsp;tcphdr
<br>&nbsp;&nbsp;{
<br>&nbsp;&nbsp;&nbsp;&nbsp;u_int16_t&nbsp;source;
<br>&nbsp;&nbsp;&nbsp;&nbsp;u_int16_t&nbsp;dest;
<br>&nbsp;&nbsp;&nbsp;&nbsp;u_int32_t&nbsp;seq;
<br>&nbsp;&nbsp;&nbsp;&nbsp;u_int32_t&nbsp;ack_seq;
<br>#if&nbsp;__BYTE_ORDER&nbsp;==&nbsp;__LITTLE_ENDIAN
<br>&nbsp;&nbsp;&nbsp;&nbsp;u_int16_t&nbsp;res1:4;
<br>&nbsp;&nbsp;&nbsp;&nbsp;u_int16_t&nbsp;doff:4;
<br>&nbsp;&nbsp;&nbsp;&nbsp;u_int16_t&nbsp;fin:1;
<br>&nbsp;&nbsp;&nbsp;&nbsp;u_int16_t&nbsp;syn:1;
<br>&nbsp;&nbsp;&nbsp;&nbsp;u_int16_t&nbsp;rst:1;
<br>&nbsp;&nbsp;&nbsp;&nbsp;u_int16_t&nbsp;psh:1;
<br>&nbsp;&nbsp;&nbsp;&nbsp;u_int16_t&nbsp;ack:1;
<br>&nbsp;&nbsp;&nbsp;&nbsp;u_int16_t&nbsp;urg:1;
<br>&nbsp;&nbsp;&nbsp;&nbsp;u_int16_t&nbsp;res2:2;
<br>#elif&nbsp;__BYTE_ORDER&nbsp;==&nbsp;__BIG_ENDIAN
<br>&nbsp;&nbsp;&nbsp;&nbsp;u_int16_t&nbsp;doff:4;
<br>&nbsp;&nbsp;&nbsp;&nbsp;u_int16_t&nbsp;res1:4;
<br>&nbsp;&nbsp;&nbsp;&nbsp;u_int16_t&nbsp;res2:2;
<br>&nbsp;&nbsp;&nbsp;&nbsp;u_int16_t&nbsp;urg:1;
<br>&nbsp;&nbsp;&nbsp;&nbsp;u_int16_t&nbsp;ack:1;
<br>&nbsp;&nbsp;&nbsp;&nbsp;u_int16_t&nbsp;psh:1;
<br>&nbsp;&nbsp;&nbsp;&nbsp;u_int16_t&nbsp;rst:1;
<br>&nbsp;&nbsp;&nbsp;&nbsp;u_int16_t&nbsp;syn:1;
<br>&nbsp;&nbsp;&nbsp;&nbsp;u_int16_t&nbsp;fin:1;
<br>#endif
<br>&nbsp;&nbsp;&nbsp;&nbsp;u_int16_t&nbsp;window;
<br>&nbsp;&nbsp;&nbsp;&nbsp;u_int16_t&nbsp;check;
<br>&nbsp;&nbsp;&nbsp;&nbsp;u_int16_t&nbsp;urg_prt;
<br>};&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<br>
<br>source发送TCP数据的源端口&nbsp;
<br>dest接受TCP数据的目的端口&nbsp;
<br>
<br>seq标识该TCP所包含的数据字节的开始序列号&nbsp;
<br>
<br>ack_seq确认序列号,表示接受方下一次接受的数据序列号.&nbsp;
<br>
<br>doff数据首部长度.和IP协议一样,以4字节为单位.一般的时候为5&nbsp;
<br>
<br>urg如果设置紧急数据指针,则该位为1&nbsp;
<br>
<br>ack如果确认号正确,那么为1&nbsp;
<br>
<br>psh如果设置为1,那么接收方收到数据后,立即交给上一层程序&nbsp;
<br>
<br>rst为1的时候,表示请求重新连接&nbsp;
<br>
<br>syn为1的时候,表示请求建立连接&nbsp;
<br>
<br>fin为1的时候,表示亲戚关闭连接&nbsp;
<br>
<br>window窗口,告诉接收者可以接收的大小&nbsp;
<br>
<br>check对TCP数据进行较核&nbsp;
<br>
<br>urg_ptr如果urg=1,那么指出紧急数据对于历史数据开始的序列号的偏移值&nbsp;
<br>
<br>关于TCP协议的详细情况,请查看&nbsp;RFC793
<br>
<br>
<br>7.6&nbsp;TCP连接的建立&nbsp;
<br>TCP协议是一种可靠的连接,为了保证连接的可靠性,TCP的连接要分为几个步骤.我们把这个连接过程称为"三次握手".&nbsp;
<br>
<br>下面我们从一个实例来分析建立连接的过程.&nbsp;
<br>
<br>第一步客户机向服务器发送一个TCP数据包,表示请求建立连接.&nbsp;为此,客户端将数据包的SYN位设置为1,并且设置序列号seq=1000(我们假设为1000).&nbsp;
<br>
<br>第二步服务器收到了数据包,并从SYN位为1知道这是一个建立请求的连接.于是服务器也向客户端发送一个TCP数据包.因为是响应客户机的请求,于是服务器设置ACK为1,sak_seq=1001(1000+1)同时设置自己的序列号.seq=2000(我们假设为2000).&nbsp;
<br>
<br>第三步客户机收到了服务器的TCP,并从ACK为1和ack_seq=1001知道是从服务器来的确认信息.于是客户机也向服务器发送确认信息.客户机设置ACK=1,和ack_seq=2001,seq=1001,发送给服务器.至此客户端完成连接.&nbsp;
<br>
<br>最后一步服务器受到确认信息,也完成连接.&nbsp;
<br>
<br>通过上面几个步骤,一个TCP连接就建立了.当然在建立过程中可能出现错误,不过TCP协议可以保证自己去处理错误的.&nbsp;
<br>
<br>
<br>&nbsp;&nbsp;说一说其中的一种错误.
<br>&nbsp;&nbsp;听说过DOS吗?(可不是操作系统啊).今年春节的时候,美国的五大网站一起受到攻击.攻击者用的就是DOS(拒绝式服务)方式.概括的说一下原理.
<br>&nbsp;&nbsp;客户机先进行第一个步骤.服务器收到后,进行第二个步骤.按照正常的TCP连接,客户机应该进行第三个步骤.
<br>不过攻击者实际上并不进行第三个步骤.因为客户端在进行第一个步骤的时候,修改了自己的IP地址,就是说将一个实际上不存在的IP填充在自己IP数据包的发送者的IP一栏.这样因为服务器发的IP地址没有人接收,所以服务端会收不到第三个步骤的确认信号,这样服务务端会在那边一直等待,直到超时.
<br>这样当有大量的客户发出请求后,服务端会有大量等待,直到所有的资源被用光,而不能再接收客户机的请求.
<br>这样当正常的用户向服务器发出请求时,由于没有了资源而不能成功.于是就出现了春节时所出现的情况.
<br></font></td></tr><tr><td><hr></td></tr><form method=post action=/cgi-bin/find.cgi><tr><td><b>相关文章</b>  关键词 <input type=text name=key value='Linux网络编程'> <input type=submit value=搜索></td></tr></form><tr><td><a href=/a4/b7/20010508/112209.html>Linux网络编程--6. 高级套接字函数</a> <small>(2001-05-08 11:22:09)</small></font><br><a href=/a4/b7/20010508/112131.html>Linux网络编程--5. 用户数据报发送</a> <small>(2001-05-08 11:21:31)</small></font><br><a href=/a4/b7/20010508/112052.html>Linux网络编程--4. 完整的读写函数</a> <small>(2001-05-08 11:20:52)</small></font><br><a href=/a4/b7/20010508/112014.html>Linux网络编程--3. 服务器和客户机的信息函数</a> <small>(2001-05-08 11:20:14)</small></font><br><a href=/a4/b7/20010508/111934.html>Linux网络编程--2. 初等网络函数介绍(TCP)</a> <small>(2001-05-08 11:19:34)</small></font><br><a href=/a4/b7/20010508/111655.html>Linux网络编程--1. Linux网络知识介绍</a> <small>(2001-05-08 11:16:55)</small></font><br></td></tr><tr><td>&nbsp;</td></tr></table></td></tr><tr>  <td width="100%" height="2" colspan="5" bgcolor="#D09F0D"><img src="/images/c.gif" width=1 height=1></td> </tr><tr>    <td width="100%" height="40" colspan="5" valign=top><p align="center"><font color=#ffffff>&copy; &nbsp;&nbsp;樊强制作 欢迎分享 2001 </font></p></td>  </tr></table></center></div><img src="/cgi-bin/pagehit.cgi?filename=a4/b7/20010508/112240.html" width=1 height=1></body></html>

⌨️ 快捷键说明

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