关于TCP/IP数据包的小认识

       看了雷雨学姐的有关互联网协议知识的博文后,有一点小疑问,这个我们暂时不说,我们先来详解下基础知识,最后用我当时的问题结尾。

       发送数据包:

       一个数据包从发送端电脑发出的过程是从上层到底层硬件,层层向下,依次经过以下几层,而接收时正好相反,我们先说发送。


       应用层构造需要发送的数据,传输层在这个数据包前面加上一段TCP包头,网络层再在前面加上IP包头,链接层再在最前面加上MAC包头(也叫以太网包头)。如图




有人这时要问了,什么是包头,既然要写在数据前面,当然是用来识别数据的。其实不止如此,包头在不同层的作用不同,总之就是它是一个判断标识,决定了这个包是否是我本机需要的,它可以经过几次转发等等。我们马上分别解释不同层的包头。

       

       传输层:TCP包头 

       TCP包头正常占20字节(例外是因为任选字段,稍后说),里面内容可以用如下图来表示


还是有我来简要说明一下。

       源端口和目的端口:

每个TCP段都包含源端和目的端的端口号,用于寻找发起端和接收端应用进程。这两个值加上IP首部中的源IP地址和目的IP地址唯一确定一个TCP连接。有时,一个IP地址和一个端口号也称为一个套接字(socket)。看到这里明白了为什么套接字编程要指定IP地址和端口了。。。(注:IP协议包头,我们稍后说)

       序列号:

序列号用来标识从T C P发起端向T C P接收端发送的数据字节流,它表示在这个报文段中的第一个数据字节。如果将字节流看作在两个应用程序间的单向流动,则T C P用序列号对每个字节进行计数。序列号是32 bit的无符号数。


报文段:因主机、路由器和链路层交换机,每个包含了不同的层,反映了不同的功能。位于应用层的信息分组称为报文,运输层分组称为报文段。

                                                                                                                     ——百度百科


        头部长度:

(因为确认序列号要提到很多头部长度里的名词,所以先说这个)

头部长度给出首部中32 bit字的数目。需要这个值是因为任选字段的长度是可变的。这个 字段占4 bit,因此TCP最多有60字节的首部。然而,没有任选字段,正常的长度是20字节。  
URG:  紧急指针(urgent pointer)有效。  
ACK:  确认序号有效。 
PSH:  接收方应该尽快将这个报文段交给应用层。  
RST:  重建连接。  
SYN:  同步序号用来发起一个连接。  
FIN: 发端完成发送任务。

窗口大小:   TCP的流量控制由连接的每一端通过声明的窗口大小来提供。窗口大小为字节数,起始于确认序号字段指明的值,这个值是接收端正期望接收的字节。窗口大小是一个16 bit字段,因而窗口大小最大为65535字节。   

校验和:    检验和覆盖了整个的TCP报文段: TCP首部和TCP数据。这是一个强制性的字段,一定是由发端计算和存储,并由收端进行验证。TCP检验和的计算和UDP检验和的计算相似,使用一个伪头部。   

紧急指针:   只有当URG标志置1时紧急指针才有效。紧急指针是一个正的偏移量,和序号字段中的值相加表示紧急数据最后一个字节的序号。TCP的紧急方式是发送端向另一端发送紧急数据的一种方式。   

可选项: 
  最常见的可选字段是最长报文大小,又称为MSS (Maximum Segment Size)。每个连接方通常都在通信的第一个报文段(为建立连接而设置S Y N标志的那个段)中指明这个选项。它指明本端所能接收的最大长度的报文段。    T C P将用户数据打包构成报文段;它发送数据后启动一个定时器;另一端对收到的数据进行确认,对失序的数据重新排序,丢弃重复数据; TCP提供端到端的流量控制,并计算和 验证一个强制性的端到端检验和。

        

       确认序列号:

当建立一个新的连接时, SYN标志变1。序列号字段包含由这个主机选择的该连接的初始序号ISN(Initial Sequence Number)。该主机要发送数据的第一个字节序号为这个ISN加1,因为SYN标志消耗了一个序号(FIN标志也要占用一个序号)。既然每个传输的字节都被计数,确认序号包含发送确认的一端所期望收到的下一个序号。因此,确认序号应当是上次已成功收到数据字节序号加1。只有A C K标志为1时确认序号字段才有效。 
发送ACK无需任何代价,因为32 bit的确认序号字段和ACK标志一样,总是TCP首部的一部分。因此,我们看到一旦一个连接建立起来,这个字段总是被设置,ACK标志也总是被设置为1。

注:关于序列号和确认序列号例子详解,会让你对TCP三次握手四次挥手有深刻理解,网上有博客说的很好,我就不露怯了,上网址http://www.cnblogs.com/chenboo/archive/2011/12/19/2293327.html



上面只是我们抽象出来的概念,具体电脑间怎么处理呢,用wireshark抓包后提取出数据包头是这样的

全是16进制。。。



                网络层:IP包头


版本:哪种版本的IP协议,字段IPV4是4,IPV6是6

总长度:IP首部和数据总长度

生存期:网络上生存时间,每经过一个路由器就减1,为0时丢弃

协议:0x06表示TCP,0x11表示UDP

报头校验和:用于检查IP首部完整性,不校验数据

IP选项:可选字段,用于网络调试

(注:《linuxC编程实战》P285...)


           

         数据链路层:MAC包头

14个字节:存放源MAC地址和目的MAC地址

存放发送端的MAC地址,MAC地址是厂家烧在网卡上的标识,全球唯一,这与IP地址不同,一个很好的例子,说IP地址就如同一个职位,而MAC地址则是去应聘这个职位的人,职位既可以让甲坐,也可以让乙坐,同样的道理一个IP地址对于网卡是不做要求,基本上什么样的厂家都可以用,也就是说IP地址与MAC地址并不存在着绑定关系。


       但是你有没有想过,我的计算机第一次发送数据包,我的计算机只知道用户给我的目的IP地址,可是我还没有连接到目的计算机,怎么知道它那全球唯一的MAC地址呢,如果不知道,怎么能在数据链路层加包头呢,其实这里我们忽略了一个重要的东西,它叫ARP。

        

       ARP

       ARP(Address Resolution Protocol,地址解析协议)就是用来解决这个问题的。

       当我不知到目的MAC地址时,计算机会通过交换机、路由器向所在网络发送ARP请求(其中包含目的IP地址),当该网络中有计算机的IP地址与请求中的IP地址相同时就会回复自己的MAC地址给路由器,而其他计算机则会忽略请求。此时路由器把此IP地址和MAC地址对应关系存到自己的ARP缓存中,然后回发给我们的计算机。

      但是,当此IP不是该网络中的IP地址怎么办,比如我在西安,但我想给北京一台计算机发数据,那么路由器会把请求的MAC地址换成自己的MAC地址,把请求中的IP地址换成自己的网关IP地址,发送给上级路由器,层层转发,直到找到目的计算机。

注1:其实这里路由器有一套算法,它会自动发现相对最短的路由器转发路径,力争通过最少的路由器找到目的计算机

注2:这里说的ARP寻址仅限IPV4,由于它的局限性以及所谓ARP欺骗等等,在IPV6中已被ICMPv6协议替换(查自维基百科)


         如有错误指出,望指出,不胜感谢


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值