위의 과정과 비슷하게 각 계층에서 층계별로 메시지를 전달하게 된다고 하는데 아직 감이 잘 안 오네요.
이번 시간에 URLSession을 이용해서 HTTP통신을 알아보겠습니다.
OSI(Open Systems Interconnection)
개방형 시스템 상호 연결?
우리가 사용하는 네트워크의 기본이 되는 모델로서 통신장비들 시스템마다 호환성 문제가 없도록 국제 표준으로 만든 것이 OSI MODEL이라고 합니다.
위 이미지와 같이 7개의 계층을 가집니다.
iOS 클라이언트 개발자인 저희는 이계층에서 가장 상위인 어플리케이션 레이어(응용계층)의 프로토콜인 HTTP프로토콜을 주로 다룬다고 합니다.
겹겹이 편지를 보내고 역순으로 열어보는 과정을 표현한 이미지입니다.
캡슐화와 디캡슐화를 표현한 것이라고합니다.
최상단 계층에서 하위 계층으로 전달될때 각각의 계층들이 인식될 수 있는 헤더를 붙이게 되는데
위 이미지의 헤더가 보이실 것입니다. 이것이 바로 처음에 편지를 쓰고 받아서 본인의 메시지를 다시 적는 행위와 같습니다.
봉투에 넣는 과정은 캡슐화라고 합니다.
이 데이터를 받는 입장인 클라이언트B입장에서는 바로 받는 것이 아니고 그렇게 붙여진 헤더를 하나하나 벗겨내면서 인지합니다.
이것을 디캡슐화 라고 합니다.
전체 계층 중에 미디어 레이어를 살펴보겠습니다.
이 세가지 계층은 iOS개발자 입장에서는 크게 와닿는 부분은 아닌 것 같지만 정리해보겠습니다.
1레벨 : 물리 계층
- 전압 레벨, 데이터 속도, 최대 전송거리, 커넥터
- 케이블, 모뎀, 리피터
물리 계층은 네트워크에서 통신 장비를 연결하는 데 사용되는 물리적 사양을 정의하게 돼요. 일단 네트워크를 하려면 이런 장치들이 필요하다라는 걸 의미합니다.
2레벨 : 데이터 링크 계층
- 데이터 오류 감지, 복구
- MAC 주소
데이터 링크 계층은 앞선 물리 계층의 물리적 네트워크 링크를 통해서 흐르는 이 데이터의 오류를 감지하고 복구하는 것을 제공합니다.
이 계층에 정의된 물리적 주소 지정은 장치가 데이터 링크 계층에서 어떤 주소로 지정될지 그 방법을 결정한다고 합니다.
ex)
모든 인터넷 네트워크 인터페이스 카드 (nic)의 하드 코딩된 맥주소.
세상에 존재하는 각 인터넷 nic에는 고유한 맥주소가 있습니다.
이 맥주소를 포함한 정보를 헤더에 싸서 다음 계층에 전달하게 되는데요.
어렵게 생각하실 필요 없이 여러분이 가지고 계신 맥북이나 아이폰도 고유한 맥 주소가 있어요.
설정해서 네트워크 쪽 확인해 보시면 여러분이 가지고 계신 각각의 기기의 웹 주소를 확인하실 수 있다고 합니다.
3레벨 : 네트워크 계층
- 논리 주소 정의
- IP 주소
네트워크 계층은 각 네트워크의 끝점 엔드 포인트를 식별하고 데이터 패킷을 전달하기 위해서 ip 주소와 같은 논리 주소를 정의.
현실에서 편지를 보낼때는 주소만 알면 되는 것처럼
네트워크 계층에서는 이런 우편 주소와 같은 역할을 하는 ip 주소를 정의.
4레벨 : 전송계층
- 데이터 흐름제어
- TCP, UDP
이 전송 계층에서는 데이터가 안정적으로 전달될 수 있도록 제어.
데이터를 보내는 쪽이 이걸 받는 쪽이 처리할 수 있을 만큼의 양을 전달하도록 흐름 제어를 하게 돼요.
TCP와 UDP란?
tcp와 udp 모두 네 번째 계층 프로토콜.
둘 다 보내는 쪽이 전달하는 데이터와 이것을 보내는 것에 대한 흐름 제어를 함.
책임감이라는 측면에서는 완전히 다르다.
tcp는 대사에게 데이터를 전달했을 때 이게 전달되었는지 안 되었는지를 확인해 주고 그 결과를 무조건 보장.
예를 들어서
데이터를 전달할 때 데이터가 손상될 가능성은 항상 있는데 이럴 경우에 tcp는 데이터를 조금 보내고 좀 기다려야 그리고 몇 초 지나서도 응답이 돌아오지 않으면 유실되었다고 판단하고 다시 보냅니다. 이러한 전체적인 제어나 관리.
반면에 udp는 좀 무책임.
잘 갔는지 안 갔는지 이런 것에 관심이 없고 확인하지 않습니다. 우리가 사용할 http 프로토콜은 이 책임감 있는 tcp 기반의 프로토콜
5레벨 : 세션 계층
- 통신 장치간의 상호작용 설정, 유지 , 관리
세션 계층은 세션을 시작하고 제어하고 관리.
세션은 서로 다른 네트워크 장치에 있는 앱 간에 발생하는 서비스 요청 그리고 그에 대한 서비스 응답 이렇게 구성이 되는데 통신 장치 간의 상호작용을 설정하고 유지하고 관리하고 이런 역할
로그인한 상태에서 오프라인 상태가 지속되면 세션이 종료되었습니다. 같은 표현을 프로그램에서 종종 보셨을 텐데요. 이렇게 서로 다른 네트워크 상에서 사용자 간의 포트 연결 즉 세션이 유효한지 확인하는 역할을 하는 것이 이 세션 계층입니다.
6레벨 : 표현 계층
- 7레벨에 적용되는 데이터 형식, 코딩, 변환 기능
- 파일 확장자
이 계층의 주요 기능은 상위 7번째 계층인 응용 계층 데이터에 적용되는 데이터의 형식,. 코딩, 변환 기능들을 정의.
한 시스템의 응용 계층에서 보낸 정보가 다른 시스템의 응용 계층에서 읽을 수 있도록 하는 것.
데이터의 암호화나 압축 이런 것도 이 프레젠테이션 계층의 기능으로 정의.
쉽게 생각하자면 os 단에서 표현하는 확장자라고 이해.
이미지 파일의 경우 jpg나 gif png 같은 확장자가 붙게 되는데요. 이렇게 긴 계층들을 통해서 전달하고 전달받은 데이터의 표현 형태를 제어하는 역할을 하게 됩니다. 얘는 이미지네 얘는 동영상이고 얘는 그냥 텍스트 파일이구나 하게 되겠죠. 그리고 os가 서로 다를 경우에 이 프리젠테이션 계층에서 정의한 기능을 서로 못 알아들을 수도 있어요. 예를 들면 윈도우에서는 인식하지만 맥에서는 인식하지 못하는 거라든가 그 반대의 확장자들이 있는데요. 바로 이 프리젠테이션 계층에서 정의되는 것입니다.
7레벨 : 응용 계층
- 앱 상의 네트워크
- HTTP
ios 개발자에게 닿는 최상단의 계층이자 우리에게는 가장 중요한 계층이라고 합니다.
응용 계층은 가장 상단에서 사용자와 상호작용하는 계층입니다.
네트워크 통신을 구현하는 소프트웨어 응용 프로그램 앱이라고 표현할수 있겠습니다.
이 앱에서는 이 osi 응용 계층을 사용해서 앱의 통신을 설정하게 돼요. 예를 들어서 통신 기능이 없는 워드 프로세서 같은 거 있잖아요. 아무런 싱크 기능이 없는 메모 앱 이런 경우에는 osi 응용 프로그램 계층과 사실 관련이 없어요.
반면에 통신 기능이 있는 앱인 경우에 예를 들면은 웹 브라우저나 아니면 이번에 우리가 만든 api 통신으로 데이터를 수신하고 우리가 그걸 뿌려줄 이런 우리의 샘플 앱은 반드시 이 응용 계층을 구현해야 합니다.
구현하는 방법은 무엇일까요?
여기서 알아야 할 개념이 URL입니다.
그동안 많이 접하고 사용했지만 정리해본 적이 없어서 정리해보겠습니다.
URL(Uniform Resource Locator)
네트워크 상에서 리소스들이 어디 있는지를 알려주기 위한 규약
보통은 url을 웹 주소로 많이 사용하죠. 특정 웹 페이지에 접속을 하거나 웹상에 파일이 갖는 링크로 이해하고 계실 건데요. 생각하시는 그게 url이 맞아요. 그렇지만 그냥 데스크탑에 있는 파일로 url을 가질 수 있어요.
즉 어떤 자원에는 반드시 url이 매칭이 됩니다. 자원이 가지는 주소값.
웹브라우저가 아래 형태의 url을 받았을 때 각각 요소에 따라 해독함.
http:// www.naver.com :8080 /ios-eigen
프로토콜
url이 어떤 프로토콜을 따를 건지를 알고 나면 웹 서버명 dns(네트워크 계층)명을 해독. -> ip 주소로 치환이 됩니다.
어떤 주소창에서는 생략이 되지만 포트명(전송계층)이 존재.
이 포트 값 뒤에는 리소스를 요청(응용계층)하는 줄. 리소스의 경로 명
이제 7번째 계층에서 가장 많이 사용할 프로토콜이 HTTP입니다.
그런데 HTTP 요청 중에서 Get과 POST의 차이점은 무엇이죠? 라고 물어봤을때 제가 시원하게 답변을 못할 것 같아서 정리해보겠습니다.
댓글