1.传输层
传输层概述:
传输层是管理端到端的通信连接。
传输层之间的通信其实是进程与进程之间的通信,使用端口来标记不同的网络进程。
2.传输层协议
传输层主要有两种协议:TCP和UDP协议。
TCP与UDP涵盖的重点内容:
3.UDP协议详解
UDP(User Datagram Protocol):用户数据报协议
UDP对于应用层给到的数据(数据报Datagram)不合并、不拆分,数据长度是多长就接收处理多长的数据——相当于对数据报不做任何地处理。
UDP在IP数据报中的位置如下:
UDP协议的特点:
①UDP是无连接的协议;
②UDP在进行通讯的时候并不需要提前地建立连接;
③UDP不能保证可靠的交付数据(想发就发,无法保证数据在网络中是否丢失);
④UDP是面向报文传输的(不做任何处理);
⑤UDP没有拥塞控制——不会感知网络是否拥塞,都会尽量把数据交付出去;
⑥UDP的首部开销很小——首部相对于TCP来说
4.TCP协议详解
TCP(Transmission Control Protocol:传输控制协议),TCP协议是计算机网络中非常复杂的一个协议。
TCP在IP数据报中的位置如下:
TCP协议的特点:
①TCP是面向连接的协议;
②TCP的一个连接有两端(点对点的通信);
③TCP提供可靠的传输服务;
④TCP协议提供全双工的通信;(打电话时可以同时在电话里面对话);
⑤TCP是面向字节流的协议;(可以取出数据里面的某一段来进行传输,可对用户的数据块进行合并和分拆)
TCP协议的首部:
4.1.TCP的标记
4.2.停止等待协议
①发送的消息在路上丢失了;
②确认的消息在路上丢失了;
③确认的消息很久才到;
这三种情况基于TCP/IP可靠传输都要进行超时重传的机制。
优缺点:
停止等待协议是最简单的可靠传输协议;
停止等待协议对信道的利用效率不高。
4.3.连续ARQ协议
ARQ(Automatic Repeat reQuest:自动重传请求)
这个协议可以大幅度提供对信道的利用率。
4.4.TCP协议的可靠传输
TCP的可靠传输基于连续ARQ协议;
TCP的滑动窗口以字节为单位
4.5.TCP协议的拥塞控制
流量控制考虑点对点的通信量的控制;
拥塞控制考虑整个网络,是全局性的考虑
过程中主要运用到的算法:慢启动算法、拥塞避免算法。
5.TCP连接的三次握手
首先我们来看下TCP中的六种TCP标记:
重点关注ACK、SYN、FIN三种标记:
①发送方需要主动地和接收方建立起第一次连接,因此发送方会发出第一次报文,这时SYN是为1的,它表示的是这是一个连接请求的报文,并且在这个报文里面还会同步自己的序列号(假设seq=x),这是三次握手的第一次握手;
②接收方在接收到这个报文的时候,它也会被动地去打开这个TCP连接,同时也会发出一个报文,这个报文是第二次握手,对于第二个报文它有这些关键信息,首先是SYN标记,SYN=1表示是连接请求的意思,ACK=1表示对序列号的确认,ack=x+1表示期望收到x+1序列号的值,同时这个报文也会携带当前自己的序列号seq=y,总的这是第二次握手所携带的信息;
③那么在发送方接受到接受方发送的消息之后呢,它也会进行一个回应,这个回应我们称之为三次握手里面的第三次握手,这个报文也会有一些关键信息,首先他有一个ACK=1表示说这个确认报文是有用的,ack=y+1表示我期望收到你的序号为y+1的这个数据,并且也会同步自己的一个序列号为x+1,表示说当前我发送的数据的序列号是x+1,这个就是第三次握手数据报的一些关键的内容,通过这三次握手,双方的TCP连接就建立起来了:
④三次握手时间轴中不同的时间点也会有不同的状态:
首先对于在接收方在没有接受到数据之前,是一直处于监听的状态(Listen状态);
对于发送方在第一个报文发送以及收到第一个报文的时间之间是属于同步已发送状态(SYNC-SENT),即发送方已经把这个SYN发送出去了并且等待对方的SYN信息,这时状态是属于这个同步已发送的状态;
从接收方发出第一个报文到接收到第二个报文呢,是属于同步已接收的状态,表示说发送方所发送给我的这个SYN信息我已经收到了;
对于发送方来说,在同步已发送之后就是建立连接的状态了,对于发送方来说只要第二次握手成功之后呢,发送方就建立起这个连接了,但是对于接收方来说,只有接收到第三次握手的数据报之后呢才是建立连接的状态,总的如下图所示,可以看出双方对于建立连接的时间是不一样的,发送方只要在第二次握手之后就变成建立连接的状态了,但是对于接收方来说只能在第三次握手成功之后呢,它才变成建立连接的状态,只有在双方都建立起连接之后呢,
才可以进行数据的传输。
5.1.为什么发送方要发出第三个确认报文?
TCP的连接需要进行三次握手,两次握手为什么不行呢?
结论是:
对于发送方如果说要建立起这个连接的话,首先会发出一个请求报文,也就是第一次握手,假设第一次握手在网络中传输了很久才到达接收方,因为传输了很久,所以发送方很久都没有接收到确认消息,那么发送方就认为这个报文已经超时了,所以发送方会发送第二次同样的报文,假设第二次很快就到达了对方,接收方在接收到这个请求报文呢,就会进行回应并且建立起双方的连接,对于第一次请求的连接报文就是一个失效的请求报文,因为它的功能已经被第二次请求完成了;
对于两次握手就建立起连接的话,对于第二次回应的报文就建立起连接了,而对于第一次发送的请求,失效的请求也会建立起这个连接,这样会导致同样的请求发送了两次,就会建立两次TCP连接的情况,这个情况是错误的,两次握手会引发这个错误:
而三次握手的话,确认会首先到达发送方,发送方会再发送一个报文表示确认第三次握手,而第三次握手才建立起这个连接的话,就建立好连接了,而比较慢到达接收方的报文,接收方也会回复一条报文给发送方表示确认,但是发送方已经进行了第三次握手了,因此发送方对于第二次的确认消息呢,它会忽略掉,并不会进行任何操作,后面接收方到达的这个确认发送方就不会进行第三次握手了,这样就避免了两次握手会引发的这个错误(建立两次连接)
6.TCP连接的四次挥手
TCP连接的释放又叫做TCP连接的四次挥手。
在双方连接正常的情况下,可以一直进行数据的传输的,假设数据传输已经完成了,那么这个发送与接收方就可能进行连接的释放,假设发送方需要主动地进行连接的释放,那么首先会发送一个特殊的报文,FIN=1表示我需要释放这个连接,这个就称之为第一次挥手;发送方在发送了这条报文之后就进入了FIN-WAIT-1(连接结束的第一个等待的状态)
接收方在接收到这个报文之后呢,就知道对方要结束这个连接了,因此它也会发送一条报文进行确认,这里面确认的是你发送给我的这条报文我已经确认收到了,并且我已经对你的消息进行了一个确认,这个报文就是第二次挥手,这个是由接收方所发送出来的,而发送方在接收到这个报文之后就进入了断开连接的第二个等待状态,而对于接收方来说,只要第二次报文发出去之后呢,就进入了关闭等待的状态,(这时接收方还可以进行数据的发送)
等到接收方数据发送完成之后,还会发送一条新的报文,携带FIN=1的标记,表示说我也可以进行连接的释放了,并且还会携带一个ack,重复对第一个报文进行确认,这个是属于第三次挥手,
那么发送方在接收到第三次报文(三次挥手)之后呢,又会发送一个报文表示连接释放的信号已经收到了,现在我们可以一起把这个连接释放掉吧,这个就是第四次挥手报文的意思,对于接收方来说,从第三次报文到第四次报文的状态时最后确认的状态,这是为了确认发送方已经收到了这个连接释放的报文的,这个状态称为是最后确认的状态(LAST-ACK),而对于发送方来说会进入一个等待计时器(TIME-WAIT)的状态,它会等待一段时间,确保这段时间内没有出现任何问题,然后才进入关闭的状态,这个就是四次挥手的这个过程;
6.1等待计时器
等待计时器的功能:
7.套接字与套接字编程
对于IP与端口的组合有一个好听的名字去代表它们,这个就称为套接字,也叫作Socket。
TCP是由两端进行连接的,通过两端可以唯一的确定一个套接字,通过两个IP:Port可以确定一个TCP的连接:
套接字编程针对于客户端与服务端:
客户端与服务器端连接的过程:
7.1.Socket编程示例