TCP/IP协议学习笔记


一个协议族,比如TCP / IP,是一组不同层次上的多个协议的组合。TCP / IP通常被认为是一个四层协议系统,如图所示。

分层.png
  • 每一层负责不同的功能:
  1. 链路层,有时也称作数据链路层或网络接口层,通常包括操作系统中的设备驱动程序和计算机中对应的网络接口卡。它们一起处理与电缆(或其他任何传输媒介)的物理接口细节。它的作用:

为IP模块发送和接收IP数据报,
为ARP模块发送ARP请求和接收ARP应答(ARP:地址解析协议,将IP地 址转换成MAC地址),
为RARP发送RARP请求和接收RARP应答。

  1. 网络层,有时也称作互联网层,处理分组在网络中的活动,例如分组的选路。在TCP / IP协议族中,网络层协议包括IP协议(网际协议),ICMP协议(Internet互联网控制报文协议),以及IGMP协议(Internet组管理协议)。
  2. 运输层主要为两台主机上的应用程序提供端到端的通信。在TCP / IP协议族中,有两个互不相同的传输协议: TCP(传输控制协议)和UDP(用户数据报协议)。TCP为两台主机提供高可靠性的数据通信。它所做的工作包括把应用程序交给它的数据分成合适的小块交给下面的网络层,确认接收到的分组,设置发送最后确认分组的超时时钟等。由于运输层提供了高可靠性的端到端的通信,因此应用层可以忽略所有这些细节。
    而另一方面, UDP则为应用层提供一种非常简单的服务。它只是把称作数据报的分组从一台主机发送到另一台主机,但并不保证该数据报能到达另一端。任何必需的可靠性必须由应用层来提供。这两种运输层协议分别在不同的应用程序中有不同的用途,这一点将在后面看到。
  3. 应用层负责处理特定的应用程序细节。几乎各种不同的TCP / IP实现都会提供下面这些通用的应用程序:
    1. Telnet 远程登录。
    1. FTP 文件传输协议。
    2. SMTP 简单邮件传送协议。

注:

  • 互联网地址:也就是IP地址,一般为网络号+子网号+主机号
  • 域名系统(DNS):通俗的来说,就是一个数据库,可以将主机名转换成IP地址
  • RFC:TCP/IP协议的标准文档
  • 端口号:一个逻辑号码,IP包所带有的标记
  • Socket:应用编程接口

接下来我们了解一下TCP/IP的工作流程:

当应用程序用TCP传送数据时,数据被送入协议栈中,然后逐个通过每一层直到被当作一串比特流送入网络。其中每一层对收到的数据都要增加一些首部信息。

封装.png

当应用程序从TCP接收数据时,首先数据链路层从ARP得到数据的传递信息,再从IP得到具体的数据信息

IP首部.png

IP协议头当中,最重要的就是TTL(IP允许通过的最大网段数量)字段(8bit),规定该数据包能穿过几个路由之后才会被抛弃。

当目的主机收到一个以太网数据帧时,数据就开始从协议栈中由底向上升,同时去掉各层协议加上的报文首部。。每层协议盒都要去检查报文首部中的协议标识,以确定接收数据的上层协议。这个过程称作分用( Demultiplexing)。

分用.png

IP路由选择

IP路由选择是简单的,特别对于主机来说。如果目的主机与源主机直接相连(如点对点链路)或都在一个共享网络上(以太网或令牌环网),那么IP数据报就直接送到目的主机上。否则,主机把数据报发往一默认的路由器上,由路由器来转发该数据报。大多数的主机都是采用这种简单机制。


IP路由选择.png

ARP协议工作原理
ARP协议工作原理.png

ICMP协议(网络控制文协议)

将IP数据包不能传送的错误信息传送给主机
查询报文

  • ping查询:主机是否可达,通过计算间隔时间和传送多少个包的数量
  • 子网掩码(32bit):告诉目的主机需要多少比特用于子网号,多少比特用于主机号
  • 时间戳:获得当前时间

差错报文
不产生的情况:

  • ICMP差错报文不产生差错报文
  • 源地址为零地址、环目地址、广播地址、多播地址

IP路由器选择协议

先来看路由选择工作流程:

