基础网络概念(五)TCP/IP传输层相关封包与数据、TCP三次握手

声明:本文为笔者复习计算机网络相关知识时的摘录,文章中的图片及语句均出自《鸟哥的Linux私房菜》,这里仅作为整理自用。

喜欢鸟哥文章的朋友可以到鸟哥的主页查看:http://linux.vbird.org/


TCP/IP 的传输层相关封包与数据
网络层的 IP 封包只负责将数据送到正确的目标主机去,但 这个封包到底会不会被接受,或者是有没有被正确的接收,  那就不是 IP 的任务啦!那是传送层的任务之一。

2.4.1 可靠联机的 TCP 协议
在网络层的 IP 之上则是传送层,而传送层的数据 打包成什么? 最常见的就是 TCP 封包了。这个 TCP 封包数据必须要能够放到 IP 的 数据袋当中才行!将 MAC, IP 与 TCP 的封包数 据这样看:


想当然尔,TCP 也有表头数据来记录该封包的相关信息啰?没错啦~ TCP 封包的 表头是长这个样子的:



上图就是一个 TCP 封包的表头数据,各个项目 以 Source Port, Destination Port  及 Code 算是比较重要的项目。

Source Port & Destination Port (来源端口 & 目标端口) 什么是埠口(port)?我们知道 IP 封包的传送主要是藉由 IP 地址连接两端, 但是到底这个联机的通道是连接到哪里去呢?没错!就是连接到 port 上头啦! 举例来说,鸟哥的网站有开放 WWW 服务器,这表示鸟站的主机必须要启动一个 可以让 client 端连接的端口,这个端口就是 port (中文翻译成为埠口)。同样 的,客户端想要连接到鸟哥的鸟站时,就必须要在 client 主机上面启动一个 port ,这样这两个主机才能够利用这条『通道』来传递封包数据喔!这个目标 与来源 port 的纪录,可以说是 TCP 封包上最重要的参数了!

Code (Control Flag, 控制标志码)
当我们在进行网络联机的时候,必须要说明这个联机的状态,好让接收端了解这 个封包的主要动作。  这可是一个非常重要的句柄喔!这个字段共有 6 个 bits , 分别代表 6 个句柄,若为 1 则为启动。分别说明如下: 
URG(Urgent):若为 1 则代表该封包为紧急封包, 接收端应该要紧 急处理,且图 2.4-1 当中的 Urgent Pointer 字段也会被启用。
o    ACK(Acknowledge):若为 1 代表这个封包为响应封包,  则与上面提 到的 Acknowledge Number 有关。
o    PSH(Push function):若为 1 时,代表要求对方立即传送缓冲区内 的其他对应封包,而无须等待缓冲区满了才送。 
o    RST(Reset):如果 RST 为 1 的时候,表示联机会被马上结束,而无 需等待终止确认手续。这也就是说, 这是个强制结束的联机,且发送端 已断线。
o    SYN(Synchronous):若为 1,表示发送端希望双方建立同步处理,  也 就是要求建立联机。通常带有 SYN 标志的封包表示『主动』要连接到对 方的意思。
o    FIN(Finish):若为 1 ,表示传送结束,所以通知对方数据传毕,  是 否同意断线,只是发送者还在等待对方的响应而已。

其实每个项目都很重要,不过我们这里仅对 ACK/SYN 有兴趣而已,这样未来在谈到防火墙的时候,你才会比较清楚为啥每个 TCP 封包都有所谓的『状态』条件!那就是因为联机方向的不同所致啊


通讯端口口
在上图的 TCP 表头数据中,最重要的就属那 16 位的两个咚咚,亦即来源与目标 的端口口。由于是 16 位,因此目标与来源端口口最大可达 65535 号 (2 的 16 次方)! 那这个埠口有什么用途呢?上面稍微提到过,网络是双向的,服务器与客户端要达成联 机的话, 两边应该要有一个对应的埠口来达成联机信道,好让数据可以透过这个信道 来进行沟通。
那么这个埠口怎么打开呢?就是透过程序的执行!举例来说,鸟哥的网站上,必须 要启动一个 WWW 服务器软件, 这个服务器软件会主动的唤起 port 80 来等待客户端 的联机。你想要看我网站上的数据,就得要利用浏览器, 填入网址,然后浏览器也会 启动一个埠口,并将 TCP 的表头填写目标端口口为 80 ,而来源端口口是你主机随机 启动的一个埠口,  然后将 TCP 封包封装到 IP 后,送出到网络上。等鸟站主机接收到
你这个封包后,再依据你的埠口给予回应。
这么说你或许不好理解,我们换个说法好了。 假如 IP 是网络世界的门牌,那么这个埠口就是那个门牌号码上建筑物的楼层!  每个建筑物都有 1~65535 层楼,你需要什么网络服务,就得要去该对应的楼层取得正确的资料。但那个楼层里面有没有人在服务你呢? 这就得要看有没有程序真的在执行啦。所以,IP 是门牌, TCP 是楼层,真正提
供服务的, 是在该楼层的那个人 (程序)!
Tips:
曾经有一个朋友问过我说:『一部主机上面这么多服务,那我们跟 这部主机进行联机时,该主机怎么知道我们要的数据是 WWW 还是 FTP 啊?』就是透过埠口啊!因为每种 Client 软件他们所需要的 数据都不相同,例如上面提到的浏览器所需要的数据是 WWW ,所以 该软件默认就会向服务器的 port 80 索求数据;而如果你是使用 filezilla 来进行与服务器的 FTP 数据索求时, filezilla 当然 预设就是向服务器的 FTP 相关埠口 (预设就是 port 21) 进行连 接的动作啦!所以当然就可以正确无误的取得 Client 端所需要的 数据了。 再举个例子来说,一部主机就好像是一间多功能银行,该银行内的 每个负责不同业务的窗口就好像是通讯端口口,  而我们民众就好像 是 Client 端来的封包。当你进入银行想要缴纳信用卡账单时,  一 到门口服务人员就会指示你直接到该窗口去缴纳,当然,如果你是 要领钱,服务人员就会请你到领钱的窗口去填写数据,  你是不会跑 错的对吧! ^_^。万一跑错了怎么办?呵呵!当然该窗口就会告诉 你『我不负责这个业务,你请回去!』, 呵呵!所以该次的联机就 会『无法成功』咯!

