TCP IP


  • TCP (传输控制协议) - 应用程序之间通信
  • UDP (用户数据报协议) - 应用程序之间的简单通信
  • IP (网际协议) - 计算机之间的通信
  • ICMP (因特网消息控制协议) - 针对错误和状态
  • DHCP (动态主机配置协议) - 针对动态寻址
    协议分层
OSI体系结构 TCP/IP 协议集
应用层 应用层 Telenet、FIP、HTTP、SMTP、DNS等
表示层
会话层
传输层 传输层 TCP、UDP
网络层 网络层 IP、ICMP、 ARP、RARP
数据链路层 网络接口层 各种物理通信接口
物理层
    应用层 应用层做为 TCP/IP 协议的最高层级,对于我们移动开发来说,是接触最多的。   运行在TCP协议上的协议: HTTP(Hypertext Transfer Protocol,超文本传输协议),主要用于普通浏览。 HTTPS(Hypertext Transfer Protocol over Secure Socket Layer, or HTTP over SSL,安全超文本传输协议),HTTP协议的安全版本。 FTP(File Transfer Protocol,文件传输协议),由名知义,用于文件传输。 POP3(Post Office Protocol, version 3,邮局协议),收邮件用。 SMTP(Simple Mail Transfer Protocol,简单邮件传输协议),用来发送电子邮件。 TELNET(Teletype over the Network,网络电传),通过一个终端(terminal)登陆到网络。 SSH(Secure Shell,用于替代安全性差的TELNET),用于加密安全登陆用。 运行在UDP协议上的协议: BOOTP(Boot Protocol,启动协议),应用于无盘设备。 NTP(Network Time Protocol,网络时间协议),用于网络同步。 DHCP(Dynamic Host Configuration Protocol,动态主机配置协议),动态配置IP地址。 其他: DNS(Domain Name Service,域名服务),用于完成地址查找,邮件转发等工作(运行在TCP和UDP协议上)。 ECHO(Echo Protocol,回绕协议),用于查错及测量应答时间(运行在TCP和UDP协议上)。 SNMP(Simple Network Management Protocol,简单网络管理协议),用于网络信息的收集和网络管理。 ARP(Address Resolution Protocol,地址解析协议),用于动态解析以太网硬件的地址。     传输层 传输层提供了两种到达目标网络的方式:   (1)用户数据报协议UDP: 只提供了基本的错误检测,是一个无连接的协议。 特点:把数据打包,数据大小有限制(64k),不建立连接,速度快,但可靠性低。   (2)传输控制协议TCP: 提供了完善的错误控制和流量控制,能够确保数据正常传输,是一个面向连接的协议。 特点:建立连接通道,数据大小无限制速度慢,但是可靠性高。由于传输层涉及的东西比较多,比如端口,Socket等。       TCP三次握手   0   第一次握手: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之间可以开始传输数据了。   TCP四次挥手 0 由于TCP连接时全双工的,因此,每个方向都必须要单独进行关闭,这一原则是当一方完成数据发送任务后,发送一个FIN来终止这一方向的连接,收到一个FIN只是意味着这一方向上没有数据流动了,即不会再收到数据了,但是在这个TCP连接上仍然能够发送数据,直到这一方向也发送了FIN。首先进行关闭的一方将执行主动关闭,而另一方则执行被动关闭,上图描述的即是如此。   第一次挥手: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状态,完成四次挥手。     QA:为什么建立连接是三次握手,而关闭连接却是四次挥手呢? 这是因为服务端在LISTEN状态下,收到建立连接请求的SYN报文后,把ACK和SYN放在一个报文里发送给客户端。而关闭连接时,当收到对方的FIN报文时,仅仅表示对方不再发送数据了但是还能接收数据,己方也未必全部数据都发送给对方了,所以己方可以立即close,也可以发送一些数据给对方后,再发送FIN报文给对方来表示同意现在关闭连接,因此,己方ACK和FIN一般都会分开发送。     TCP数据包 TCP首部的数据格式。如果不计任选字段,它通常是20个字节。     每个TCP段都包含源端和目的端的端口号,用于寻找发端和收端应用进程。这两个值加上IP首部中的源端IP地址和目的端IP地址唯一确定一个TCP连接。有时,一个IP地址和一个端口号也称为一个插口(socket)。 每个传输的字节都被计数,确认序号包含发送确认的一端所期望收到的下一个序号。 TCP为应用层提供全双工服务。这意味数据能在两个方向上独立地进行传输。 检验和覆盖了整个的TCP报文段:TCP首部和TCP数据。这是一个强制性的字段,一定是由发端计算和存储,并由收端进行验证。 TCP检验和的计算和UDP检验和的计算相似,使用一个伪首部。 许多流行的应用程序如Telnet、 Rlogin、FTP和SMTP都使用TCP。