1、定义:

TCP/IP模型也被称作DoD模型(Department of Defense Model)。TCP/IP字面上代表了两个协议:TCP(传输控制协议)和IP(网际协议)。

TCP/IP协议不是TCP和IP这两个协议的合称,而是指因特网整个TCP/IP协议族。从协议分层模型方面来讲,TCP/IP由四个层次组成:网络接口层、网络层、传输层、应用层。

TCP/IP协议并不完全符合OSI的七层参考模型,OSI(Open System Interconnect)是传统的开放式系统互连参考模型,是一种通信协议的7层抽象的参考模型,其中每一层执行某一特定任务。该模型的目的是使各种硬件在相同的层次上相互通信。这7层是:物理层、数据链路层(网络接口层)、网络层(网络层)、传输层、会话层、表示层和应用层(应用层)。而TCP/IP通讯协议采用了4层的层级结构,每一层都呼叫它的下一层所提供的网络来完成自己的需求。由于ARPNET的设计者注重的是网络互联,允许通信子网(网络接口层)采用已有的或是将来有的各种协议,所以这个层次中没有提供专门的协议。实际上,TCP/IP协议可以通过网络接口层连接到任何网络上,例如X.25交换网或IEEE802局域网。

参考:TCP/IP协议(360百科)

2、IP协议

IP协议是在网络层的协议,它主要完成数据包的发送作用。下面这个表是IP4的数据包格式:

0      4       8       16                      32
-----------------------------------------------
|版本   |首部长度|服务类型|    数据包总长       |
-----------------------------------------------
|    标识                 |DF |MF| 碎片偏移      |
-----------------------------------------------
|   生存时间    |  协议   |  首部较验和         |
-----------------------------------------------
|               源IP地址                        |
-----------------------------------------------
|               目的IP地址                      |
-----------------------------------------------
|               选项                            |
==============================
|               数据                            |
-----------------------------------------------

IP的结构定义

struct ip
{
#if __BYTE_ORDER == __LITTLE_ENDIAN
unsigned int ip_hl:; /* header length */
unsigned int ip_v:; /* version */
#endif
#if __BYTE_ORDER == __BIG_ENDIAN
unsigned int ip_v:; /* version */
unsigned int ip_hl:; /* header length */
#endif
u_int8_t ip_tos; /* type of service */
u_short ip_len; /* total length */
u_short ip_id; /* identification */
u_short ip_off; /* fragment offset field */
#define IP_RF 0x8000 /* reserved fragment flag */
#define IP_DF 0x4000 /* dont fragment flag */
#define IP_MF 0x2000 /* more fragments flag */
#define IP_OFFMASK 0x1fff /* mask for fragmenting bits */
u_int8_t ip_ttl; /* time to live */
u_int8_t ip_p; /* protocol */
u_short ip_sum; /* checksum */
struct in_addr ip_src, ip_dst; /* source and dest address */
};

ip_vIP 协议的版本号,这里是4。现在IPV6已经出来了

ip_hlIP 包首部长度,这个值以4字节为单位。IP协议首部的固定长度为20个字节,如果IP包没有选项,那么这个值为5。

ip_tos 服务类型,说明提供的优先权。

ip_len 说明IP数据的长度,以字节为单位。

ip_id 标识这个IP数据包。

ip_off 碎片偏移,这和上面ID一起用来重组碎片的。

ip_ttl 生存时间。没经过一个路由的时候减一,直到为0时被抛弃。

ip_p协议 表示创建这个IP数据包的高层协议,如TCP、UDP协议。

ip_sum 首部校验和,提供对首部数据的校验。

ip_src、ip_dst 发送者和接收者的IP地址。

3、ICMP协议

ICMP是消息控制协议,也处于网络层。在网络上传递IP数据包时,如果发生了错误,那么就会用ICMP协议来报告错误。

ICMP包的结构如下:

0              8               16                              32
-----------------------------------------------------
|       类型    |       代码    |       校验和                  |
-----------------------------------------------------
|               数据            |       数据                    |
-----------------------------------------------------

ICMP在中的定义:

struct icmphdr
{
u_int8_t type; /* message type */
u_int8_t code; /* type sub-code */
u_int16_t checksum;
union
{
struct
{
u_int16_t id;
u_int16_t sequence;
} echo; /* echo datagram */
u_int32_t gateway; /* gateway address */
struct
{
u_int16_t __unused;
u_int16_t mtu;
} frag; /* path mtu discovery */
} un;
};

4、UDP协议

UDP协议是建立在IP协议基础之上的,用在传输层的协议。UDP和IP协议一样是不可靠的数据报服务。UDP的头格式为:

0                      16                      32
---------------------------------------------------
|       UDP源端口       |       UDP目的端口     |
---------------------------------------------------
|       UDP数据报长度   |       UDP数据报校验   |
---------------------------------------------------

UDP结构在中的定义为:

struct udphdr {
u_int16_t source;
u_int16_t dest;
u_int16_t len;
u_int16_t check;
};