特权埠口 (Privileged Ports)
你现在了解了埠口的意义后,再来想想,网络既然是双向的,一定有一个发起端。 问题是,到底要联机到服务器取得啥玩意儿? 也就是说,哪支程序应该在哪个端口口 执行,以让大家都知道该埠口就是提供哪个服务,如此一来,才不会造成广大用户的困 扰嘛!  所以啰, Internet 上面已经有很多规范好的固定 port (well-known port),  这 些 port number 通常小于 1024 ,且是提供给许多知名的网络服务软件用的。 在我们 的 Linux 环境下,各网络服务与port number 的对应默认给他写在 /etc/services  档案内喔! 底下鸟哥列出几个常见的 port number 与网络服务的对应:


另外一点比较值得注意的是, 小于 1024 以下的埠口要启动时, 启动者的身份必 须要是 root 才行,所以才叫做特权埠口嘛!这个限制挺重要的,大家不要忘记了喔! 不过如果是 client 端的话,由于 client 端都是主动向 server 端要数据, 所以 client 端的 port number 就使用随机取一个大于 1024 以上且没有在用的 port  number

Socket Pair
由于网络是双向的,要达成联机的话得要服务器与客户端均提供了 IP 与埠口才行。 因此,我们常常将这个成对的数据称之为 Socket Pair 了! 
    来源 IP + 来源埠口 (Source Address + Source Port)
    目的 IP + 目的埠口 (Destination Address + Destination Port)
由于 IP 与埠口常常连在一起说明,因此网络寻址常常使用『 IP:port 』来说明, 例如想要连上鸟哥的网站时,  正确的鸟哥网站写法应该是:『 linux.vbird.org:80 』 才对!

2.4.2 TCP 的三向交握
TCP 被称为可靠的联机封包,主要是透过许多机制来达成的,其中最重要的就是三 向交握的功能。  那么如何藉由 TCP 的表头来确认这个封包有实际被对方接收,并进一 步与对方主机达成联机? 我们以底下的图示来作为说明。


在上面的封包连接模式当中,在建立联机之前都必须要通过三个确认的动作, 所 以这种联机方式也就被称为三向交握(Three-way handshake)。  那么我们将整个流程依 据上面的 A, B, C, D 四个阶段来说明一下:
    A:封包发起
当客户端想要对服务器端联机时,就必须要送出一个要求联机的封包,此时 客户 端必须随机取用一个大于 1024 的端口来做为程序沟通的接口。然后在 TCP 的表头当中,必须要带有 SYN 的主动联机(SYN=1),并且记下发送出联机封
包给服务器端的序号 (Sequence number = 10001) 。 
    B:封包接收与确认封包传送
当服务器接到这个封包,并且确定要接收这个封包后,就会开始制作一个同时带 有 SYN=1, ACK=1 的封包,  其中那个 acknowledge 的号码是要给 client 端确 认用的,所以该数字会比(A 步骤)里面的 Sequence 号码多一号 (ack = 10001+1  = 10002), 那我们服务器也必须要确认客户端确实可以接收我们的封包才行, 所以也会发送出一个 Sequence (seq=20001) 给客户端,并且开始等待客户端给 我们服务器端的回应喔!
    C:回送确认封包
当客户端收到来自服务器端的 ACK 数字后 (10002) 就能够确认之前那个要求 封包被正确的收受了, 接下来如果客户端也同意与服务器端建立联机时,就会 再次的发送一个确认封包 (ACK=1) 给服务器,亦即是 acknowledge = 20001+1 =  20002 啰。
    D:取得最后确认
若一切都顺利,在服务器端收到带有 ACK=1 且 ack=20002 序号的封包后,就能 够建立起这次的联机了。
也就是说,你必须要了解『网络是双向的』这个事实! 所以不论是服务器端还是客户端,都必须要透过一次 SYN 与 ACK 来建立联机,所以总共会进行三次的交谈!  在设定防火墙或者是追踪网络联机的问题时,这个『双向』的概念最容易被忽略, 而常常导致无法联机成功的问题啊!切记切记!
Tips:
鸟哥上课谈到 TCP 最常做的事就是,叫一个同学起来,实际表演三
向交握给大家看!
1. 鸟哥说:A 同学你在不在?
2. A 同学说:我在!那鸟哥你在不在?
3. 鸟哥说:我也在
此时两个人就确认彼此都可以听到对方在讲啥,这就是可靠联机啦!
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值