【网络】TCP基础总结

OSI以及分层模型

OSI分层 (7层):物理层、数据链路层、网络层、传输层、会话层、表示层、应用层。

TCP/IP分层(4层):网络接口层、 网际层、运输层、 应用层。

五层协议(5层):物理层、数据链路层、网络层、运输层、 应用层

OSI的7层模型主要是理论研究的意义,而实际使用的是4层的TCP/IP模型(而TCP/IP的第4层网络接口层并没有什么实际的内容)。5层模型是7层模型和TCP/IP四层模型的一个折中,仅仅用于学习网络的原理。

OSI的7层模型每一层的作用如下:

1. 物理层:通过媒介传输比特,确定机械及电气规范(比特Bit)

2. 数据链路层:将比特组装成帧和点到点的传递(帧Frame)

3. 网络层:负责数据包从源到宿的传递和网际互连(包Packet)

4. 传输层:提供端到端的可靠报文传递和错误恢复(段Segment)

5. 会话层:建立、管理和终止会话(会话协议数据单元SPDU)

6. 表示层:对数据进行翻译、加密和压缩(表示协议数据单元PPDU)

7. 应用层:允许访问OSI环境的手段(应用协议数据单元APDU)

5层理论分析模型的每一层作用如下:

1. 应用层:直接为用户的应用进程提供服务

2. 传输层:负责两个主机中进程间的通信提供服务

3. 网络层:负责为分组交换网上的不同主机提供通信服务;选择合适的路由传送分组

4. 数据链路层:将网络层交付下来的分组封装为帧,在相邻节点的链路上传递帧中的数据

5. 物理层:透明的传送比特流

IP地址分类

A类地址:以0开头,第一个字节范围:0~127(1.0.0.0 - 126.255.255.255)

B类地址:以10开头,第一个字节范围:128~191(128.0.0.0 - 191.255.255.255)

C类地址:以110开头,第一个字节范围:192~223(192.0.0.0 - 223.255.255.255)

D类地址:以1110开头,作为多播地址

保留地址:10.0.0.0—10.255.255.255, 172.16.0.0—172.31.255.255, 192.168.0.0—192.168.255.255。

TCP与UDP的区别

TCP(Transmission Control Protocol,传输控制协议)是面向连接的协议,也就是说,在收发数据前,必须和对方建立可靠的连接。

UDP(User Data Protocol,用户数据报协议)是一个非连接的协议,传输数据之前源端和终端不建立连接,当它想传送时就简单地去抓取来自应用程序的数据,并尽可能快地把它扔到网络上。

两者的区别:

1. 基于连接与无连接;

2. 对系统资源的要求TCP较多,UDP少;

3. UDP程序结构较简单;

4. 流模式(TCP把数据看做是无结构的字节流)与数据报模式(UDP是面向数据报);

5. TCP保证数据正确性,UDP可能丢包,TCP保证数据顺序,UDP不保证

TCP报文首部格式

至于首部格式中的各个字段的含义,直接找本书看看就差不多了

详解: http://blog.csdn.net/wilsonpeng3/article/details/12869233

TCP的三次握手与四次挥手过程及TIMEWAIT的作用

三次握手建立连接:

首先Client端发送连接请求报文,Server段接受连接后回复ACK报文,并为这次连接分配资源。Client端接收到ACK报文后也向Server段发生ACK报文,并分配资源,这样TCP连接就建立了

如果三次握手修改为两次握手,那么会存在一种”已失效连接请求报文段”造成的无效连接的情况。假设在如下场景下,采用2次握手。client发送一个请求报文段给server,而这个报文段在网络的某个地方阻塞了,那么clent超时重新发送一个连接请求报文段,此时server收到第二个连接请求报文段,并为连接分配资源,建立连接,并在该连接上发送数据,之后断开连接。如果连接断开之后,之前阻塞的请求建立报文又传送给了server,那么此时如果是2次握手,server会为这个迟到的无效请求报文建立一个无效的连接,而client并没有数据要发送给server,这样资源就被浪费了。

四次挥手断开连接:

