TCP协议
传输控制协议。
当一台计算机要与另一台计算机通信时,两台计算机之间通信需要畅通且可靠,这样才能正确收发数据;
比如你想下载文件,下载的文件要是完整的,不能缺图少字的;这里就用到了TCP,称为传输控制协议,是TCP/IP网络中使用的主要协议之一,用来保证所有的数据按顺序接收,如果不使用TCP协议;数据可能会丢失或者乱序,看不到图像或者文字错乱;
TCP是面向连接的协议,两台计算机在通信之前,要先建立TCP逻辑连接。
-
属于 传输层通信协议
-
基于
TCP的应用层协议有HTTP、SMTP、FTP、Telnet和POP3
三次握手建立连接
三次握手要确认双方的两样能力:发送能力与接收的能力。三就是发送方计算机和接收方计算机相互确认的一个过程:比如
A:听得到吗?
B:听得到,你能听到吗?
A:能听到。
A和B一来一回相互确认后,才开始收发数据;
第一次握手
建立连接时,客户端发送SYN包到服务器,并进入
SYN_SENT状态,等待服务器确认,其中SYN就是同步序列编号。
客户端注重发起连接,发送SYN,自己变成了SYN-SENT状态
第二次握手
服务器收到SYN包,必须确认客户的SYN,同时自己也发送一个SYN包,即是SYN+ACK包,此时服务器进入
SYN_RCVD状态。
服务端收到SYN+ACK包,返回SYN+ACK(对应客户端发来的SYN),自己变成了SYN-RECD状态
第三次握手
客户端收到服务器返回的SYN+ACK包,客户端再次向服务器发送确认包ACK,此包发送完毕,客户端和服务器进入ESTABLISHED(TCP连接成功)状态,完成三次握手。
第二次握手之后,客户端再发送ACK给服务端,自己变成ESTABLISHED状态;服务端收到ACK之后,也变成ESTABLISHED状态。
归纳
成功进行TCP的三次握手后,就建立起一条TCP连接,即可传送应用层数据
注
- 因
TCP提供的是全双工通信,故通信双方的应用进程在任何时候都能发送数据- 三次握手期间,任何1次未收到对面的回复,则都会重发
建立TCP连接前【TCP客户端、服务器都处于关闭状态(CLOSED)】,直到【客户端主动打开连接,服务器才被动打开连接(处于监听状态=LISTEN),等待接收客户端的请求】三次握手算完成。
| 过程 | 描述 | 状态 |
|---|---|---|
| 第一次握手 | 客户端向服务器发送1个连接请求的报文段 | 客户端进入同步已发送状态(SYN_SEND)(等待服务器的确认) |
| 第二次握手 | 服务器收到请求连接报文段后,若同意建立连接,则向客户端发回连接确认的报文段 | 服务器进入同步已接收状态(SYN_RCVD) |
| 第三次握手 | 客户端收到确认报文段后,向服务器再次发出连接确认报文段 | 客户端、服务器端都进入已创建状态(ESTABLISHED)(可开始发送数据) |
四次挥手释放连接
在通信结束后,双方都可以释放连接,共需 四次挥手。比如:
A:我不想跟你聊了。
B:你确定吗?
B:那我就不跟你聊了。
A:确定
一段时间后A和B断了联系
第一次挥手
主动关闭的一方,发送一个FIN,传送数据,用来告诉对方(被动关闭方),相当于说不会再给你发送数据了。
主动关闭的一方可以接受数据。
客户端发送释放的报文段,自此不可发送数据,可以接受数据
第二次挥手
被动关闭方 收到 FIN 包,发送 ACK 给对方,确认序号。
服务端接收后通知应用进程并向客户端发送ACK确认
第三次挥手
被动关闭方 发送一个 FIN,关闭方,说我不会再给你发数据了。(你不给我发送数据,我也不给你发送数据了)
服务端处理完后被动关闭再次向客户端发送FIN以及ACK,进入LAST-ACK状态
第四次挥手
主动关闭一方收到 FIN ,发送要给 ACK ,用来确认序号
客户端收到服务端发来的FIN后,发送 ACK 给服务端。在等待2MSL后进入CLOSED状态
归纳
成功进行TCP的四次挥手后,就断开了TCP连接,传送数据需要重新建立连接
释放TCP连接前【TCP客户端、服务器都处于已创建状态(ESTABLISHED)】,直到【客户端主动关闭TCP连接】四次挥手才算完成。
| 过程 | 描述 | 状态 | 说明 |
|---|---|---|---|
| 第一次挥手 | 客户端向服务器发送1个连接释放的报文段(停止再发送数据) | 客户端进入终止等待1状态(FIN-WAT-1) | 等待服务器的确认 |
| 第二次挥手 | 服务器收到连接释放报文段后,则向客户端发回连接释放确认的报文段 | 服务器进入关闭等待状态(CLOSE-WAT)客户端收到服务器的确认后,进入 终止等待2状态(FIN-WAT-2),等待服务器发出释放连接请求 | 至此,客户端->服务器的TCP连接已断开,即TCP连接处于半关闭状态 即客户端=>服务器断开,但服务器=>客户端未断开 |
| 第三次挥手 | 若服务器已无要向客户端发送数据,则发出释放连接的报文段 | 服务器端进入最后确认状态(LAST-ACK) | |
| 第四次挥手 | 客户端收到连接释放报文段后,则向服务器发回连接释放确认的报文段 | 客户端进入时间等待状态(TIME-WAT) 服务器进入关闭状态(CLOSED) | 此时TCP连接还未释放,须经过时间等待计时器设置的时间2MSL后,客户端才进入连接关闭状态(CLOSED) 即服务器进入关闭状态比客户端要早一些 |
UDP协议
用户数据报协议, 和TCP相似,也用于发送和接收数据。
不同的是UDP是无连接的,就是通信之前无需建立通讯连接;也不保证数据传输的可靠性,
当使用UDP发送数据时,他并不关心数据是否会被接收到,但也因为如此,他的传输比TCP更快;适用于实时性要求高的应用,比如语音通话,视频聊天
-
属于 传输层通信协议
-
基于
UDP的应用层协议有TFTP、SNMP与DNS
TCP与UDP区别
TCP是面向连接的、可靠的、基于字节流的传输层协议
-
面向连接:所谓面向连接,指的是客户端与服务端的连接,在双方互相通信之前,TCP需要三次握手建立连接,而UDP没有相应的建立连接的过程
-
可靠性:TCP可靠性主要体现在有状态,可控制
有状态:TCP会精准记录哪些数据发送了,被对方接受了,哪些没有,而保证数据按序到达,不允许差错
可控制:意识到丢包或者网络环境差,TCP根据具体情况调整自己的行为,控制自己发送速度或重发
-
面向字节流:UDP数据传输基于数据报,仅仅是继承了IP层的特性,而TCP为维护状态,将IP包变成了字节流
-
优缺点:
优:数据传输可靠
缺:效率慢(因需建立连接、发送确认包等)
| TCP | UDP | |
|---|---|---|
| 是否面向连接 | 面向连接 | 无连接 |
| 传输可靠性 | 可靠 | 不可靠 |
| 传输形式 | 字节流 | 数据报文段 |
| 传输效率 | 慢 | 快 |
| 所需资源 | 多 | 少 |
| 应用场景 | 要求通信数据可露(如文件传输、邮件传输) | 要求通信速度高(如域名转换) |
| 首部字节 | 20-60 | 8个字节(由4个字段组成) |
知识支撑
TCP/IP协议?
TCP/IP协议是一个协议簇。里面包括很多协议的,TCP、IP、UDP只是其中之一, 之所以命名为TCP/IP协议,因为TCP、IP协议是两个很重要的协议,就用他两命名了。
关于TCP/IP和HTTP协议的关系
TCP/IP协议是传输层协议,主要解决数据如何在网络中传输,而HTTP是应用层协议,主要解决如何包装数据。
关于TCP/IP和HTTP协议的关系,网络有一段比较容易理解的介绍:“我们在传输数据时,可以只使用(传输层)TCP/IP协议,但是那样的话,如果没有应用层,便无法识别数据内容,如果想要使传输的数据有意义,则必须使用到应用层协议,应用层协议有很多,比如HTTP、FTP、TELNET等,也可以自己定义应用层协议。WEB使用HTTP协议作应用层协议,以封装HTTP 文本信息,然后使用TCP/IP做传输层协议将它发到网络上。”
最后一句
学习心得!若有不正,还望斧正。希望掘友们不要吝啬对我的建议。