五层网络模型:
1.应用层
2.传输层
3.网络层
4.数据链路层
5.物理层
TCP属于传输层协议。
建立连接:
TCP建立连接的过程是需要进行三次握手的确认才可以确定连接。TCP是因特网中的传输层协议,使用三次握手协议建立连接。当主动方发出SYN连接请求后,等待对方回答TCP的三次握手TCP的三次握手
SYN+ACK[1],并最终对对方的 SYN 执行 ACK 确认。这种建立连接的方法可以防止产生错误的连接。
在计算机网络中有著名的红军蓝军问题,当处于不同位置的两军准备同时向敌军发起进攻时,红军与蓝军之间需要取得事先的联系和沟通。红军首先向蓝军发出信息,但是红军不能确定蓝军是否接收到消息,需要得到蓝军的确认,否则贸然出击会导致战争失败。
可以看到,上述问题会永无休止的进行下去,没有终点。但是实际应用中绝不允许这样进行下去。所以,需要取一个性价比最高的握手次数。
谢希仁版《计算机网络》中的例子是这样的,“已失效的连接请求报文段”的产生在这样一种情况下:client发出的第一个连接请求报文段并没有丢失,而是在某个网络结点长时间的滞留了,以致延误到连接释放以后的某个时间才到达server。本来这是一个早已失效的报文段。但server收到此失效的连接请求报文段后,就误认为是client再次发出的一个新的连接请求。于是就向client发出确认报文段,同意建立连接。假设不采用“三次握手”,那么只要server发出确认,新的连接就建立了。由于现在client并没有发出建立连接的请求,因此不会理睬server的确认,也不会向server发送ack包。(注:此时因为client没有发起建立连接请求,所以client处于CLOSED状态,接受到任何包都会丢弃,谢希仁举的例子就是这种场景。但是如果服务器发送对这个延误的旧连接报文的确认的同时,客户端调用connect函数发起了连接,就会使客户端进入SYN_SEND状态,当服务器那个对延误旧连接报文的确认传到客户端时,因为客户端已经处于SYN_SEND状态,所以就会使客户端进入ESTABLISHED状态,此时服务器端反而丢弃了这个重复的通过connect函数发送的SYN包,见第三个图。而连接建立之后,发送包由于SEQ是以被丢弃的SYN包的序号为准,而服务器接收序号是以那个延误旧连接SYN报文序号为准,导致服务器丢弃后续发送的数据包)但server却以为新的运输连接已经建立,并一直等待client发来数据。这样,server的很多资源就白白浪费掉了。采用“三次握手”的办法可以防止上述现象发生。例如刚才那种情况,client不会向server的确认发出确认。server由于收不到确认,就知道client并没有要求建立连接。