路由选择.png
  • 静态路由选择

    • 配置接口以默认方式生成路由表项,或者使用route add手动添加表项
  • ICMP报文(ICMP重定向报文)更新表项

  • 动态路由选择(只使用在路由之间)

  • RIP(路由信息协议)
    分布式的基于距离向量(路由器到每一个目的网络的距离记录)的路由选择协议
    router承担的工作:

    • 给每一个已知路由器发送RIP请求报文,要求给出完整的路由表
  • 如果接受请求,就将自己的路由表交给请求者;如果没有,就处理IP请求表项(自己部分+跳数/没有的部分+16)

  • 接受回应,更新路由表

  • 定期更新路由表(一般为30s)

  • OSPF(开放最短路径优先协议)
    分布式链路状态(和这两个路由器都有接口的网络)协议

    • 当链路状态发生变化时,采用可靠的洪泛法,向所有的路由器发送信息(相邻的所有路由器的链路状态)
    • 最终会建立一个全网的拓扑结构图

TCP/IP的建立与断开

TCP报头最小长度:20字节
首先我们先来了解TCP报文段

TCP包首部.png

重要的标志我在图中也有标记,重点了解标志位

  • URG: 紧急指针( urgent pointer)有效(见2 0 . 8节)。
  • ACK: 确认序号有效, TCP协议规定,只有ACK=1时有效,也规定连接建立后所有发送的报文的ACK必须为1。
  • PSH: 接收方应该尽快将这个报文段交给应用层。
  • RST: 重建连接。
  • SYN(SYNchronization):同步序号用来发起一个连接,在连接建立时用来同步序号。当SYN=1而ACK=0时,表明这是一个连接请求报文。对方若同意建立连接,则应在响应报文中使SYN=1和ACK=1. 因此, SYN置1就表示这是一个连接请求或连接接受报文。
  • FIN: 发端完成发送任务,用来释放一个连接当 FIN = 1 时,表明此报文段的发送方的数据已经发送完毕,并要求释放连接。

**需要注意的是: **
(1)不要将确认序号Ack与标志位中的ACK搞混了。
(2)确认方Ack=发起方Req+1,两端配对。


TCP连接的三次握手的过程(客户端我们用A表示,服务器端用B表示)

前提:A主动打开,B被动打开

三次握手的过程.png
  • 在建立连接之前,B先创建TCB(传输控制块),准备接受客户进程的连接请求,处于LISTEN(监听)状态;
  • A首先创建TCB,然后向B发出连接请求,SYN置1,同时选择初始序号seq=client_ISN,进入SYN-SEND(同步已发送)状态;
  • B收到连接请求后向A发送确认,SYN置1,ACK置1,同时产生一个确认序号ack=client_ISN+1。同时随机选择初始序号seq=server_ISN,进入SYN-RCVD(同步收到)状态;
  • A收到确认连接请求后,ACK置1,确认号ack=server_ISN+1,seq=client_ISN+1,进入到ESTABLISHED(已建立连接)状态。向B发出确认连接,最后B也进入到ESTABLISHED(已建立连接)状态。

简单来说,就是

  • 首先由Client发出请求连接即 SYN=1,ACK=0, TCP规定SYN=1时不能携带数据,但要消耗一个序号,因此声明自己的序号是 seq=client_ISN
  • 然后Server进行回复确认,即 SYN=1,ACK=1, seq=server_ISN, Ack=client_ISN+1,
  • 最后Client 再进行一次确认,但不用SYN 了,这时即为 ACK=1, seq=client_ISN+1, Ack=server_ISN+1.

确认应答信号Ack = 收到的seq + 1。 连接建立中,同步信号SYN始终为1。连接建立后,同步信号SYN=0。
当一端为建立连接而发送它的SYN时,它为连接选择一个初始序号。ISN(初始序号)随时间而变化,因此每个连接都将具有不同的ISN。RFC 793 [Postel1981c]指出ISN可看作是一个3 2比特的计数器,每4 m s加1。这样选择序号的目的在于防止在网络中被延迟的分组在以后又被传送,而导致某个连接的一方对它作错误的解释。


TCP断开的四次握手的过程
四次握手的过程.png
  • 客户端A发送一个FIN,用来关闭A到B的数据传送,A进入FIN_WAIT_1状态;
  • 服务端B收到FIN后,发送一个ACK给A,确认序号为序号+1,B进入CLOSED_WAIT状态;
  • B发送一个FIN,用来关闭B到A的数据传送,B进入LAST_ACK状态;
  • A收到FIN后,进入TIME_WAIT状态,接着发送一个ACK给B,确认序号为序号+1,B进入CLOSED状态,完成四次握手。