中断连接端可以是Client端,也可以是Server端。假设Client端发起中断连接请求,也就是发送FIN报文。Server端接到FIN报文后,意思是说”Client端没有数据要发给你了”,但是如果server还有数据没有发送完成,则不必急着关闭Socket,可以继续发送数据。所以server先发送ACK,”告诉Client端,请求我收到了,但是我还没准备好,请继续等我的消息”。这个时候Client端就进入FIN_WAIT状态,继续等待Server端的FIN报文。当Server端确定数据已发送完成,则向Client端发送FIN报文,”告诉Client端,好了,我这边数据发完了,准备好关闭连接了”。Client端收到FIN报文后,”就知道可以关闭连接了,但是他还是不相信网络,怕Server端不知道要关闭,所以发送ACK后进入TIME_WAIT状态,如果Server端没有收到ACK则可以重传。“,Server端收到ACK后,”就知道可以断开连接了”。Client端等待了2MSL后依然没有收到回复,则证明Server端已正常关闭,那么Client端也可以关闭连接了。

断开连接需要四次的原因是存在被请求断开连接的一段,在收到断开连接请求的时候可能还有数据需要发送,所以只能对请求进行回复,但是并不能立刻断开连接,也就是断开的时候双方都需要在自己没有数据发送的时候发送一个fin报文,并且得到对方的ack。

至于最后TIME-WAIT需要等待2MSL(2倍的报文最长生存时间)的原因,主要有两点:

1. 保证请求断开连接的一端A最后发送的一个确认关闭ack一定可以发送到对方B。在B收到A的最后一个ack的时候,存在该ack丢失的情形,所以A在等待2MSL期间,可以收到B重传的fin+ack。A在收到重传的fin+ack之后重新发送确认并重置2MSL计时器。这样可以保证B可以正常的关闭,如果等待时间少于2MSL,那么可能A关闭之后,B却因为没有收到这个ack而一直重传fin+ack而无法关闭。

2. 防止出现”已失效连接请求报文段”。因为在发送最后一个ack之后,等待2MSL可以保证此次连接过程中产生的所有报文都会消失,保证在新建立连接的时候不会受到前一次连接中的阻塞请求连接报文的影响(UNP中对这种情况有详细的说明)。

补充:

TCP 保活计时器:假设客户端和服务器建立的TCP连接,但是此时客户端故障而非正常的断开了这个连接,服务器并不知道客户端之间的连接是否存在,因此可能无谓的等待在这个失效的连接上。因此需要采用一种机制来避免,服务端采用的措施就是在每次接收到客户端的数据的时候就重启一个保活计时器(大概2小时),如果保活计时器到时之后服务端仍然没有收到数据,那么服务端就发送一个探测报文,每隔75分钟发送一个,连续10个报文都没有收到客户端的响应,就认为客户端意外断开。

TCP拥塞控制

计算机网络中的带宽、交换结点中的缓存和处理机等,都是网络的资源。在某段时间,若对网络中某一资源的需求超过了该资源所能提供的可用部分,网络的性能就会变坏。这种情况就叫做拥塞

拥塞控制就是防止过多的数据注入网络中,这样可以使网络中的路由器或链路不致过载。拥塞控制是一个全局性的过程,和流量控制不同,流量控制指点对点通信量的控制,流量控制是让数据发送端减慢数据的发送速度。

拥塞控制方法:

1. 慢开始( slow-start )

2. 拥塞避免( congestion avoidance )

3. 快重传( fast retransmit )

4. 快恢复( fast recovery )

TCP拥塞控制主要过程

慢启动阶段:

当建立新的TCP连接时,拥塞窗口(congestion window,cwnd)初始化为一个数据包大小。源端按cwnd大小发送数据,每收到一个ACK确认,cwnd就增加一个数据包发送量,这样cwnd就将随着回路响应时间(Round Trip Time,RTT)呈指数增长,源端向网络发送的数据量将急剧增加。由于在发生拥塞时,拥塞窗口会减半或降到1,因此慢启动确保了源端的发送速率最多是链路带宽的两倍。

拥塞避免阶段:

如果TCP源端发现超时或收到3个相同ACK副本时,即认为网络发生了拥塞(主要因为由传输引起的数据包损坏和丢失的概率很小(<<1%))。此时就进入拥塞避免阶段。慢启动阈值(ssthresh)被设置为当前拥塞窗口大小的一半;如果超时,拥塞窗口被置1。如果cwnd>ssthresh,TCP就执行拥塞避免算法,此时,cwnd在每次收到一个ACK时只增加1/cwnd个数据包,这样,在一个RTT内,cwnd将增加1,所以在拥塞避免阶段,cwnd不是呈指数增长,而是线性增长

快速重传和快速恢复阶段:

快速重传是当TCP源端收到到三个相同的ACK副本时,即认为有数据包丢失,则源端重传丢失的数据包,而不必等待RTO超时。同时将ssthresh设置为当前cwnd值的一半,并且将cwnd减为原先的一半。快速恢复是基于“管道”模型(pipe model)的“数据包守恒”的原则(conservation of packets principle),即同一时刻在网络中传输的数据包数量是恒定的,只有当“旧”数据包离开网络后,才能发送“新”数据包进入网络。如果发送方收到一个重复的ACK,则认为已经有一个数据包离开了网络,于是将拥塞窗口加1(这里的1是1个报文段长度,实际上收到3个重复ack,窗口就增加了3)。

TCP滑动窗口以及回退N(Go-Back-N)

滑动窗口协议的基本原理就是在任意时刻,发送方都维持了一个连续的允许发送的帧的序号,称为发送窗口;同时,接收方也维持了一个连续的允许接收的帧的序号,称为接收窗口。发送窗口和接收窗口的序号的上下界不一定要一样,甚至大小也可以不同。不同的滑动窗口协议窗口大小一般不同。发送方窗口内的序列号代表了那些已经被发送,但是还没有被确认的帧,或者是那些可以被发送的帧

后退n协议中,发送方在发完一个数据帧后,不停下来等待应答帧,而是连续发送若干个数据帧,即使在连续发送过程中收到了接收方发来的应答帧,也可以继续发送。而帧的确认采用累积确认的方式,也就是接收方不对接收到的帧逐个进行确认,而是子收到若干个分组之后,对按序到达的连续分组的最后一个分组发送确认,代表到该分组为止的所有分组都被确认收到。这种累积确认的优点是实现起来比较容易,而且对于丢失的确认不必进行重传。但是缺点是无法正确的向发送方反映已经接受到的分组。比如,当前发送方连续发送了5个分组,其中第三个分组丢失了,其他四个正确接收到,那么由于只能对前面两个分组进行确认,因此发送方并不知道后面3个分组的实际接收情况。于是就需要将后面的3个分组都重传一次。这就是回退N帧,即需要再回退并重传已经发送的N个分组。这种协议在通信质量不好的情况小效率将会变得很低,造成大量的重复分组的发送。

时间: 2024-10-03 23:49:35

【网络】TCP基础总结的相关文章

Java网络编程基础(六)— 基于TCP的NIO简单聊天系统

在Java网络编程基础(四)中提到了基于Socket的TCP/IP简单聊天系统实现了一个多客户端之间护法消息的简单聊天系统.其服务端采用了多线程来处理多个客户端的消息发送,并转发给目的用户.但是由于它是基于Socket的,因此是阻塞的. 本节我们将通过SocketChannel和ServerSocketChannel来实现同样的功能. 1.客户端输入消息的格式 username:msg    username表示要发送的的用户名,msg为发送内容,以冒号分割 2.实现思路 实现思路与Java网络

Linux程序设计学习笔记----Socket网络编程基础之TCP/IP协议簇

转载请注明出处: ,谢谢! 内容提要 本节主要学习网络通信基础,主要涉及的内容是: TCP/IP协议簇基础:两个模型 IPv4协议基础:IP地址分类与表示,子网掩码等 IP地址转换:点分十进制\二进制 TCP/IP协议簇基础 OSI模型 我们知道计算机网络之中,有各种各样的设备,那么如何实现这些设备的通信呢? 显然是通过标准的通讯协议,但是,整个网络连接的过程相当复杂,包括硬件.软件数据封包与应用程序的互相链接等等,如果想要写一支将联网全部功能都串连在一块的程序,那么当某个小环节出现问题时,整只

网络编程基础之TCP编程学习(一)

网络编程基础了解 socket套接字 socket是一种通讯机制,它包含一整套的调用接口和数据结构的定义,他给应用程序提供了使用如TCP/UDP等网络通讯的手段. linux中的网络编程通过socket接口实现,socket既是一种特殊的IO,提供对应的文件描述符.一个完整的socket都有一个相关描述{协议,本地地址,本地端口,远程地址,远程端口};每个socket有一个本地唯一Socket,由操作系统分配. 定位某个计算机用IP,定位某个服务用端口. 创建Socket #include <s

用Netty开发中间件:网络编程基础