5、TCP协议

TCP协议也是建立在IP协议之上的,不过TCP协议是可靠的,按照顺序发送的,TCP的数据结构比前面的结构都要复杂。

0       4       8  10           16              24              32
-------------------------------------------------------------------
|               源端口          |               目的端口        |
-------------------------------------------------------------------
|                               序列号                          |
------------------------------------------------------------------
|                               确认号                          |
------------------------------------------------------------------
|        |            |U|A|P|S|F|                               |
|首部长度| 保留       |R|C|S|Y|I|       窗口                    |
|        |            |G|K|H|N|N|                               |
-----------------------------------------------------------------
|               校验和          |               紧急指针        |
-----------------------------------------------------------------
|                       选项                    |    填充字节   |
-----------------------------------------------------------------

TCP的结构在中定义为:

struct tcphdr
{
u_int16_t source;
u_int16_t dest;
u_int32_t seq;
u_int32_t ack_seq;
#if __BYTE_ORDER == __LITTLE_ENDIAN
u_int16_t res1:;
u_int16_t doff:;
u_int16_t fin:;
u_int16_t syn:;
u_int16_t rst:;
u_int16_t psh:;
u_int16_t ack:;
u_int16_t urg:;
u_int16_t res2:;
#elif __BYTE_ORDER == __BIG_ENDIAN
u_int16_t doff:;
u_int16_t res1:;
u_int16_t res2:;
u_int16_t urg:;
u_int16_t ack:;
u_int16_t psh:;
u_int16_t rst:;
u_int16_t syn:;
u_int16_t fin:;
#endif
u_int16_t window;
u_int16_t check;
u_int16_t urg_prt;
};

source 发送TCP数据的源端口 。
dest 接受TCP数据的目的端口。

seq 标识该TCP所包含的数据字节的开始序列号。

ack_seq 确认序列号,表示接受方下一次接受的数据序列号。

doff 数据首部长度,和IP协议一样,以4字节为单位,一般的时候为5。

urg 如果设置紧急数据指针,则该位为1。

ack 如果确认号正确,那么为1。

psh 如果设置为1,那么接收方收到数据后,立即交给上一层程序。

rst 为1的时候,表示请求重新连接。

syn 为1的时候,表示请求建立连接。

fin 为1的时候,表示亲戚关闭连接。

window窗口 告诉接收者可以接收的大小。

check 对TCP数据进行较核。

urg_ptr 如果urg=1,那么指出紧急数据对于历史数据开始的序列号的偏移值。

6、TCP连接的建立

TCP协议是一种可靠的连接,为了保证连接的可靠性,TCP的连接要分为几个步骤。我们把这个连接过程称为"三次握手"。

下面我们从一个实例来分析建立连接的过程。

第一步客户机向服务器发送一个TCP数据包,表示请求建立连接。 为此,客户端将数据包的SYN位设置为1,并且设置序列号seq=1000(我们假设为1000)。

第二步服务器收到了数据包,并从SYN位为1知道这是一个建立请求的连接,于是服务器也向客户端发送一个TCP数据包。因为是响应客户机的请求, 于是服务器设置ACK为1,sak_seq=1001(1000+1)同时设置自己的序列号。seq=2000(我们假设为2000)。

第三步客户机收到了服务器的TCP,并从ACK为1和ack_seq=1001知道是从服务器来的确认信息。于是客户机也向服务器发送确认信息,
客户机设置ACK=1,和ack_seq=2001,seq=1001,发送给服务器,至此客户端完成连接。

最后一步服务器受到确认信息,也完成连接。

通过上面几个步骤,一个TCP连接就建立了。当然在建立过程中可能出现错误,不过TCP协议可以保证自己去处理错误的。

说一说其中的一种错误:
听说过DOS吗?(可不是操作系统啊)。曾经,美国的五大网站一起受到攻击。攻击者用的就是DOS(拒绝式服务)方式。概括的说一下原理:

客户机先进行第一个步骤,服务器收到后,进行第二个步骤。按照正常的TCP连接,客户机应该进行第三个步骤。不过攻击者实际上并不进行第三个步骤,因为客户端在进行第一个步骤的时候,修改了自己的IP地址,就是说将一个实际上不存在的IP填充在自己IP 数据包的发送者的IP一栏。这样因为服务器发的IP地址没有人接收,所以服务端会收不到第三个步骤的确认信号。这样服务器端会在那边一直等待,直到超时。这样当有大量的客户发出请求后,服务端会有大量等待,直到所有的资源被用光, 而不能再接收客户机的请求。这样当正常的用户向服务器发出请求时,由于没有了资源而不能成功。

