본문 바로가기

네트워크 공부

[ 네트워크 공부 ] TCP/IP 통신과 FTP

내일 당장 프로젝트에서 FTP를 버프스위트로 잡는 방식을 연습해야 하는데, 

정작 나는 TCP/IP에 대해서는 들어만 봤고 FTP 통신은 학교 수업에서 교수님이 FTP서버에 올려놓은

자료를 받아만 봤지 원리에 대해서는 전혀 모르고 있었다.

그리고 버프스위트 프록시가 어떤 원리로 HTTP통신 사이에서 패킷을 가로챌 수 있는지 등등..

근본적인 이해가 필요한 부분이라고 여겨졌다.

아무 설정도 하지 않은 상태에서는 버프 스위트는 HTTP 패킷만 잡을 수 있다고 한다.

 

인터넷 프로토콜

인터넷에서 컴퓨터들이 서로 정보를 주고받는 데 쓰이는 통신규약의 모음

그 중에서 TCP와 IP가 가장 많이 쓰이기 때문에 TCP/IP를 묶어서 자주 말한다.

 

TCP/IP 통신

TCP/IP 통신은 패킷 통신 방식의 IP와 전송 조절 프로토콜인 TCP로 이루어짐

TCP는 IP위에서 동작하는 프로토콜로, 데이터의 전달을 보증하고 보낸 순서대로 받게 해 준다.

HTTP,FTP,SMTP 등 TCP를 기반으로 한 많은 애플리케이션 프로토콜들이 IP위에서 동작하기 때문에

TCP/IP로 부른다. 결국 하나의 프로토콜이 아니라 TCP와 IP를 합쳐 부르는 말이다.

 

TCP / IP의 계층

Application Layer => 특정 서비스를 제공하기 위해 어플리케이션끼리 정보를 주고 받게 해줌

                                  > FTP, HTTP, SSH, Telnet, DNS, SMTP

Transport Layer => 송신된 데이터를 수신측 애플리케이션에 확실히 전달하게 해줌

                                  > TCP, UDP, RTP, RTCP

Internet Layer => 수신 측까지 데이터를 전달하기 위해 사용됨

                                  > IP, ARP, ICMP, RARP, OSPF

Network Access Layer => 네트워크에 직접 연결된 기기 간 전송을 할 수 있도록 사용됨

                                  > Ethernet, PPP, Token Ring

 

 

TCP/IP의 흐름

google.com을 웹브라우저에 입력하면 무슨 일이 일어날까?

위 url을 입력하면  구글 웹서버의 80포트로 아래와 같은 HTTP Request 메시지를 보내는 것임

메시지는 패킷이라고 하고 각 계층의 정보를 담아야 함

Ethernet IP TCP HTTP
Network Access Layer Internet Layer Transport Layer Application Layer

대강 이러한 계층의 정보를 가진 패킷을 생성하면 

OS (운영체제)가 DNS서버에게 요청을 보내게 되는데, 이 때 DNS서버는 컴퓨터마다 설정이 되어있다.

DNS는 53번 포트를 사용하고 Transport Layer에서 UDP라는 프로토콜을 사용함

 

> TCP는 연결지향형 프로토콜

통신이 이루어지기 전에 송신측과 수신측이 연결되는 작업이 필요하다.

3 Way Handshaking이라고 함

이 핸드쉐이킹을 수행하기 위해 TCP 헤더에 플래그들을 표시하게 되는데, 이때 플래그들을

컨트롤 비트라고 부름

3 Way Handshaking에서는 SYN과 ACK가사용됨

이제 HTTP 요청과 응답과정이 끝나면 연결을 종료해야하는데, 이때도 TCP의 컨트롤 비트가 사용됨

 

클라이언트가 서버에게 접속을 요청하는 SYN 패킷을 보냄

서버는 클라이언트에게 요청을 수락한다는 ACK과 SYN 플래그가 설정된 패킷을 보냄

클라이언트가 ACK 플래그 패킷을 보냄

이런 3가지의 과정을 거쳐서 서버와 클라이언트가 연결을 하게됨

 

 

이렇게 연결된 이후에 실제 데이터가 보내지게 되는데,

내가 사용하는 컴퓨터는 Private IP를 사용하고 있음

Private IP는 외부 환경에서 접속할 수 없어서 공유기를 통해 Public IP로 변경되어 나가야함

 

그렇게 나가면 여러 라우터를 통해 구글 서버에 도착하게 됨

이러한 과정을 라우팅이라고 함

 

라우팅을 통해 구글 서버가 연결된 라우터까지 데이터가 도착을 하면 패킷의 IP헤더에 기록된

구글 서버 IP주소를 통해 MAC주소를 얻어와야 함

이때 ARP 프로토콜을 통해 목적지 구글 서버까지 도착하게 되고

목적지 구글서버의 MAC주소를 획득하면 데이터가 물리적으로 전달되기 시작함

 

Internet Layer의 IP주소와 Network Access Layer의 MAC주소를 사용해서 올바른 구글 서버까지 도착을 했으니

Transport Layer의 포트번호를 읽고 80포트 번호로 데이터를 전달 후 Application Layer로 가서 HTTP Request 데이터를 얻을 수 있게 됨

 

