TCP/IP
Posted 海风就很大众
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了TCP/IP相关的知识,希望对你有一定的参考价值。
目录
TCP/IP协议简介
计算机电脑之间需要定义一些共通的对象来进行交流,TVP/IP就是为此而生。TCP/IP不是一个协议而是一个协议族的统称。里面包括了IP协议,IMCP协议,TCP协议,以及熟悉的http,ftp,pop3协议等等。电脑有了这些就好像学会了外语一样,就可以和其他的计算机终端做自由交流了
TCP/IP协议分层
OSI参考模型,从下到上7层:物理层,数据链路层,网络层,运输层,会话层,表示层,应用层
TCP/IP参考模型,从上到下4层,层层包装:应用层,传输层,网络层,数据链路层
应用层:向用户提供一组常用的应用程序,比如电子邮件,文件传输访问,远程登录等
传输层:提供应用程序间的通信。功能包括:格式化信息流;提供可靠传输
网络层:负责相邻计算机之间的通信。功能包括:处理来自传输层的分组发送请求;处理输入数据报;处理路径,流控,拥堵等问题
网络接口层:这是tcp/ip软件的最底层,负责接收ip数据报并通过网络发送,或者从网络上接收物理帧,抽出IP数据报,交给IP层
IP是无连接的
IP用于计算机之间的通信
IP是无连接的通信协议。它不会占用两个正在通信的计算机之间的通信线路。所以IP就降低了对网络线路的要求。每条线可以同时满足许多不同的计算机之间的通信需要。
通过IP,消息被分割为小的独立的包,并通过因特网在计算机之间传送
IP负责将每个包路由至它的目的地
IP地址
每个计算机必须有一个IP地址才能够连入因特网
每个IP包必须有一个地址才能发送到另一台计算机
TCP使用固定的连接
TCP用于应用程序之间的通信
当应用程序通过TCP与另一个应用程序通信时,它会发送一个通信请求。这个请求必须被送到一个确切的地址。在双方握手后,TCP在两个应用程序之间建立一个全双工的通信。
这个全双工的通信将占用两个计算机之间的通信线路,直到它被一方或双方关闭为止。
UDP和TCP很相似,但是可靠性低于TCP
IP路由器
当一个IP包从一台计算机被发送,它会到达一个IP路由器
IP路由器负责将这个包路由至它的目的地,直接地或者通过其他的路由器
在一个相同的通信中,一个包所经由的路径可能会和其他的包不同,而路由器负责根据通信量,网络中的错误或者其他参数来进行正确寻址
域名
域名就是TCP/IP地址的名字,域名会被一种DNS程序翻译为数字
DNS服务器负责将域名翻译为TCP/IP地址,同时负责使用新的域名信息更新彼此的系统
当一个新的域名连同TCP/IP地址一同注册后,全世界的DNS服务器都会对此信息进行更新
TCP/IP
TCP/IP意味着TCP和IP在一起协同工作
TCP负责应用软件和网络软件之间的通信
IP负责计算机之间的通信
TCP负责将数据分割并装入IP包,然后在它们到达的时候重新组合他们
IP负责将包发送至接收者
TCP报文格式
16位源端口号:16位的源端口中包含初始化通信的端口。源端口和源IP地址的作用是标识报文的返回地址
16位目的端口号:16位的目的端口定义传输的目的。这个端口指明报文接收计算机上的应用程序地址接口
32位序号:32位的序列号由接收端计算机使用,重新分段的报文成最初形式。当SYN出现时,序列码实际上是初始序列码,而第一个数据字节是ISN+1。这个序列号可用来补偿传输中的不一致
32位确认序号:32位的序列号由接收端计算机使用,重新分段的报文成最初形式。如果设置了ACK控制位,这个值表示一个准备接收的包的序列码
4位首部长度:4位包括TCP头大小
6位保留:为了将来定义新的用途而保留
标志:6位标志域。表示为:紧急标志,有意义的应答标志,推,重置连接标志,同步序列号标志,完成发送数据标志。分别为:URG,ACK,PSH,RST,SYN,FIN
16位窗口大小:用来表示想收到的每个TCP数据段的大小
16位校验和:16位TCP头
16位紧急指针:指向后面是优先数据的字节,在URG标志设置了时才有效
选项:长度不定,但长度必须为1个字节
数据:该TCP协议包负载的数据
URG:紧急标志
ACK:确认标志
PSH:推标志
RST:复位标志
SYN:同步标志
FIN:结束标志
TCP三次握手
所谓三次握手即建立TCP连接,就是指建立一个TCP连接时,需要客户端和服务端总共发送3个包以确认连接的建立。在socket编程中,这一过程由客户端执行connect来触发。
第一次握手:Client将标志位SYN置为1,随机产生一个值seq=J,并将该数据包发送给Server,Client进入SYN_SENT状态,等待Server确认
第二次握手:Server收到数据包后由标志位SYN=1知道Client请求建立连接,Server将标志位SYN和ACK都置为1,ack=J+1,随机产生一个值seq=K,并将该数据包发送给Client以确认连接请求,Server进入SYN_RCVD状态
第三次握手:Client收到确认后,检查ack是否为J+1,ACK是否为1,如果正确则将标志位ACK置为1,ack=K+1,并将该数据包发送给Server,Server检查ack是否为K+1,ACK是否为1,如果正确则连接建立成功,Client和Server进入ESTABLISHED状态,完成三次握手,随后Client与Server之间可以开始传输数据了
简洁说法:
1、建立连接时,客户端发送SYN包(SYN=i)到服务器,并进入到SYN-SEND状态,等待服务器确认
2、服务器收到SYN包,必须确认客户的SYN(ack=i+1),同时自己也发送一个SYN包(SYN=k),即SYN+ACK包,此时服务器进入SYN-RECV状态
3、客户端收到服务器的SYN+ACK包,向服务器发送确认报ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手,客户端与服务器开始传送数据。
TCP四次挥手
所谓四次挥手即终止TCP连接,就是指断开一个TCP连接时,需要客户端和服务端总共发送4个包以确认连接的断开。在socket编程中,这一过程由客户端或服务端任一方执行close来触发:
第一次挥手:Client发送一个FIN,用来关闭Client到Server的数据传送,Client进入FIN_WAIT_1状态。
第二次挥手:Server收到FIN后,发送一个ACK给Client,确认序号为收到序号+1(与SYN相同,一个FIN占用一个序号),Server进入CLOSE_WAIT状态。
第三次挥手:Server发送一个FIN,用来关闭Server到Client的数据传送,Server进入LAST_ACK状态。
第四次挥手:Client收到FIN后,Client进入TIME_WAIT状态,接着发送一个ACK给Server,确认序号为收到序号+1,Server进入CLOSED状态,完成四次挥手。
为什么建立连接是三次握手,而关闭连接却是四次挥手呢?
这是因为服务端在LISTEN状态下,收到建立连接请求的SYN报文后,把ACK和SYN放在一个报文里发送给客户端。而关闭连接时,当收到对方的FIN报文时,仅仅表示对方不再发送数据了但是还能接收数据,己方也未必全部数据都发送给对方了,所以己方可以立即close,也可以发送一些数据给对方后,再发送FIN报文给对方来表示同意现在关闭连接,因此,己方ACK和FIN一般都会分开发送。
为什么TIME_WAIT状态需要经过2MSL(最大报文段生存时间)才能返回到CLOSE状态?
- 保证TCP协议的全双工连接能够可靠关闭
- 保证这次连接的重复数据段从网络消失
以上是关于TCP/IP的主要内容,如果未能解决你的问题,请参考以下文章