从编程角度看TCP协议(1)初识TCP协议

    相信大多数同学面试的时候,都会被问道是否熟悉TCP协议,无论你是网络工程师、运维工程时,或者测试工程师,甚至开发。TCP协议,个人认为是TCP/IP协议族里面最复杂的一个协议,都听过TCP,但每个人对TCP的认知却是大不相同。这也是,面试被经常问到的原因之一吧。

    本系列,试图从编程的角度去分析和讲解TCP协议,而不是拿着【TCP/IP协议族权威指南】这部经典丛书照本宣科,那样你会睡着的。至于为何要从编程的角度去讲,是因为我觉得,只有真正用代码实现过TCP客户端和服务器,才能真正理解TCP协议,要不然大都数都是死记硬背,今天记住明天就忘。

    编程语言,选择python,原因无他,相比其他语言,更熟悉python。在这之前,我们还需要了解下TCP与OSI模型,以及与它在同一层级的UDP协议。

âtcp/ip模åâçå¾çæç´¢ç»æ

    如上图所示,TCP与UDP协议一样,都是OSI七层模型中四层(对应TCP/IP协议族的传输层)的协议。TCP是被封装在网络层协议(比如IPv4协议、IPv6协议)之上,而它本身封装的协议是应用层协议(比如HTTP、SSH等待协议)。

    当然TCP除了封装应用层协议以外,还可以直接封装数据,也就是不需要应用层协议。本系列中的直接采用TCP来封装数据,而不是先用应用层协议封装,再用TCP协议封装。

    我们知道,IPv4或者IPv6是解决设备到设备的通信问题,而TCP和UDP解决的是设备上程序到另一台设备上程序通信的问题。为了标识设备,IPv4/Pv6协议引入了IPv4地址/IPv6地址。而为了标识设备上的程序,TCP和UDP引入了端口(port)。IPv4或者IPv6数据报文里面有源和目的端口,TCP或者UDP协议同样有源和目的端口。

 

1 IP地址和端口

    我们知道IP地址可以配置网卡上,给整个操作系统使用,那么端口呢?当我们运行一个可以接收网络请求的服务器程序时,就会占用一个或者多个端口;当我们运行一个可以发送网络请求的客户端程序时,操作系统会给我们的客户端程序分配一个临时端口,用作请求的源端口;所以说,IP地址是给操作系统使用,而端口是给操作系统上的程序使用,操作系统上可以允许多个程序,也就表示了一个IP地址可以对应多个端口。

    通常当我们客户端程序要发送请求到服务器程序时,需要知道服务器程序的ip地址和端口,然后以服务器的ip地址和端口为目的地址和端口,以自己客户端网卡的IP地址和操作系统临时分配的端口为源地址和源端口,构造数据包发送出去。所以我们抓包的时候可以看到源和目的IP地址,源和目的端口。由于数据包是分层的,因此要看IP地址得在IP协议头部才能看到,要看端口得在TCP后者UDP协议头部才能看到。

    我们客户端和服务器交互的数据包,包含了源和目的IP地址、源和目的端口,以及TCP/UDP协议,其实这也就唯一标识两台主机上的应用程序之间的对话,同时我们给【源IP地址:源端口+传输层协议+目的IP地址:目的端口】一个名字:五元组。

    不过呢,有些程序可能不使用TCP或者UDP来传输数据,这时候就没有端口的说法,也没必要,当然IP地址还是少不了的。比如我们的ICMP、IGMP、OSPF等待协议,是没有端口的,只需要知道数据包的源和目的IP地址就可以完成它们的功能了。    

 

2 聊聊UDP

    UDP,User Datagram Protocol,用户数据报协议,UDP的报文头部如下所示。

âudp headerâçå¾çæç´¢ç»æ

    可以看到UDP报头很简单,总共固定8个字节长度,各个字段解释如下表。

字段解释举例
Source Port源端口0--65535
Destination Port目的端口0-65535
Length载荷的长度,字节为单位0-65535
Checksum头部检验和 

    UDP传输与IP传输非常类似。你可以将UDP协议看作IP协议暴露在传输层的一个接口。UDP协议同样以数据包(datagram)的方式传输,它的传输方式也是“尽力而为”的,所以UDP协议也是不可靠的(unreliable)。

    那么,我们为什么不直接使用IP协议而要额外增加一个UDP协议呢? 一个重要的原因是IP协议中并没有端口(port)的概念,UDP协议实现了端口,从而让数据包可以在送到IP地址的基础上,进一步可以送到某个端口。

    UDP套接口是无连接的、不可靠的数据报协议;既然他不可靠为什么还要用呢?

    其一:当应用程序使用广播或多播时只能使用UDP协议;

    其二:由于他是无连接的,所以速度快。

    因为UDP套接口是无连接的,如果一方的数据报丢失,那另一方将无限等待,解决办法是设置一个超时。

 

3 简单介绍下TCP

    看完UDP协议的报头,来了解下TCP的报头,如下所示。

    看到上图,有没有被吓到,这么多字段,都是啥意思。这里我就不一一解释了,解释了也记不住,后面的文章会慢慢讨论。在本文中,先记住以下两点。

(1)TCP的报头是不固定的,长度从20--60字节不等,并且是以4字节的整数倍。

(2)TCP和UDP相同的是,都有源端口和目的端口,各占2个字节。因此范围也是0--65535。

    上一节中,我们说道UDP是无连接的、不可靠的传输层协议,TCP刚好相反,是基于连接的、可靠的传输层协议。它实现了确认机制、流控、拥塞避免的功能。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值