TCP/IP协议入门
TCP/IP协议入门
1. 简介
Transmission Control Protocol/Internet Protocol的简写,即传输控制协议/因特网互联协议。它是网络通信的一套协议集合。
先来看一下OSI和TCP/IP模型:

应用层
就是应用软件使用的协议,如邮箱使用的POP3,SMTP、远程登录使用的Telnet、获取IP地址的DHCP、域名解析的DNS、网页浏览的http协议等;这部分协议主要是规定应用软件如何去进行通信的。
表现层
决定数据的展现(编码)形式,如同一部电影可以采样、量化、编码为RMVB、AVI,一张图片能够是JPEG、BMP、PNG等。
会话层
为两端通信实体建立连接(会话),中间有认证鉴权以及检查点记录(供会话意外中断的时候可以继续,类似断点续传)。
传输层
将一个数据/文件斩件分成很多小段,标记顺序以被对端接收后可以按顺序重组数据,另外标记该应用程序使用的端口号及提供QOS。TCP(传输控制协议)和UDP(用户数据报协议)就是属于传输层协议。
网络层
路由选路,选择本次通信使用的协议(http、ftp等),指定路由策略及访问控制策略。(IP地址在这一层)
数据链路层
根据端口与MAC地址,做分组(VLAN)隔离、端口安全、访问控制。(MAC地址在这一层)处理VLAN内的数据帧转发,跨VLAN间的访问,需要上升到网络层。
物理层
将数据最终编码为用0、1标识的比特流,然后传输。(例如将题主头像的图片,变为一串01100111100这样的数字来表示)。
2. TCP的三次握手和四次挥手
先来看一张经典的图,这个图清晰简明的体现了TCP三次握手和四次挥手的流程。

来解释其中的名词:
SYN:即Synchronization,表示同步序号,用来建立连接,当SYN=1而ACK=0时,表明这是一个连接请求报文。对方若同意建立连接,则应在响应报文中使SYN=1和ACK=1. 因此, SYN置1就表示这是一个连接请求或连接接收报文。
Seq:即Sequence Number,用来标识从TCP发送端向TCP接收端发送的数据字节流,它表示在这个报文段中的第一个数据字节在数据流中的序号;主要用来解决网络报乱序的问题。
ACK:此标志表示应答域有效,就是说前面所说的TCP应答号将会包含在TCP数据包中;有两个取值:0和1,为1的时候表示应答域有效,反之为0;TCP协议规定,只有ACK=1时有效,也规定连接建立后所有发送的报文的ACK必须为1。(注意:和下面的Acknowledgment Number不一样,可以理解ACK是Acknowledgment Number的标志位)
Acknowledgment Number:32位确认序列号包含发送确认的一端所期望收到的下一个序号,因此,确认序号应当是上次已成功收到数据字节序号加1。不过,只有当标志位中的ACK标志(下面介绍)为1时该确认序列号的字段才有效。主要用来解决不丢包的问题;
FIN:即finis,终结的意思, 用来释放一个连接。当 FIN = 1 时,表明此报文段的发送方的数据已经发送完毕,并要求释放连接。
三次握手过程
第一次握手:
建立连接。客户端A发送连接请求报文段,SYN为1,seq为x,然后,客户端A进入SYN_SEND状态,等待服务器B的确认,服务端B由SYN=1知道,A要求建立联机;
第二次握手:
服务端B收到请求后要确认联机信息,向A发送ack number=(A的seq+1),SYN=1,ACK=1,随机产生seq的包,此时服务器进入SYN_RECV状态;
第三次握手:
客户端A收到后检查ack number是否正确,即第一次发送的seq+1,以及位码ACK是否为1,若正确,客户端A会再发送ack number=(服务端B的seq+1),ack=1,主机B收到后确认seq值与ack=1则连接建立成功,客户端和服务器端都进入ESTABLISHED状态,完成TCP三次握手。
完成了三次握手,客户端和服务器端就可以开始传送数据。以上就是TCP三次握手的总体介绍。

