还有半年多就要毕业了,投了几个实习都没有回音,想想果然还是什么都不会。是该好好学点什么了,于是乎开个博客,每天把自己学到的知识写上来,一方面是来对今天所学的知识进行个总结,另一方面给自己一个监督吧,我也不知道能持续多久,但开始了总会有收获。
今天第一天,我也不清楚为什么忽然想看点关于TCP/IP的一些东西,大概说到网络肯定少不了TCP/IP。
TCP/IP通常被认为是一个四层协议系统。包括应用层,传(运)输层,网络层,链路层。如图:
图摘自:TCP/IP详解,卷1:协议_Page 4
其中TCP和UDP是运输层协议。
TCP向应用层提供的服务是面向连接的并且具有可靠的字节流服务。客户端和服务器在通过TCP进行交换数据前,必须建立一个TCP连接。建立一个连接需要三次握手,终止一个连接需要四次握手。
摘自:TCP/IP详解,卷1:协议_Page 170-171
TCP通过下列方式来提供可靠性:
1. 应用数据被分割成TCP认为最适合发送的数据块。这和UDP完全不同,应用程序产生的 数据报长度将保持不变。
2.当TCP发出一个段后,它启动一个定时器,等待目的端确认收到这个报文段。如果不能及时收到一个确认,将重发这个报文段。
3.当TCP收到发自TCP连接另一端的数据,它将发送一个确认。这个确认不是立即发送,通常将推迟几分之一秒。
4.TCP将保持它首部和数据的检验和。这是一个端到端的检验和,目的是检测数据在传输过程中的任何变化。如果收到段的检验和有差错,TCP将丢弃这个报文段和不确认收到此报文段(希望发端超时并重发)。
5.既然TCP报文段作为IP数据报来传输,而IP数据报的到达可能会失序,因此 TCP报文段的到达也可能会失序。如果必要, TCP将对收到的数据进行重新排序,将收到的数据以正确的顺序交给应用层。
6.IP数据报会发生重复,TCP的接收端必须丢弃重复的数据。
7.TCP还能提供流量控制。
TCP数据被封装在一个IP数据报中,如图
图摘自:TCP/IP详解,卷1:协议_Page 171
下图为TCP首部
TCP首部一般包含20字节,其中包括16位源端口号和16位目的端口号。与IP首部的源IP地址和目的IP地址共同唯一确定一个TCP连接。
TCP首部的6个标志符通过置1来使用其功能:
URG_紧急指针(urgent pointer)有效
ACK_确认序号有效。
PSH_接收方应该尽快将这个报文段交给应用层。
RST_重建连接。
SYN_同步序号用来发起一个连接。
FIN_发端完成发送任务。
当建立一个新连接时(三次握手):
1.客户端向服务器发送一个SYN段(这个字段只有在满足条件报文段中至少包含一个数据字节;或者 SYN、FIN或RST被设置为1时才显示)表明想要连接的端口,以及初始序号ISN(它表示在这个报文段中的的第一个数据字节)。SYN=1
2.服务器接收到后,发送包含服务器的初始序号SYN报文段作为应答,同时确认序号为客户ISN+1用来对客户的SYN段进行确认。SYN=1 ACK=1
3.客户端将确认序号设置为服务器ISN+1作为返回,与服务器进行确认。ACK=1
终端一个连接(四次挥手):
1.请求关闭的客户端发送FIN报文段,用来关闭从客户到服务器的数据传送。FIN=1,ACK=1
2.服务器接收到FIN段后,返回一个ACK段,确认序号为接收到的ISN+1(FIN占一个序号)。ACK=1
3.服务器同时也会发送一个文件结束符给应用程序,程序关闭连接,导致又发送一个FIN段。FIN=1,ACK=1
4.客户端接收到FIN段后,返回一个ACK段以ISN+1为确认序号,进行确认。ACK=1
IP协议
IP的不可靠:它不能保证IP数据报能成功地到达目的地。IP仅提供最好 的传输服务。
IP的无连接:IP并不维护任何关于后续数据报的状态信息。 每个数据报的处理是相互独立的。这也说明,IP数据报可以不按发送顺序接收。
IP的数据报结构:
图摘自:TCP/IP详解,卷1:协议_Page 24
TTL生存时间字段设置了数据报可以经过的最多路由器数。它的初始值由源主机设置(通常为32或64),一旦经过一个处理它的路由器, 它的值就减去1。当该字段的值为0时,数据报就被丢弃,并发送ICMP报文通知源主机。