양쪽 모두 데이터를 전솔할 준비가 되었다는 것을 보장하고, 실제로 데이터를 송수신하기 전 상대방도 준비가 되었는지 확인할 수 있도록 합니다.
즉, TCP/IP 프로토콜을 이용해서 전송을 할 때 정확한 데이터 전송을 위해 상대방 컴퓨터와 사전에 세션을 수립하는 과정입니다.
연결 수립 과정
Client에서 접속을 요청하는 SYN(SEQ) 패킷을 Server에 보냅니다. 이때 Client는 SYN 패킷을 보냄과 동시에 Server로부터 ACK 메시지를 받기 위한 SYN_SENT 상태로 바뀌게 됩니다.
Server에서 SYN 패킷을 받으면 요청을 수락하는 SYN(NEW SEQ)/ACK(SEQ+1) 패킷을 보낸 뒤 SYN을 받았다는 SYN_RCV 상태로 바뀌게 됩니다.
Client에서 SYN/ACK 패킷을 받으면 연결을 하자는 ACK(NEW SEQ+1)을 보낸 뒤 Client와 Server는 ESTABLISHED 상태로 연결됩니다.
4-way-hanshake
TCP 통신을 이용하여 데이터 송신이 끝난 뒤 연결을 해제하는 과정입니다.
연결 해제 과정
Client와 Server가 연결된 상태에서 Client가 연결을 끊기 위한 Close() 함수를 호출하며 FIN 세그먼트를 Server측에 보내며 FIN_WAIT1상태가 됩니다.
Server는 클라이언트가 연결을 종료한다는 것을 알게되고 ACK 세그먼트를 보낸 뒤 CLOSE_WAIT상태가 되고 Client는 FIN_WAIT2상태가 됩니다. 그 후 CLOSE_WAIT 상태가 끝나면 Server는 연결을 끊기 위한 CLOSE() 함수를 호출하며 Client로 FIN 세그먼트를 보냅니다.
FIN 세그먼트를 받은 Client는 Server로 ACK 세그먼트를 보낸 뒤 TIME_WAIT상태가 되며 전송 중이지만 아직 전송이 되지않은 데이터를 모두 받은 뒤 CLOSED상태가 되며 연결을 해제합니다.
PORT 상태 정보
CLOSED : 포트가 닫힌 상태
LISTEN : 포트가 열려있고 연결을 기다리는 상태
SYN_RCV : SYN요청인 연결 요청을 받고 상대방 응답을 기다리는 상태
ESTABLISHED : 포트 연결된 상태
플래그 정보
TCP 헤더에는 CONTROL BIT(플래그 비트, 6비트)각 존재하며, 각 bit는 "URG-ACK-PSH-RST-SYN-FIN"의 의미를 가집니다.
즉, 해당 비트가 1이냐 0이냐에 따라서 해당 패킷이 어떤 내용을 담고 있는지 나타냅니다.\
SYN(Synchronize Sequence Number) - 000010
연결 설정, Sequence number를 랜덤으로 설정하여 세션을 연결하는데 사용하며, 초기에 Sequence Number을 전송합니다.
ACK(Acknowledgement) - 010000
응답 확인으로 패킷을 받았다는 것을 의미합니다.
Acknowledgement Number가 유효한지를 나타냅니다.
양단 프로세스가 쉬지않고 전송한다고 한다면 최초 연결 설정 과정에서 첫 번째 세그먼트를 제외한 모든 세그먼트의 ACK bit는 1입니다.
FIN(Finish) - 000001
연결 해제로 세션 연결을 해제할 때 사용합니다.
*참고*
TCP 연결 과정에서 연결(3단계)와 연결 해제(4단계) 과정에서 단계 차이가 나는 이유는??
Client가 데이터 전송을 마쳤다고 하더라도 Server는 아직 보낼 데이터가 남아있을 수 있기 때문에 일단 FIN에 대한 ACK만 보내고, 데이터를 모두 전송한 후에 자신도 FIN 메시지를 보내기 때문입니다
만약 Server에서 FIN 플래그를 전송하기 전에 전송한 패킷이 Routing 지연이나 패킷 유실로 인한 재전송 등으로 인해 FIN 패킷보다 늦게 도착하는 상황이 발생하면 어떻게 될까?
이러한 현상에 대비하여 Client는 Server로부터 FIN 플래그를 수신하더라도 일정시간(Default: 240sec)동안 세션을 남겨 놓고 잉여 패킷을 기다리는 과정을 거칩니다. (TIME_WAIT 과정)
초기 Sequence Number인 ISN을 0부터 시작하지 않고 난수를 생성해서 설정하는 이유?
Connection을 맺을 때 사용하는 포트(Port)는 유한 범위 내에서 사용하고 시간이 지남에 따라 재사용된다. 따라서 두 통신 호스트가 과거에 사용된 포트 번호 쌍을 사용하는 가능성이 존재합니다
서버 측에서는 패킷의 SYN을 보고 패킷을 구분하게 되는데 난수가 아닌 순처적인 Number가 전송된다면 이전의 Connection으로부터 오는 패킷으로 인식할 수 있다. 이런 문제가 발생할 가능성을 줄이기 위해서 난수로 ISN을 설정합니다
OSI 7계층은 통신의 접속에서부터 완료까지의 과정을 7단계로 OSI에서 정의한 국제 통신 규약입니다.
OSI 7계층이 왜 필요한가?
연결되어 있는 컴퓨터들이 서로 정상적인 통신을 할 수 있으려면 정해진 규격대로 연결이 되어야지 통신을 할 수 있습니다.
실제로 이 규격이 만들어지기 전까지의 통신은 각 통신 업체 장비간의 통신만 가능했다고 합니다.
그래서 다른 통신 업체 장비간의 통신을 할 수 있도록 할 필요가 있었고, 통신의 흐름을 파악하기 쉽게 계층 하나하나를 모듈화 했습니다. 이 모듈화를 통해 각 계층은 독립적으로 구성이 되어있으므로 하나의 계층에 문제가 생기면 해당 계층만 고치면 되므로 유지관리가 수월해 집니다.
OSI (Open System Interconnection Reference Model)
국제표준화기구(ISO)에서 개발한 모델로, 네트워크 프로토콜 디자인과 통신을 계층으로 나누어 설명한 것 입니다. (프로토콜 기능별로 나눈 것이라 보면 됩니다.)
각 계층은 하위 계층의 기능만을 이용하고, 상위 계층에게 기능을 제공합니다.
프로토콜 스택은 이러한 계층들로 구성된 프로토콜 시스템을 가리키는데, 하드웨어나 소프트웨어 혹은 그 둘의 혼합으로 구현될 수 있습니다.
일반적으로 하위 계층은 하드웨어, 상위 계층은 소프트웨어로 구현됩니다.
OSI 7계층
1계층 (물리 계층) : 컴퓨터간 전기적인 연결을 담당하는 계층 - 통신 케이블, 허브 사용
물리 계층에서는 주로 전기적, 기계적, 기능적인 방법으로 통신 케이블을 통해 데이터를 전송합니다.
물리 계층에서는 PHY칩에서 데이터를 전기적인 신호로 변환해서전송(encoding - 0과 1의 데이터를 아날로그 신호), 수신(아날로그 신호를 0과 1의 데이터)하는 역할만 합니다.
데이터가 무엇인지 어떤 에러가 있는지 신경쓰지 않습니다.
이 계층에서의 대표적인 장비는 통신 케이블, 리피터, 허브가 있습니다.
전송 단위 : Bit
2계층 (데이터 링크 계층) : 노드간의 신뢰성 있는 전송을 보장하기 위한 계층으로 MAC Address를 가지고 통신합니다. - CRC(Cyclic Redundancy Check)기반의 오류 제어와 흐름제어, 이더넷 사용, 스위치 사용
물리 계층에서 수신 or 물리 계층에 송신되는 데이터의 오류와 흐름을 관리하여 안전한 정보의 전달을 수행(데이터의 앞 뒤에 특정한 비트열을 붙임)할 수 있도록 도와주는 역할을 합니다.
통신에서의 오류도 찾아주고 재전송하는 기능도 있습니다.
MAC 주소를 가지고 통신합니다.
이 계층에서의 전송단위는 프레임이라고 하고, 대표적인 장비로는 스위치(우리가 잘 아는 공유기가 여기에 해당), 브리지 등이 있습니다. (여기서 MAC 주소 사용)
브리지나 스위치를 통해 MAC 주소를 가지고 물리 계층에서 전송받은 데이터를 전달합니다.
포인트 투 포인트(point to point) 간 신뢰성 있는 전송을 보장하기 위한 계층으로 CRC기반의 오류 제어와 흐름제어가 필요합니다.
네트워크 위의 개체들 간 데이터를 전달하고, 물리 계층에서 발생할 수 있는 오류들을 찾아내고 수정하는데 필요한 기능적 수단을 제공합니다.
전송 단위 : Frame
3계층 (네트워크 계층) : 패킷을 네트워크간의 IP 주소를 통해 목적지까지 전달하는 계층입니다. - IP 사용
네트워크 계층에서 가장 중요한 기능은 데이터를 목적지까지 가장 안전하고 빠르게 전달하는 기능(라우팅)입니다. 여기에 사용되는 프로토콜의 종류도 다양하고, 라우팅하는 기술도 다양합니다.
경로를 선택하고 주소를 정하고 경로에 따라 패킷을 목적지까지 전달해주는 것이 네트워크 계층의 역할입니다.
대표적인 장비는 라우터이며, 요즘은 2 계층 장비 중 스위치에 라우팅 기능을 장착한 Layer 3 스위치도 있습니다. (여기서 IP를 사용)
여러개의 노드를 거칠 때마다 경로를 찾아주는 역할을 하는 계층으로 데이터를 네트워크들을 통해 전달하고, 그 과정에서 상위 계층인 전송 계층이 요구하는 서비스 품질(Qos)를 제공하기 위한 절차적/기능적 수단을 제공합니다.
네트워크 계층은 라우팅, 세그맨테이션, 오류제어, 흐름제어, 인터네트워킹등을 수행합니다.
데이터를 다른 네트워크를 통해 전달함으로써 인터넷이 가능하게 만드는 계층입니다.
전송 단위 : Datagram (Packet)
4계층 (전송 계층) : 데이터 전송을 담당하는 계층으로 데이터 용량, 속도, 목적지 등을 처리합니다. - TCP/UDP 사용
통신을 활성화하기 위한 계층입니다. 보통 TCP를 사용하며, 포트를 열어 응용프로그램들이 전송할 수 있게 합니다.
만약 데이터가 왔다면, 해당 계층에서 데이터를 하나로 합쳐서 세션 계층으로 전송합니다.
전송 계층은 양끝단(end to end) 사용자들이 신뢰성있는 데이터를 주고 받을 수 있도록 도와주고, 상위 계층들이 데이터 전달의 유효성이나 효율성을 생각하지 않도록 해줍니다.
시퀀스 넘버기반의 오류 제어 방식을 사용합니다.
전송 계층은 특정 연결의 유효성을 제어하고, 일부 프로토콜은 상태 개념이 있고(stateful), 연결 기반(connection oriented)입니다. 이는 전송 계층이 패킷들의 전송이 유효한지 확인하고 전송에 실패한 패킷들을 재전송한다는 것을 뜻합니다.
종단간 통신을 다루는 최하위 계층으로 기능은 오류검출 및 복구와 흐름제어, 중복 검사등을 수행합니다.
전송 단위 : Segment
5계층 (세션 계층) : 통신을 할 경우 host간 최초 연결을 하게되고 연결이 끊어지지 않게 유지하는 역할을 하는 계층입니다.
데이터가 통신하기위한 논리적인 연결을 합니다. 통신을 하기위한 대문이라고 생각하면 됩니다.
하지만 4계층에서도 연결을 하고 종료할 수 있기 때문에 우리가 어느 계층에서 연결이 끊어졌는지 판단하기에는 한계가 있습니다. 그러므로 세션 계층은 4계층과 무관하게 응용 프로그램 관점에서 봐야합니다.
세션 설정 생성, 유지, 종료, 전송 중단시 복구(체크포인트를 통해 동기화) 등의 기능이 있습니다.
세션 계층은 양 끝단 프로세스가 통신을 관리하기 위한 방법을 제공합니다.
동시 수신 방식(duplex), 반이중(half-duplex) 방식, 전이중 방식(Full duplex)의 통신과 함께 체크 포인팅과 유휴, 종료, 다시 시작 등을 수행합니다.
이 계층은 TCP/IP 세션을 만들고 없애는데 책임을 집니다.
6계층 (표현 계층) : 프로그램이나 네트워크를 위해 데이터를 표현하는 계층으로 암호화/복호화 작업이 이루어집니다.
코드간의 번역을 담당하여 사용자 시스템에서 데이터 형식상 차이를 다루는 부담을 응용 계층으로부터 덜어줍니다.
HIME 인코딩이나 암호화 등의 작업이 표현 계층에서 이루어집니다.
예를 들면, EBCDIC로 인코딩된 문서 파일을 ASCII로 인코딩된 파일로 바꾸어 주는 것, 해당 데이터가 TEXT인지, GIF인지, JPG인지 구분하는 것이 표현 계층의 역할입니다.
7계층 (응용 계층) : 사용자가 보는 부분으로 네트워크에 접속할 수 있도록 서비스를 제공합니다.
최종 목적지로서 HTTP, FTP, SMTP, POP3, IMAP, Telnet 등과 같은 프로토콜이 있습니다.
해당 통신 패킷들은 위의 프로토콜에 의해 전부 처리되며 우리가 사용하는 브라우저나 메일 프로그램은 프로토콜을 보다 쉽게 사용하게 해주는 응용프로그램입니다. 모든 통신의 양 끝단은 HTTP와 같은 프로토콜이지 응용프로그램이 아닙니다.
TCP/IP 4계층
1계층 (링크 계층)
물리적인 영역의 표준화에 대한 결과입니다. 가장 기본이 되는 영역으로 LAN,WAN과 같은 네트워크 표준과 관련된 프로토콜을 정의하는 영역입니다.
2계층 (인터넷 계층)
경로검색을 해주는 계층입니다. IP자체는 비연결지향형이며 신뢰할 수 없는 포로토콜입니다. 데이터를 전송할 때마다 경로를 선택해주지만, 일정하지 않습니다.
특히 데이터 전송 도중 경로상에 문제가 생기면 다른 경로로 선택해 주는데, 이 과정에서 데이터가 손실되거나 오류 등의 문제가 발생해도 해결해주지 않습니다.
3계층 (전송 계층)
데이터의 실제 송수신을 담당합니다. UDP는 TCP에 비해 상대적으로 간단하며, TCP는 신뢰성 있는 데이터 전송을 담당합니다. 하지만 TCP가 데이터를 보낼 때 기반이 되는 프로토콜은 IP입니다.
IP 계층은 문제가 발생해도 해결해주지 않는 신뢰할 수 없는 프로토콜입니다. TCP가 이것을 해결해줍니다.
데이터가 순서에 맞게 전송이 되었는지 확인해주며 대화를 주고 받습니다. 확인 절차를 거쳐 신뢰성 없는 IP에 신뢰성을 부여해줍니다.
4계층 (응용 계층)
서버와 클라이언트를 만드는 과정에서 프로그램의 성격에 따라서 데이터 송수신에 대한 규칙들이 정해지기 마련인데, 이를 통틀어서 응용 프로토콜이라고 합니다.