三次握手的一个实例:
第一次握手:客户端A发送位码syn=1,随机产生seq number=3626544836的数据包到服务端B,服务端B由SYN=1知道客户端A要求建立联机;
第二次握手:服务端B收到请求后要确认联机信息,向客户端A发送ack number=3626544837,yn=1,ack=1,随机产生seq=1739326486的包;
第三次握手:客户端A收到后检查ack number是否正确,即第一次发送的seq number+1,以及位码ack是否为1,若正确,客户端A会再发送ack number=1739326487,ack=1,服务端B收到后确认seq=seq+1,ack=1则连接建立成功。
四次挥手过程
第一次挥手:
主机A(可以使客户端,也可以是服务器端),设置seq和ack number,向主机2发送一个FIN报文段,此时,主机A进入FIN_WAIT_1状态,这表示主机1没有数据要发送给主机2了;
第二次挥手:
主机B收到了主机A发送的FIN报文段,向主机1回一个ACK报文段,ack number为A的seq加1,主机A进入FIN_WAIT_2状态,主机B告诉主机A,我“同意”你的关闭请求;
第三次挥手:
主机B向主机A发送FIN报文段,请求关闭连接,同时主机2进入LAST_ACK状态;
第四次挥手:
主机A收到主机B发送的FIN报文段,向主机B发送ACK报文段,然后主机A进入TIME_WAIT状态,主机B收到主机A的ACK报文段以后,就关闭连接,此时,主机A等待2MSL后依然没有收到回复,则证明主机B已正常关闭,主机A也可以关闭连接了。
至此,TCP的四次分手就这么愉快的完成了。

