网络编程——TCP/IP协议

一、定义:TCP/IP(Transmission Control Protocol/Internet Protocol,传输控制协议/网际协议)是指能够在多个不同网络间实现信息传输的协议簇。TCP/IP协议不仅仅指的是TCP 和IP两个协议,而是指一个由FTP、SMTP、TCP、UDP、IP等协议构成的协议簇, 只是因为在TCP/IP协议中TCP协议和IP协议最具代表性,所以被称为TCP/IP协议。(来源百度百科)

二、TCP/IP协议由应用层、传输层、网络层和数据链路层组成。

1.应用层:应用层负责应用程序间的沟通,如超文本传输协议(HTTP)、简单的电子邮件传输(SMTP)、文件传输协议(FTP)、网络远程访问协议(Telnet)等,我们的网络编程主要就是针对应用层。
2.传输层:负责数据从发送端传输到接收端。传输层协议利用端口号识别本机中正在进行通信的应用程序,并准确地将数据传输。

端口号范围:

  • 0~1023为知名端口号,它们的端口号都是固定的,一些知名端口号如下所示:
    在这里插入图片描述
  • 1024~65535为操作系统动态分配的端口号,客户端程序的端口号。

UDP协议的缺点:

  • 无连接:知道对段的IP和端口号就直接进行传输,不需要建立连接;
  • 不可靠:没有确认机制,没有重传机制;如果因为网络故障该段无法发到对方,UDP协议层也不会给应用层返回任何错误信息;
  • 面向数据报:不能够灵活的控制读写数据的次数和数量

TCP的八大特性:

  • 确认应答(ACK)机制: 在 TCP 中,当发送端的数据到达接收主机时,接收端主机会返回一个已收到消息的通知,并且每个ACK都有对应的确认序列号,意思是告诉发送者,我已经收到了哪些数据,下次你从哪里开始发。
  • 超时重传:主机A发送数据给B后,可能因为网络拥堵等原因,数据无法到达主机B;如果主机A在一个特定的时间间隔没有收到B发来的确认应答,就会进行重发;
    重发时间都是0.5秒的整数倍。数据被重发之后若还是收不到确认应答,则进行再次发送,此时,等待确认应答的时间将会以2倍、4倍的指数函数延长。
  • 连接管理(3次握手四次挥手):在正常情况下,TCP要经过三次握手建立连接,四次挥手断开连接
    三次握手如下图所示:
    在这里插入图片描述
    1)、建立连接时,客户端发送SYN包到服务器,并进入到SYN-SEND状态,等待服务器确认
    2)、服务器收到SYN包,必须确认客户的SYN,同时自己也发送一个SYN包,即SYN+ACK包,此时服务器进入SYN-RECV状态
    3)、客户端收到服务器的SYN+ACK包,向服务器发送确认报ACK,此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手,客户端与服务器开始传送数据。
    四次挥手示意图:
    在这里插入图片描述
    1).第一次挥手:客户端发送一个FIN,用来关闭客户端到服务端的数据传送,客户端进入FIN_WAIT_1状态。
    2).第二次挥手:服务端收到FIN后,发送一个ACK给客户端,客户端进入CLOSE_WAIT状态。
    3).第三次挥手:服务端发送一个FIN,用来关闭服务端到客户端的数据传送,服务端进入LAST_ACK状态。
    4).第四次挥手:客户端收到FIN后,客户端进入TIME_WAIT状态,接着发送一个ACK给服务端,服务端进入CLOSED状态,完成四次挥手。
  • 滑动窗口:如果数据段一个一个发送导致效率比较低,尤其是数据往返时间长时,于是就出现了“滑动窗口”将多个字段一起发送,节省了等待时间。
    如果在传输过程中部分ACK丢了可以通过后续ACK进行确认;
    如果是数据包丢了,接收端会一直向发送端发送ACK(比如1001,表示0~1000已经收到了,该下一段数据了)提醒,当发送端连续收到3个这样的ACK时会重新发送这部分数据,当服务器端收到了想要的数据后,会直接跳到发送端最后一次发送的数据接着响应下次应答,这种机制被称为“快重传”。
  • 流量控制:TCP根据接收端的处理能力来决定发送端的发送速度。
  • 拥塞控制:如果在不清楚网络状态下开始就使用滑动窗口进行高效发送数据时,会引发不必要的问题,为此TCP引入“慢启动机制”,先发少量数据,摸清当前的网络拥塞状况后再决定以多大的速度进行数据传输。
  • 延迟应答:如果发送数据量比较大,接收数据的主机立刻返回ACK应答,这时返回的窗口比较小,这种情况下接收端的处理能力远远没有达到极限,这时就需要接收端等一会儿再进行应答,延迟时间一般小于超时重传的时间,约为200ms。
  • 捎带应答:在很多情况下客户端和服务器端是发一收一的,那么此时ACK就可以连同服务器回应的数据一块发送。

TCP一个问题:
处理粘包和半包问题:
问题描述:在传输过程中TCP是以字节流的形式发送数据的,这样会导致应用程序不知道从哪部分到哪部分开始处理数据。
解决方案:
a)给一个固定的边界 \n 使用readLine();方法读取数据
b)每次发送固定大小的数据(一般不会使用)

TCP异常机制:
a)不怎么致命的:结束进程、重启电脑、能发FIN请求和正常关闭没有区别;
b)掉电断网:TCP定时发送保活信息,如果对方不在线,直接关闭。

3.网络层:
规划路线,决定路由器的传输路径,如IP协议;
P地址分为两部分:网络号和主机号
网络号保证相互连接的两个网段有不同的标识;
在同一网段内,主机之间具有相同的网络号但必须有不同的主机号。

刚将IP地址分为6类如下图所示:
在这里插入图片描述
大多数组织都去申请了B类网络地址,导致B类地址分配完了,而浪费了A类地址,因此出现了新的划分方案,称为CIDR(Classless Interdomain Routing):IP+子网掩码,按位与得到网络号。

4.数据连路层: 负责接收IP数据报并通过网络发送之,或者从网络上接收物理帧,抽出IP数据报,交给IP层。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值