七、TCP/IP协议的更多相关文章

  1. OSI七层模型详解 TCP/IP协议

      总结 OSI中的层 功能 TCP/IP协议族 应用层 文件传输,电子邮件,文件服务,虚拟终端 TFTP,HTTP,SNMP,FTP,SMTP,DNS,Telnet 等等 表示层 数据格式化,代码转 ...

  2. OSI 七层模型和 TCP/IP 协议比较

      OSI (Open System Interconnection), 开放式系统互联参考模型.从下到上七层模型功能及其代表协议: 物理层(Physical) :规定了激活.维持.关闭通信端点之间的 ...

  3. TCP/IP协议(一)网络基础知识 网络七层协议

    参考书籍为<图解tcp/ip>-第五版.这篇随笔,主要内容还是TCP/IP所必备的基础知识,包括计算机与网络发展的历史及标准化过程(简述).OSI参考模型.网络概念的本质.网络构建的设备等 ...

  4. OSI七层模型和五层TCP/IP协议

    1.查公网ip的方法: windows,打开浏览器,访问百度,搜IP即可 linux:curl ifconfig.me 2.OSI七层模型 ==网络工程师:== 物理层 1层,通信介质的信号到数字信号 ...

  5. Python进阶----网络通信基础 ,OSI七层协议() ,UDP和TCP的区别 , TCP/IP协议(三次握手,四次挥手)

    Python进阶----网络通信基础 ,OSI七层协议() ,UDP和TCP的区别 , TCP/IP协议(三次握手,四次挥手) 一丶CS/BS 架构 C/S: 客户端/服务器    定义:       ...

  6. TCP/IP协议,,OSI的七层参考模型,HTTP请求响应机制

    一.TCP/IP协议 TCP/IP是Transmission Control Protocol/Internet Protocol的简写,中译名为传输控制协议/因特网互联协议,又名网络通讯协议,是In ...

  7. osi七层与TCP\IP协议

    层次划分的方法 1.网络的每层应当具有相对独立的功能(便于排错)这个功能用不了必然是你这层处理问题 2.梳理功能之间的关系,使上一个功能可以实现为另一个功能提供必要的服务,从而形成系统的层次结构.为提 ...

  8. OSI七层模型与TCP/IP协议

    作者:菘蓝 时间:2022/9/1 ================================================================================== ...

  9. 网络基础七层模型与TCP/IP协议

    1.网络基础 1.1 什么是网络 网络就是计算机网络是一组计算机或网络设备通过有形 的线缆或无形的媒介如无线,连接起来,按照一定的 规则,进行通信的集合. 网络通信就是指终端设备之间通过计算机网络进行 ...

随机推荐

  1. 最大期望算法 Expectation Maximization概念

    在统计计算中,最大期望(EM,Expectation–Maximization)算法是在概率(probabilistic)模型中寻找参数最大似然估计的算法,其中概率模型依赖于无法观测的隐藏变量(Lat ...

  2. spark IDEA开发环境搭建及运行问题

    下图是例子: 还用说么,引入相关jar包(等下再一一说明)  包括scala,spark-assembly-1.4.1-hadoop2.5.0-cdh5.2.1.jar(按照你的spark和hadoo ...

  3. Xshell5最新版激活

    Xshell是一个用于MS Windows平台的强大的SSH,TELNET,和RLOGIN终端仿真软件.它使得用户能轻松和安全地从Windows PC上访问Unix/Linux主机. 以上内容全部为广 ...

  4. iOS应用架构谈:架构设计的方法论

    缘由 之前安居客iOS app的第二版架构大部分内容是我做的,期间有总结了一些经验.在将近一年之后,前同事zzz在微信朋友圈上发了一个问题:假如问你一个iOS or Android app的架构,你会 ...

  5. oracle游标循环的嵌套

    完成批量修改user_tables中的所有表的栏位名(从MS SQL导入过来,发现大小写问题,造成很多麻烦) 存储过程见下: -- Created on 2012/3/14 by FREE decla ...

  6. 九度OJ1061

    //C++ sort函数的多重排序 #include <iostream> #include<algorithm> #include<string> using n ...

  7. [CF 474E] Pillars (线段树+dp)

    题目链接:http://codeforces.com/contest/474/problem/F 意思是给你两个数n和d,下面给你n座山的高度. 一个人任意选择一座山作为起始点,向右跳,但是只能跳到高 ...

  8. [CF 475D] CGCDSSQ (RMQ)

    题目链接:http://codeforces.com/contest/475/problem/D 是昨天晚上的CF题目,题意是给定你n个数,问你所有子区间内的最小公约数是x的个数是多少 问的康神,了解 ...

  9. activity退出

    这里介绍两种方法:一种把每个activity记住,然后逐一干掉:另一种思路是使用广播.本文来源于网络,如有雷同,那是必须的.写此贴只是为了总结一下常用东东,还望原作者莫怪,本人真不是想侵权. 方法一. ...

  10. DZ!NT论坛 3.6.711删除用户各种错解决方案

    DZ!NT论坛 3.6.711删除用户各种错解决方案   首先删除一个用户~ado.net报错 对象名  'dnt_spaceposts' 无效. 对象名 'dnt_spaceconfigs' 无效. ...