3. 为什么需要三次握手
已失效的连接请求报文段”的产生在这样一种情况下:client发出的第一个连接请求报文段并没有丢失,而是在某个网络结点长时间的滞留了,以致延误到连接释放以后的某个时间才到达server。本来这是一个早已失效的报文段。但server收到此失效的连接请求报文段后,就误认为是client再次发出的一个新的连接请求。于是就向client发出确认报文段,同意建立连接。假设不采用“三次握手”,那么只要server发出确认,新的连接就建立了。由于现在client并没有发出建立连接的请求,因此不会理睬server的确认,也不会向server发送ack包。(此时因为client没有发起建立连接请求,所以client处于CLOSED状态,接受到任何包都会丢弃)但server却以为新的运输连接已经建立,并一直等待client发来数据。这样,server的很多资源就白白浪费掉了。采用“三次握手”的办法可以防止上述现象发生。例如刚才那种情况,client不会向server的确认发出确认。server由于收不到确认,就知道client并没有要求建立连接。
4. 为什么需要四次挥手
TCP协议是一种面向连接的、可靠的、基于字节流的运输层通信协议。TCP是全双工模式,这就意味着,当主机1发出FIN报文段时,只是表示主机1已经没有数据要发送了,主机1告诉主机2,它的数据已经全部发送完毕了;但是,这个时候主机1还是可以接受来自主机2的数据;当主机2返回ACK报文段时,表示它已经知道主机1没有数据发送了,但是主机2还是可以发送数据到主机1的;当主机2也发送了FIN报文段时,这个时候就表示主机2也没有数据要发送了,就会告诉主机1,我也没有数据要发送了,之后彼此就会愉快的中断这次TCP连接。如果要正确的理解四次分手的原理,就需要了解四次分手过程中的状态变化。
参考:
OSI模型讲解:https://www.zhihu.com/question/24002080/answer/31817536
理解TCP的三次握手,四次挥手:https://www.jianshu.com/p/ce6bd119a4eb?utm_campaign=hugo&utm_medium=reader_share&utm_content=note&utm_source=weixin-friends
三次握手,四次挥手:https://www.jianshu.com/p/092705233d37
TCP/IP协议入门的更多相关文章
- 服务器编程入门(1)TCP/IP协议族
问题聚焦: 简单地梳理一下TCP/IP各层的功能和常用协议 详细了解ARP(数据链路层)和DNS(应用层)协议的工作原理 1 TCP/IP协议族体系结构 数据链路层: 职责:实现网卡接口的网络 ...
- TCP/IP协议学习(五) 基于C# Socket的C/S模型
TCP/IP协议作为现代网络通讯的基石,内容包罗万象,直接去理解理论是比较困难的:然而通过实践先理解网络通讯的理解,在反过来理解学习TCP/IP协议栈就相对简单很多.C#通过提供的Socket API ...
- TCP/IP协议学习(四) 协议概述
生活中有舒适区,借口成为懒惰的护身符,学习也有舒适区,逃避便是阻止进步的最大障碍. 经过半年多嵌入式方面的工作和学习,我提高了很多,但同时我也对自己所面临的问题逐渐清晰: 1. 偏于实践,理论基础不牢 ...
- 深入浅出理解 TCP/IP 协议 (一)
文章转自:https://www.cnblogs.com/onepixel/p/7092302.html TCP/IP 协议栈是一系列网络协议的总和,是构成网络通信的核心骨架,它定义了电子设备如何连入 ...
- 深入浅出 TCP/IP 协议
TCP/IP 协议栈是一系列网络协议的总和,是构成网络通信的核心骨架,它定义了电子设备如何连入因特网,以及数据如何在它们之间进行传输.TCP/IP 协议采用4层结构,分别是应用层.传输层.网络层和链路 ...
- 网络编程的基本概念,TCP/IP协议简介
8.1.1 网络基础知识 计算机网络形式多样,内容繁杂.网络上的计算机要互相通信,必须遵循一定的协议.目前使用最广泛的网络协议是Internet上所使用的TCP/IP协议. 网络编程的目的就是指直接或 ...
- linux高性能服务器编程 (一) --Tcp/Ip协议族
前言: 在学习swoole入门基础的过程中,遇到了很多知识瓶颈,比方说多进程.多线程.以及进程池和线程池等都有诸多的疑惑.之前也有学习相关知识,但只是单纯的知识面了解.而没有真正的学习他们的来龙去脉. ...
- TCP/IP协议的经典面试知识点总结
前言 大家好啊,我是汤小圆. 今天给大家推荐的是,TCP/IP协议的经典面试知识点总结,希望对大家有帮助,谢谢. 简介 我们平时经常听到的TCP/IP协议,其实是一个协议族: 只不过因为TCP.IP是 ...
- 门面模式的典型应用 Socket 和 Http(post,get)、TCP/IP 协议的关系总结
门面模式的一个典型应用:Socket 套接字(Socket)是通信的基石,是支持TCP/IP协议的网络通信的基本操作单元.它是网络通信过程中端点的抽象表示,包含进行网络通信必须的五种信息: 连接使用的 ...
随机推荐
- Android中BroadcastReceiver的使用
1.Android中广播分为静态注册和动态注册 2.下面是一个简单静态注册的例子 创建一个继承BroadcastReceiver的子类 public class DeviceBootReceiver ...
- java毫秒级别定时器
java每100毫秒执行一次 //每100毫秒秒执行一次 @Scheduled(fixedRate = 100) public void testScheduler() { System.out.pr ...
- Mac上搭建Web服务器--Apache
局域网搭建 Web 服务器测试环境,因为Mac OS X 自带了 Apache 和 PHP 环境,我们只需要简单的启动它就行了. 1.命令:sudo apachectl start Apache服务器 ...
- SAP WebIDE里UI5应用的隐藏文件project.json
在SAP WebIDE UI5应用编辑器里的菜单View->Show Hidden files点击后,即可发现项目文件夹下有一个隐藏文件project.json: 内容如下: 这也解释了为什么b ...
- Input system (输入子系统)
Input system (输入子系统) 以前写一些输入设备(键盘,鼠标等)的驱动都是字符设备,混杂设备处理的,linux开源社区的大神门看到了这大量的输入设备如此分散不堪,就想有木有一种机制,可以对 ...
- JFrame windowbuiler的使用基础
一.通过windowbuilder创建java项目: New --Other--windowbuilder--SWT Designer --SWT/JFace Java Project 二.创建文件 ...
- git切换账号邮箱
git config user.name 查看当前用户名 git config user.email 查看当前邮箱 git config --global user.name "用户名&qu ...
- 自定义View-----汽泡效果
先来看一下这次要实现的最终效果: 首先来实现效果一,为实现效果二做充足的准备,下面开始: 新建工程,并定义一个自定义View,然后将其定义在布局文件中,里面是空实现,之后会一步步来填充代码: MyRi ...
- 日志分析方法概述 & Web日志挖掘分析的方法
日志在计算机系统中是一个非常广泛的概念,任何程序都有可能输出日志:操作系统内核.各种应用服务器等等.日志的内容.规模和用途也各不相同,很难一概而论. 本文讨论的日志处理方法中的日志,仅指Web日志.其 ...
- linux centos ftp服务器搭建
原文参考 步骤一:构建vsftpd服务器 1)使用yum安装vsftpd软件包yum -y install vsftpdrpm -q vsftpd #确认安装成功,显示vsftpd对应版本 vsftp ...