用Netty开发中间件:网络编程基础 <Netty权威指南>在网上的评价不是非常高,尤其是第一版,第二版能稍好些?入手后高速翻看了大半本,不免还是想对<Netty权威指南(第二版)>吐槽一下: 前半本的代码排版太糟糕了,简直就是直接打印Word的版式似的. 源代码解析部分的条理性和代码排版好多了,感觉比其它部分的质量高多了. 假设你是刚開始学习的人可能会感觉非常具体,差点儿每部分都会来一套client和服务端的Demo.假设你不是入门者的话可能会感觉水分比較多. 最后一部分高级特性

全栈必备 网络编程基础

我们是幸运的,因为我们拥有网络.网络是一个神奇的东西,它改变了你和我的生活方式,改变了整个世界. 然而,网络的无标度和小世界特性使得它又是复杂的,无所不在,无所不能,以致于我们无法区分甚至无法描述. 对于一个码农而言,了解网络的基础知识可能还是从了解定义开始,认识OSI的七层协议模型,深入Socket内部,进而熟练地进行网络编程. 关于网络 关于网络,在词典中的定义是这样的: 在电的系统中,由若干元件组成的用来使电信号按一定要求传输的电路或这种电路的部分,叫网络. 作为一名从事过TMN开发的通信

Java网络编程基础【转】

网络编程 网络编程对于很多的初学者来说,都是很向往的一种编程技能,但是很多的初学者却因为很长一段时间无法进入网络编程的大门而放弃了对于该部分技术的学习. 在 学习网络编程以前,很多初学者可能觉得网络编程是比较复杂的系统工程,需要了解很多和网络相关的基础知识,其实这些都不是很必需的.首先来问一个问题:你 会打手机吗?很多人可能说肯定会啊,不就是按按电话号码,拨打电话嘛,很简单的事情啊!其实初学者如果入门网络编程的话也可以做到这么简单! 网络编程就是在两个或两个以上的设备(例如计算机)之间传输数据.

嵌入式 Linux网络编程(一)——Socket网络编程基础

嵌入式 Linux网络编程一--Socket网络编程基础 一.Socket简介 1.网络中进程间通信 本机进程使用进程号区别不同的进程进程间通信方式有管道.信号.消息队列.共享内存.信号量等.网络中进程间的通信首先需要识别进程所在主机在网络中的唯一标识即网络层的IP地址主机上的进程可以通过传输层的协议与端口号识别. 2.Socket原理 Socket是应用层与TCP/IP协议族通信的中间软件抽象层是一种编程接口.Socket屏蔽了不同网络协议的差异支持面向连接(Transmission Cont

Linux网络配置基础篇

Linux网络配置基础篇 一.如何实现linux网络通信? 1)指定IP/NETMASK可实现本地通信: 2)指定路由(网关)可实现跨网络通信: 3)指定DNS服务器地址可实现基于主机名的通信, 主DNS服务器地址(当前服务器不在线时,启用备用DNS服务器地址) 备用DNS服务器地址 第三备份DNS服务器地址 二.配置网络方式及网络接口命名 linux 网络属于内核的功能, 配置方式: 静态指定:使用命令直接指定或修改配置文件 动态分配:依赖于本地网络中有DHCP服务 网络接口命名方式: 传统命

快速学习C语言三: 开发环境, VIM配置, TCP基础,Linux开发基础,Socket开发基础

上次学了一些C开发相关的工具,这次再配置一下VIM,让开发过程更爽一些. 另外再学一些linux下网络开发的基础,好多人学C也是为了做网络开发. 开发环境 首先得有个Linux环境,有时候家里机器是Windows,装虚拟机也麻烦,所以还不如30块钱 买个腾讯云,用putty远程练上去写代码呢. 我一直都是putty+VIM在Linux下开发代码,好几年了,只要把putty和VIM配置好,其实 开发效率挺高的. 买好腾讯云后,装个Centos,会分配个外网IP,然后买个域名,在DNSPod解析过去

Python网络编程基础笔记

第一部分:底层网络 第一章:客户/服务器网络介绍 1.1 理解TCP基础 TCP/IP事实上是一些协议的合集.当前大多数使用中的通信都使用TCP协议. 为了实现共享,TCP是通过把您要发送的数据流分解成很多小信息包在Internet上传输的(也许还伴有其他程序的信息包),而这些信息包到了接收者的地方会再次重新合成在一起. Internet连接就会用很少的时间来发送数据的每一个比特(bit),而其他程序的信息包也可以同时被传送. 1.1.1 寻址 第二章:网络客户端 第三章:网络服务器 第四章:域