이때 사용되는 게 소켓인데,

소켓은 소프트웨어로 작성된 추상적인 개념의 통신 접속점이다.

소켓은 응용 프로그램에서 TCP/TIP를 이용하는 창구 역할을 하며 응용 프로그램과 소켓 사이의 인터페이스 역할을 함

 

클라이언트 프로그램과 서버 프로그램은 각각 자신의 포트를 통해 통신해야 한다.

연결을 할 때도 포트를 사용하고 데이터를 교환할 때도 포트를 사용한다.

자바 프로그램 안에서 포트를 사용하기 위해서는 소켓을 이용해야 한다.

자바안에서 소켓의 종류에는 서버소켓과 클라이언트 소켓이 있다.

 

올바른 데이터를 받고 다시 클라이언트 측으로 데이터를 쏴준다.

 

클라이언트가 데이터를 받게 되면 이제 연결을 종료해야 한다.

종료할 때도 역시 플래그를 사용하게 되는데 총 4단계로 진행되며

이것을 4 Way Handshaking이라고 함 이때 사용되는 플래그는 FIN과 SYN, ACK이 사용된다.

 

 

TCP는 흐름제어, 오류제어, 혼잡제어를 통해 수많은 패킷들이 유실되지 않았는지 올바른 순서대로 도착하는지를 보증할 수 있습니다.

 

서버소켓, 클라이언트 소켓

서버 소켓은 말그대로 서버 프로그램에서만 사용하는 소켓이다. 서버 소켓은 클라이언트로부터 연결 요청이

오기를 기다렸다가 연결 요청이 들어오면 클라이언트와 연결을 맺고 다른 소켓을 만드는 일을 한다.

 

클라이언트 소켓은 기다릴 필요가 없기 때문에 바로 클라이언트 소켓을 생성한다.

클라이언트 프로그램에서 클라이언트 소켓은 서버 프로그램으로 연결요청을 하는 것과 데이터 전송을 하는 일을 한다.

 

자바로 예를 들자면,

서버 소켓의 경우는

ServerSocket server = new ServerSocket (포트번호);
Socket socket = server.accept();

이런식으로 사용하고

클라이언트 소켓의 경우는 밑의 코드처럼 사용한다.

Socket socket = new Socket (서버 아이피번호, 서버 포트번호);

 

데이터 전송방법
// 데이터 수신에 사용할 입력 스트림 객체를 리턴
InputStream input = socket.getInputStream();

// 데이터 송신에 사용할 출력 스트림 객체를 리턴.
OutputStream output = socket.getOutputStream();

//파라미터로 넘겨준 데이터 송신.
String data = "Hi~";
output.write(data);

// 수신부에서 데이터를 읽어서 리턴.
String data = input.read();

//소켓을 닫음.
socket.close();

//서버 소켓을 닫음.
serverSocket.close();

 

소켓통신의 흐름

1. 소켓을 생성

> 서버와 클라이언트 간 통신을 하기 위해서는 운영체제에

socket() 시스템콜을 통해 소켓을 생성

2. 소켓을 바인딩

bind() 시스템 콜을 사용.

>  소켓과 포트 번호를 결합하는 과정.

해당 포트가 사용중인지 아닌지를 확인하고 사용중이 아니라면 결합

3. 연결요청 대기

listen() 시스템 콜을 사용

> 클라이언트의 연결 요청이 수신될 때까지 대기

즉, 클라이언트에서 connect()를 사용할 때까지 대기

4. 연결을 허용

accept() 시스템 콜을 사용

> accept API에서 새로운 소켓을 만들어 해당 소켓으로 클라이언트와 연결

상위에서 사용했던 서버 소켓은 클라이언트 연결요청을 수신하는 소켓이고

실질적으로 연결되는 소켓은 accept() 를 통해 이루어짐

5. 송수신

read() write() 시스템 콜을 사용

> 데이터를 송수신 하는 과정은 클라이언트와 동일

6. 소켓연결 종료

close() 시스템콜을 사용

> 주의할 점은 close 대상이 두개라는 점

클라이언트와 연결에 사용했던 서버 소켓과

accept() 로 만들었던 소켓 

2개를 종료해야함

 

 

 

ARP

IP주소를 MAC주소로 바꿔주는 주소해석 프로토콜

 

FTP

> 2가지 포트를 씀

> 하나는 명령어를 제어하는 포트, 하나는 데이터를 전송하고 받는 포트

>파일 전송을 위해 만들어진 통신이기 때문에 대용량 파일 전송에도 좋고, 속도도 빠르다.

 

 

 

 


소스 참조

10분 테코톡 : TCP/IP 설명 : https://www.youtube.com/watch?v=BEK354TRgZ8 

TCP/IP 쉽게 이해하기 티스토리 : https://aws-hyoh.tistory.com/entry/TCPIP-%EC%89%BD%EA%B2%8C-%EC%9D%B4%ED%95%B4%ED%95%98%EA%B8%B0

널널한 개발자 TCP 송/수신 원리 설명 영상 : https://www.youtube.com/watch?v=K9L9YZhEjC0 

소켓 코드 참조 티스토리 : https://juyoung-1008.tistory.com/19

소켓 통신 흐름 티스토리 : https://ikcoo.tistory.com/119