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的结构定义

  1. struct ip
  2. {
  3. #if __BYTE_ORDER == __LITTLE_ENDIAN
  4. unsigned int ip_hl:; /* header length */
  5. unsigned int ip_v:; /* version */
  6. #endif
  7. #if __BYTE_ORDER == __BIG_ENDIAN
  8. unsigned int ip_v:; /* version */
  9. unsigned int ip_hl:; /* header length */
  10. #endif
  11. u_int8_t ip_tos; /* type of service */
  12. u_short ip_len; /* total length */
  13. u_short ip_id; /* identification */
  14. u_short ip_off; /* fragment offset field */
  15. #define IP_RF 0x8000 /* reserved fragment flag */
  16. #define IP_DF 0x4000 /* dont fragment flag */
  17. #define IP_MF 0x2000 /* more fragments flag */
  18. #define IP_OFFMASK 0x1fff /* mask for fragmenting bits */
  19. u_int8_t ip_ttl; /* time to live */
  20. u_int8_t ip_p; /* protocol */
  21. u_short ip_sum; /* checksum */
  22. struct in_addr ip_src, ip_dst; /* source and dest address */
  23. };

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在中的定义:

  1. struct icmphdr
  2. {
  3. u_int8_t type; /* message type */
  4. u_int8_t code; /* type sub-code */
  5. u_int16_t checksum;
  6. union
  7. {
  8. struct
  9. {
  10. u_int16_t id;
  11. u_int16_t sequence;
  12. } echo; /* echo datagram */
  13. u_int32_t gateway; /* gateway address */
  14. struct
  15. {
  16. u_int16_t __unused;
  17. u_int16_t mtu;
  18. } frag; /* path mtu discovery */
  19. } un;
  20. };

4、UDP协议

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

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

UDP结构在中的定义为:

  1. struct udphdr {
  2. u_int16_t source;
  3. u_int16_t dest;
  4. u_int16_t len;
  5. u_int16_t check;
  6. };

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的结构在中定义为:

  1. struct tcphdr
  2. {
  3. u_int16_t source;
  4. u_int16_t dest;
  5. u_int32_t seq;
  6. u_int32_t ack_seq;
  7. #if __BYTE_ORDER == __LITTLE_ENDIAN
  8. u_int16_t res1:;
  9. u_int16_t doff:;
  10. u_int16_t fin:;
  11. u_int16_t syn:;
  12. u_int16_t rst:;
  13. u_int16_t psh:;
  14. u_int16_t ack:;
  15. u_int16_t urg:;
  16. u_int16_t res2:;
  17. #elif __BYTE_ORDER == __BIG_ENDIAN
  18. u_int16_t doff:;
  19. u_int16_t res1:;
  20. u_int16_t res2:;
  21. u_int16_t urg:;
  22. u_int16_t ack:;
  23. u_int16_t psh:;
  24. u_int16_t rst:;
  25. u_int16_t syn:;
  26. u_int16_t fin:;
  27. #endif
  28. u_int16_t window;
  29. u_int16_t check;
  30. u_int16_t urg_prt;
  31. };

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. CF109 C. Lucky Tree 并查集

    Petya loves lucky numbers. We all know that lucky numbers are the positive integers whose decimal re ...

  2. mysql常用脚本

    1.执行拼接字符串sql语句(可传参数) set @dbname='trickraft_14f.'; set @sql=CONCAT('SELECT * FROM ',@dbname,'Armforc ...

  3. java多线程的使用1

    方式1: public class LiftOff implements Runnable { ; ; private final int id = taskCount++; public LiftO ...

  4. 通过JSTL+EL实现循环迭代

    使用前需要导入包 jstl.jar 和 standard.jar <%@ page language="java" import="java.util.*,com. ...

  5. chkconfig : No such file or directory

    sys_version:12.04LTS For example: #chkconfig --level mysql on /sbin/insserv:No such file or director ...

  6. Sublime Text 3083破解/汉化

    破解码:—– BEGIN LICENSE —– Andrew Weber Single User License EA7E-855605 813A03DD 5E4AD9E6 6C0EEB94 BC99 ...

  7. Java中Split函数的用法技巧

    在java.lang包中也有String.split()方法,与.net的类似,都是返回是一个字符型数组,但使用过程中还有一些小技巧.如执行:"2|33|4".split(&quo ...

  8. 开一个帖子,等有时间了写写如何用shapelib创建点线面等shp图层

    开一个帖子,等有时间了写写如何用shapelib创建点线面等shp图层  C#操作shapelib的实例 http://files.cnblogs.com/yuxuetaoxp/Shapelib--D ...

  9. Codeforces 119C DP

    题意: 有n天,m门课和常数k; 每天上一门课,每门课程有两个属性,最少作业量a,最多作业量b,和难度c. 1<=a<=b<=1e16 c<=100 1<=n<=m ...

  10. (easy)LeetCode 237.Delete Node in a Linked List

    Write a function to delete a node (except the tail) in a singly linked list, given only access to th ...