tcp协议
参考:http://blog.csdn.net/whuslei/article/details/6667471
1.简介
2.可靠的传输的工作原理
自动重传请求ARQ协议
“停止等待”就是每发送完一个分组就停止发送,等待 对方的发送。在收到确认后再发送下一个分组。
自动重传请求ARQ协议:在停止等待的基础上设置超时计时器,当发收方超过了超时计时器设置的时间仍没有收到确认,就认为刚才发送的分组丢失了,因而重传前面发送过的分组。
特点:重传的请求是自动进行的,接受方不需要请求发送方重传某个出错的分组。
连续ARQ协议
发送方每收到一个确认,于是就把发送窗口向前滑动一个分组的位置。接收方一般采用累计确认的方式,不必对收到的分组进行逐个的确认,而是在收到几个分组后,对按序到达的最后一个分组发送确认。这表示到在这个分组为止的所有分组都已正确收到了。
优点:容易实现,即使确认丢失也不必重传。
缺点:不能向发送方反映接收方已正确接收所有分组的信息。
3.tcp协议介绍
tcp报文段 的首部格式
tcp传输的数据单位
TCP 传送的数据单位协议是 TCP 报文段(segment)
tcp的特点
- tcp协议是面向连接的运输层协议
- 每一条tcp连接都是点对点的(一对一),且只能有二个端点。
- tcp协议提供全双工通信(tcp允许通信双反的进程在任何时候都能发送数据)
- 面向字节流
注意:
- tcp通信连接的二个端点叫做套接字(socket) 套接字(sokect)=(IP地址:端口号)
- TCP 对应用进程一次把多长的报文发送到TCP 的缓存中是不关心的
- TCP 根据对方给出的窗口值和当前网络拥塞的程度来决定一个报文段应包含多少个字节(UDP 发送的报文长度是应用进程给出的)
- TCP 可把太长的数据块划分短一些再传送.TCP 也可等待积累有足够多的字节后再构成报文段发送出去
tcp超时重传的时间选择
典型的做法是取新的重传时间为2倍旧的重传时间。
4.tcp协议的流量控制
后面补
5.tcp协议的拥塞控制
后面补
6.tcp协议的三次握手
步骤:
- A 的 TCP 向 B 发出连接请求报文段,,此时A进入SYN-SENT(同步已发送)状态。
- B 的 TCP 收到连接请求报文段后,如同意,则发回确认,此时B也进入SYN-SENT(同步已发送)状态。
- A 收到此报文段后向 B 给出确认,A进入ESTABLISHED(已建立连接)状态,tcp连接已经建立。B收到A的确认后也进入ESTABLISHED状态。
为什么A端还要再发生一次确认?
防止已失效连接请求报文段突然有传送到了B,因而产生错误。
(比如A发送的连接请求报文段在某个网络节点长时间滞留了,在发送该连接报文那次建立的连接都释放后的某个时间到达了B;
此时B会误以为是A端发起了新的tcp连接请求,与A端建立连接,若A端不回复确认的话,连接便建立了,浪费资源 。)
7.tcp协议的四次挥手
步骤:
- 数据传输结束后. A 的应用进程先向其 TCP 发出连接释放报文段,并停止再发送数据,主动关闭 TCP 连接。A进入FIN-WAIT-1(终止等待1)状态,等待B的确认。
- B 收到连接释放报文段后发出确认,然后B进入CLOSE-WAIT(关闭等待)状态。TCP 服务器进程通知高层应用进程.从 A 到 B 这个方向的连接就释放了,TCP 连接处于半关闭状态.但从B到A方向的连接并未关闭,因为B端可能还有数据要发送。
A收到B发送的确认后,进入FIN-WAIT-2(终止等待2)状态,等待B发送的连接释放报文段。 - 在等待一段时间后,若B端没有数据向A端发送后,此时B端发出连接释放报文,进入LAST-ACK(最后确认)状态,等待A的确认。
- A收到B的连接释放报文段后,向B发出确认。然后A进入TIME-WAIT(时间等待)状态,等待2倍最大报文段寿命后,tcp连接才被释放,A进入CLOSED状态。
为什么tcp的释放比连接多了一次?
因为tcp在释放时不能说释放就释放,可能存在某个方仍有数据的传送,所以多了一次确认,等数据传送完毕后,再发送一次确认关闭请求。
为什么A在TIME-WAIT状态要等待2倍最长报文段寿命?
- 一方面防止出现上面的已失效的连接请求报文。
- 另一方面,为了保证最后一次A发送的确认,B能正确接收。如:A在最后一次发送的报文可能会丢失,导致B收不到,此时若等待2倍最大报文段寿命,B就可以启动超时重传(即第二次发送的连接释放报文),接着A再把最后一次确认重新发送给B。B才能正常进入CLOSED状态。