注意:中断连接端可以是Client端,也可以是Server端。

整个过程Client端所经历的状态如下:

Client端所经历的状态.png

整个过程Server端所经历的过程如下:


Server端所经历的过程.png

TCP优点:
1.可靠稳定;
2.传递数据前,有三次握手连接;
3.传递数据是,有确认、窗口、重传、拥塞控制;
4.传递数据后,会断开连接节省系统资源。
TCP缺点:
1.传输慢,效率低,占用系统资源高;
2.传递数据前,需要连接耗时;
3.传递数据时,确认、重传、拥塞控制等会消耗大量时间及CPU和内存等硬件资源;
4.容易受到攻击,如“SYN攻击”这样典型的DDOS攻击。


问题:

1.为什么A还要发送一次确认?
这主要是防止已失效的连接请求报文段突然又传送到B,因而产生错误。比如:A发送一个连接请求,但由于连接请求的报文丢失了而未收到B发过来的确认。因此,A再发一次请求,后来接到B的确认,建立了连接。数据传输完毕后,就释放连接。

2.避免SYN攻击
在三次握手连接中,Server发送SYN-ACK之后,等待Client的ACK之前的TCP连接称为半连接(half-open-connect),此时Server处于SYN_RCVD状态,当收到Client的ACK后,Server转入ESTABLISH状态。SYN攻击就是Client在短时间内伪造大量不存在的IP地址,向Server发送大量的SYN包,Server发送确认包,并等待Client的确认,由于源地址不存在,Server不断重新发送直至超时,这些伪造的SYN包长时间占据未连接队列,导致正常的SYN请求因为队列满而被丢弃,从而引起网络堵塞甚至系统瘫痪。SYN攻击时常见的DDOS攻击,检测SYN攻击就是检测Server是否有大量半连接状态且源IP地址是随机的则可以断定遭到SYN攻击了,使用如下命令可以让之现行:
$ netstat -nap | grep SYN_RECV

3.为什么TIME_WAIT状态需要经过2MSL(最大报文段生存时间)才能返回到CLOSE状态?
虽然按道理,四个报文都发送完毕,我们可以直接进入CLOSE状态了,但是我们必须假象网络是不可靠的,有可以最后一个ACK丢失。所以TIME_WAIT状态就是用来重发可能丢失的ACK报文。

4.为什么连接的时候是三次握手,关闭的时候却是四次握手?
因为当Server端收到Client端的SYN连接请求报文后,可以直接发SYN+ACK报文。其中ACK报文是用来应答的,SYN报文是用来同步的。但是关闭连接时,当Server端收到FIN报文时,很可能并不会立即关闭SOCKET,所以只能先回复一个ACK报文,告诉Client端,"你发的FIN报文我收到了"。只有等到Server端所有的报文都发送完了,才能发送FIN报文,因此不能一起发送。故需要四步握手。

5.如何保证接收的顺序性?
TCP使用(ISN)初试序号seq和确认序号Ack机制保证了顺序性TCP的每个报文都是有序号的,确认序号Ack=seq+1;

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,569评论 4 363
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,499评论 1 294
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,271评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,087评论 0 209
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,474评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,670评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,911评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,636评论 0 202
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,397评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,607评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,093评论 1 261
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,418评论 2 254
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,074评论 3 237
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,092评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,865评论 0 196
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,726评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,627评论 2 270

推荐阅读更多精彩内容

  • 个人认为,Goodboy1881先生的TCP /IP 协议详解学习博客系列博客是一部非常精彩的学习笔记,这虽然只是...
    贰零壹柒_fc10阅读 5,019评论 0 8
  • 1.这篇文章不是本人原创的,只是个人为了对这部分知识做一个整理和系统的输出而编辑成的,在此郑重地向本文所引用文章的...
    SOMCENT阅读 12,980评论 6 174
  • 18.1 引言 TCP是一个面向连接的协议。无论哪一方向另一方发送数据之前,都必须先在双方之间建立一条连接。本章将...
    张芳涛阅读 3,266评论 0 13
  • 协议基础 协议就是计算机之间通过网络实现通信时实现所达成的一种“约定”,这种约定使得那些由不同厂商的设备,不同的C...
    d9fc24a0c9a9阅读 2,291评论 0 6
  • 计算机网络就是用 物理链路 将各个孤立的工作站或主机连接在一起,组成 数据链路,从而达到资源共享和通信的目的。 网...
    打不死的小强qz阅读 2,837评论 0 6