一、TCP特点
二、TCP是面向连接的协议。运输连接是用来传送TCP报文的。
TCP运输连接的建立和释放是每一次面向连接的通信中不可缺少的过程
(1) 建立连接要解决什么问题?如何建立连接?
TCP连接建立过程中要解决三个问题:
~ 要使每一方都能够确知对方的存在
~ 要允许双方协商一些参数(如最大窗口值、是否使用窗口扩大选项和时间戳选项以及服务质量等)
~ 能够对运输实体资源(如缓存大小、连接表中的项目等)进行分匹配
用三次握手建立连接:
B 的 TCP 服务器进程先创建传输控制块TCP(存储每一个连接中一些重要的信息,如TCP连接表、到发送和接受缓存的指针、
到重传队列的指针、当全的发送和接受序号等,和进程控制块的PCB类似),准备接受客户A进程的链接请求。然后如无其进
程就处于listen(收听)状态,等待客户的链接请求。如有,即做出响应
A 的 TCP客户进程创建TCB,向 B 发送请求报文段,首部的同步位SYN=1,初始序号seq=x。TCP规定,SYN报
文段(SYN=1)不能携带数据,但要消耗一个序号。 这时,TCP客户进程进入SYN-sent(同步已发送)状态
B 收到链接请求报文段后,如同意建立链接,则向A发送rcvd。在rcvd报文中应把SYN位和ACK位都置1,确认号是ack=x+1,
给自己选择一个初始序号seq=y,同上这个报文段不能携带数据,同样消耗一个序号。 这时,TCP客户端进入SYN-sent状态
此时,如果B同意链接,一次握手完成,B可以知道自己能接受到 A 给自己发送的报文,但是不知道 A 能否接受自己发送报
文
A 收到 B 的确认后,还要向 B 给出确认。确认报文段的ACK置1,确认号ack=y+1,自己的序号seq=x+1, TCP规定,ACK报
文段可以携带数据。但是如果不携带数据则不消耗序号。 这时,TCP链接已建立,A进入estABlished状态
此时,二次握手完成,A 知道 B 可以接受自己发送的报文
当 B 收到 A 的确认后,也进入 EstABlished状态。
此时,三次握手建立链接完成,B 知道自己发送报文 A可以接受到。既然三次握手已经可以建立可靠的链接,那么,四次、
五次··· 当然是可以的,但是为了实际效率和节省资源等问题还是选择三次握手
(2) TCP的链接释放(四次挥手)?
***为什么 A 要进入TIME-WAIT状态?
A 在最后一次收到 B 的确认(链接释放报文)后,必须对此发出确认,此时,TCP链接还没有释放掉,必须经过
时间等待计时器(time-wait timer)设置的时间2MSL后,A 才进入CLOSE状态。“MSL”是最长报文寿命
***为什么 A 在 time-wait 状态必须等待2MSL的时间呢?
第一:为了保证 A 发送最后一个 ACK 报文段能够到达 B
第二:防止已失效的链接请求报文段
我认为三次握手、四次挥手,我们思考时,思想一定要完整一点,任何一方发送报文,一定要确定自己 可以发,并且
确定对方可以收到自己发送的报文,这才算是最简单的一方完整。