您现在的位置: 首页 > 网站导航收录 > 百科知识百科知识
TCP/IP协议到底在讲什么?
协议,数据,报文TCP/IP协议到底在讲什么?
发布时间:2019-02-08加入收藏来源:互联网点击:
TCP/IP协议到底在讲什么?
回答于 2019-09-11 08:43:50
回答于 2019-09-11 08:43:50
王海军老师:学习过TCP/IP的同学应该知道,我们通常说的TCP/IP模型一般是四层,也有的书上网上说是五层,但是多数同意四层的说法,争议的焦点在TCP/IP第一层,四层说法OSI七层的第1,2两层是对应TCP/IP四层的数据链路层或网络接入(接口)层,第5,6,7对应四层的应用层;五层说法是第1,2两层保持不变,还是原来两层,第5,6,7对应四层的应用层。
一、TCP/IP参考模型(四层or五层)
TCP/IP参考模型是计算机网络的祖父ARPANET和其后继的因特网使用的参考模型。
1、四层模型:
应用层:对应OSI中的应用层、表示层、会话层
数据链路层:对应OSI中的数据链路层、物理层(也有叫网络接口层)
七层对四层
2、五层模型:
应用层:对应OSI中的应用层、表示层、会话层
数据链路层:对应OSI中的数据链路层、物理层(也有叫网络接口层)
物理层层:对应OSI中的物理层
七层对五层
在每一层都工作着不同的设备,比如我们常用的交换机就工作在数据链路层的,一般的路由器是工作在网络层的。
在每一层实现的协议也各不同,即每一层的服务也不同.下图列出了每层主要的协议。其中每层中具体的协议,我会在后面的逐一学习。
3、四层,五层,七层对比:
二、TCP数据格式和IP数据格式
TCP数据报文
IP数据报文
决定上层协议
三、TCP协议三次握手和四次挥手
TCP,名为传输控制协议,是一种可靠的传输层协议,IP协议号为6。
原则上任何数据传输都无法确保绝对可靠,三次握手只是确保可靠的基本需要。
三次握手
TCP的连接的拆除需要发送四个包,因此称为四次挥手。客户端或服务器均可主动发起挥手动作,在socket编程中,任何一方执行close()操作即可产生挥手操作。
简单确认
TCP窗口
所谓三次握手(Three-Way Handshake)即建立TCP连接,就是指建立一个TCP连接时,需要客户端和服务端总共发送3个包以确认连接的建立。在socket编程中,这一过程由客户端执行connect来触发。
FAQ
为什么建立连接协议是三次握手,而关闭连接却是四次握手呢?
这是因为服务端的LISTEN状态下的SOCKET当收到SYN报文的连接请求后,它可以把ACK和SYN(ACK起应答作用,而SYN起同步作用)放在一个报文里来发送。但关闭连接时,当收到对方的FIN报文通知时,它仅仅表示对方没有数据发送给你了;但未必你所有的数据都全部发送给对方了,所以你可能未必会马上会关闭SOCKET,也即你可能还需要发送一些数据给对方之后,再发送FIN报文给对方来表示你同意现在可以关闭连接了,所以它这里的ACK报文和FIN报文多数情况下都是分开发送的。
回答于 2019-09-11 08:43:50
先来谈谈汽车行业,随着家庭轿车的普及,越来越多的人开始使用汽车,其中99%人可能只会开车,不会修理汽车,也不了解汽车内部构造(细节),但这并不影响我们使用汽车。
而对于汽车维修工程师,很显然要精通汽车的内部构造,非常资深的工程师可以通过汽车的声音来定位故障点,这依靠的是多年的经验。而对于初入行的年轻工程师,如果只是看汽车的维修手册,即使看千遍也不一定会维修汽车。经常去4S店看到维修工将受损严重的汽车大卸八块,有时还会有老师傅在边上指导,通过这些动手操作,加上师傅的指导,再去参考维修手册,要不了多久就会很熟练地维修汽车,这样的模式:动手 + 理论 + 师傅指导 同样也适用于计算机网络的学习。
对于99%用户也不需要懂计算机网络,电脑、手机可以自动上网,即使有什么问题,通过插拔线、重启电脑、重启无线路由器基本上可以解决90%以上的问题。但是做为一位网络专业人士,则需要精通计算机网络的工作原理,精通原理可以帮助非专业人士提供专业的服务。
TCP/IP协议不是计算机网络的全部,但TCP/IP协议涵盖了OSI参考模型的第三层、第四层,即网络层、传输层。TCP/IP也不是只有TCP + IP这两种协议,它是协议栈的统称,至少它还包括 ARP,ICMP,IGMP,UDP,以及让域名访问成为可能的DNS,以及电脑/手机可以自动获取IP地址的DHCP。当然还有形形色色的应用层的协议如 HTTP / SMTP / FTP 等。
回到问题本身,《TCP/IP协议》详解卷一,是一本很好的教材,但是光看书有用吗?效果很差,因为这本书有点难度的。不动手不会有感性认识,然后读者会被抽象的概念弄的越来越迷糊,觉得越来越无聊,最终扔掉书,因为我干过好多次,然后过段时间又捡起来…
既然光看书很无聊,那就动动手吧。那时工作在国企,公司网络和互联网隔绝,QQ也无法使用,于是我就按照 Visual C++教程编写了聊天小程序(基于TCP socket ),把这个小程序给楼下的同事,无聊的时候就聊聊天,比如什么时候去吃午饭,下班什么时候撤?在程序启动的时候我就开始抓包,想看看究竟聊天内容怎么封装?究竟几个包完成发送任务?
封装倒很简单,让我惊讶的是,一条消息竟然双向耗费9个包,百撕不得其解,不就是调用一次 connect()建立连接,调用一次 send(),然后程序退出。
TCP建立连接于是就去翻书,这次有针对性,直接翻到TCP协议部分,只看TCP如何建立连接,发现建立连接需要三个包的交互,这个应该是connect()完成的。
TCP发送数据然后看到自己的消息内容是一个包,对方没有数据,只有确认ACK,这是两个包,这个由 send () 触发。
TCP释放连接然后系统自动退出,虽然我的程序没有调用什么函数,但是系统自动帮我调用了 close () 函数,于是又触发了TCP 关闭连接,这是四个包。
于是把这三个阶段包的交换加在一起:3 + 2 + 4 = 9 ,哦原来是这样啊,通过这个小程序,再有针对性地看书,觉得很有趣。
后来我又试试用UDP socket 编写聊天程序,直接调用一个函数Sendto() 就可以了(用IP访问),抓包一看,一个消息就是一个包,对方也没有确认,UDP就是加上一个封装头就出去了,不需要建立连接,自然也无需关闭连接。
上一篇:初学者想当程序员,除了技术知识外,还应该培养什么样的能力?
下一篇:返回列表
相关链接 |
||
网友回复(共有 0 条回复) |