iOS Xcode13에서 pod init 실패하는 경우 해결방법!

|

개인공부 후 자료를 남기기 위한 목적임으로 내용 상에 오류가 있을 수 있습니다.


Pod init의 실패???

Xcode13으로 프로젝트를 생성 후 pod init을 하려하니 아래와 같은 이상한 에러가 발생한다.

――― MARKDOWN TEMPLATE ―――――――――――――――――――――――――――――――――――――――――――――――――――――――――――

### Command

/opt/homebrew/Cellar/cocoapods/1.10.1_1/libexec/bin/pod init


### Report

* What did you do?

* What did you expect to happen?

* What happened instead?


### Stack

   CocoaPods : 1.10.1
        Ruby : ruby 3.0.2p107 (2021-07-07 revision 0db68f0233) [arm64-darwin20]
    RubyGems : 3.2.22
        Host : macOS 11.4 (20F71)
       Xcode : 13.0 (13A233)
         Git : git version 2.32.0
Ruby lib dir : /opt/homebrew/Cellar/ruby/3.0.2/lib
Repositories : trunk - CDN - https://cdn.cocoapods.org/


### Plugins

cocoapods-deintegrate : 1.0.4
cocoapods-plugins     : 1.0.0
cocoapods-search      : 1.0.0
cocoapods-trunk       : 1.5.0
cocoapods-try         : 1.2.0

### Error

RuntimeError - [Xcodeproj] Unknown object version.
/opt/homebrew/Cellar/cocoapods/1.10.1_1/libexec/gems/xcodeproj-1.19.0/lib/xcodeproj/project.rb:227:in `initialize_from_file'
/opt/homebrew/Cellar/cocoapods/1.10.1_1/libexec/gems/xcodeproj-1.19.0/lib/xcodeproj/project.rb:112:in `open'
/opt/homebrew/Cellar/cocoapods/1.10.1_1/libexec/gems/cocoapods-1.10.1/lib/cocoapods/command/init.rb:41:in `validate!'
/opt/homebrew/Cellar/cocoapods/1.10.1_1/libexec/gems/claide-1.0.3/lib/claide/command.rb:333:in `run'
/opt/homebrew/Cellar/cocoapods/1.10.1_1/libexec/gems/cocoapods-1.10.1/lib/cocoapods/command.rb:52:in `run'
/opt/homebrew/Cellar/cocoapods/1.10.1_1/libexec/gems/cocoapods-1.10.1/bin/pod:55:in `<top (required)>'
/opt/homebrew/Cellar/cocoapods/1.10.1_1/libexec/bin/pod:23:in `load'
/opt/homebrew/Cellar/cocoapods/1.10.1_1/libexec/bin/pod:23:in `<main>'

――― TEMPLATE END ――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――

[!] Oh no, an error occurred.

Search for existing GitHub issues similar to yours:
https://github.com/CocoaPods/CocoaPods/search?q=%5BXcodeproj%5D+Unknown+object+version.&type=Issues

If none exists, create a ticket, with the template displayed above, on:
https://github.com/CocoaPods/CocoaPods/issues/new

Be sure to first read the contributing guide for details on how to properly submit a ticket:
https://github.com/CocoaPods/CocoaPods/blob/master/CONTRIBUTING.md

Don't forget to anonymize any private data!

Looking for related issues on cocoapods/cocoapods...
 - RuntimeError - [Xcodeproj] Unknown object version.
   https://github.com/CocoaPods/CocoaPods/issues/10984 [closed] [12 comments]
   5 days ago

 - Unknown object version
   https://github.com/CocoaPods/CocoaPods/issues/10973 [closed] [10 comments]
   3 weeks ago

 - RuntimeError - [Xcodeproj] Unknown object version.
   https://github.com/CocoaPods/CocoaPods/issues/7458 [closed] [21 comments]
   2 weeks ago

and 70 more at:
https://github.com/cocoapods/cocoapods/search?q=%5BXcodeproj%5D%20Unknown%20object%20version.&type=Issues&utf8=

처음보는 엄청난 에러창에 조금 놀랐지만, 해당 에러는 Xcode13 버그인걸로 보인다.
이를 해결하는 방법은 간단하다. 두가지 방법이 있는데…

첫번째 해결방법

터미널 콘솔에 아래 코드를 입력해준다.

sudo xcode-select -s /Application/Xcode-beta.app/Contents/Developer

두번째 해결방법

위 사진처럼 Project DocumentProject Format을 변경해준다.

  • Xcode 12.0-Compatible로 변경해주면 됩니다.

위 두 방법 중 하나를 선택해 pod init을 진행하면 해결완료!

Network TCP와 UDP

|

개인적인 연습 내용을 정리한 글입니다.
더 좋은 방법이 있거나, 잘못된 부분이 있으면 편하게 의견 주세요. :)


소켓을 공부하려다 보니 TCP/UDP 개념이 필요하게 되었습니다.
그 이유는 위 두개의 프로토콜이 소켓에서 데이터를 보내기 위해 사용하는 프로토콜이기 때문이죠!

TCP

인터넷 상에서 데이터를 메시지 형태로 보내기 위해 IP와 함께 사용하는 프로토콜

일반적으로 TCP와 IP는 같이 사용이 되는데, 이때 IP는 데이터의 배달을 처리한다면 TCP는 패킷을 추적 및 관리하게 됩니다.
이때 패킷이란 데이터 조각을 의미합니다. 인터넷 내에서 데이터를 전송하기 위해서는 데이터를 통쨰로 전송하지 않고 경로배정(라우팅)을 효율적으로 하기위해 데이터를 여러 조각으로 나누어 전송을 하게 됩니다. 이때 조각조각 나뉘어진 데이터를 패킷이라고 합니다. 이렇게 조각조각 나누어진 패킷에는 각각의 번호가 부여되고 해당 번호를 통해 데이터가 온전하게 전달되었는지를 확인할 수 있게 됩니다.

이러한 TCP의 특징은 아래와 같습니다.

  1. 3-Way Handshake
  2. 연결형 서비스로 가상회선 방식을 제공
  3. 흐림제어 및 혼잡제어
  4. 높은 신뢰성
  5. UDP보다 낮은 속도

1. 3-Way Handshake

첫번째 특징으로 3-Way Handshake는 목적지와 수신지를 정확히 하여 정확한 전송을 보장하기 위해 하는 방식을 의미합니다.
이러한 정확한 전송을 보장하기 위해 Ack와 재전송 을 이용한답니다.

TCP는 패킷을 받을 때마다 Ack라는 별도의 패킷을 만들어 보냅니다. 이때 Ack는 Acknoledge의 약자로 말 그래도 잘 받았다! 라는 의미로 사용합니다. 즉 송신자가 패킷을 보내면 수신자는 n번 패킷 잘 받았으니 n+1번 패킷 보내주세요 라는 Ack를 보내게 됩니다. 즉 이를 통해 데이터가 잘 오고 갔음을 체크할 수 있게 됩니다. 재 전송이라는 것은 말그대로 Ack가 오지않았을때 송신자가 다시 수신자에게 패킷을 보내는 것을 의미합니다. 이때 Ack가 오지않는 경우는 다음과 같은 두가지 경우입니다.

  1. 수신자가 패킷을 받지 못해 정말로 Ack를 보내지 못한 경우
  2. 수신자가 패킷을 잘 받아서 Ack를 보냈지만 중간에 Ack가 유실된 경우

둘중 어떤 경우로 인해 Ack가 안온지는 알 수 없지만, 송신자는 일정 시간동안 Ack가 오지않으면 패킷을 재전송합니다.
비효율적으로 보일지는 몰라고 데이터를 못받을 일은 없으니 확실히 안정적이게 됩니다.

2. 연결형 서비스로 가상회선 방식을 제공

가상회선을 제공한다는 것은 아래 사진과 같습니다.

이렇게 위 사진에서도 볼 수 있듯 패킷 1,2,3은 사이좋게 정해진 파란색(가상회선)으로 전달되어지고 있습니다.
바로 저 파랑색 선이 가상회선(논리적 경로)가 되는 것입니다.

TCP에서 가상회선을 배정해주기 때문에 패킷들은 이 회선을 따라 움직이기만 하면 됩니다.
이를 통해 알 수 있는것은 데이터들이 전달될때 패킷이라는 데이터 조각으로 조각조각 나누어 전달되는것처럼 보여도 사실상 가상회선을 따라 데이터들이 순차적으로 움직이고 있기 때문에 패킷의 순서가 뒤바뀔일도 없게 되는 것이죠.

3. 흐름제어 및 혼잡제어

TCP는 흐름제어와 혼잡제어가 가능합니다.

  • 혼잡제어: 데이터를 송신하는 곳과 수신하는 곳의 데이터 처리속도를 조절합니다. 이를 통해 수신자의 버퍼 오버플로우를 방지할 수 있게 되죠
    • 송신자가 미친듯이 데이터를 보내버리면 수신자에게 데이터 처리를 하는데 문제가 생길 수 있기 때문에 이를 조절해줍니다.
  • 혼잡제어: 네트워크 내 패킷 수가 넘치지 않게 방지합니다. 패킷의 수가 너무 많아지면 패킷을 조금만 전송하여 네트워크의 혼잡을 막는것이죠

이렇게 TCP는 기능은 많아보이지만 그만큼 CPU의 부담도 커지기때문에 속도가 느려진다는 단점이 존재합니다.

따라서 TCP는 연속적으로 데이터를 주고받을 때 보다는 신뢰성 있는 연결을 중시할 때 사용된다고 합니다.
연속적으로 데이터를 주고받는 다는 것은 쉽게 말해 영상같은 실시간 스트리밍 데이터를 주고받을 때를 생각하면 쉽게 이해할 수 있습니다. 영상 스트리밍의 경우 1초만에도 수많은 데이터 즉 엄청나게 많은 프레임 패킷을 받게 됩니다. 이럴때 프레임 패킷 하나가 손실되었다고 해서 다시 손실된 데이터를 요청한다면, 실시간이라는 것이 결국 의미가 없어지게 될 것입니다. 이때는 프레임패킷 하나 손실되었다 해서 재요청을 하는것보다는 무시하고 계속 재생되는 것이 중요할 테니까요.

UDP

UDP에서는 데이터를 데이터그램 단위로 처리하는 것이 특징입니다.

이 데이터그램은 독립적인 데이터 단계를 지니는 패킷을 의미하는데, UDP도 데이터를 받기 위해 TCP와 같이 IP를 사용합니다. 다만 소켓을 ㅁ나들어 서로 연결을 맺는 구조가 아닌 소켓을 만들어 그냥 UDP서버 IP, Port로 데이터를 보내버리는 개념입니다. 따라서 UDP 서버 하나에 여러 클라이언트들이 붙어 데이터를 받을 수 있게 되는 것을 의미합니다.

일반적으로 TCP를 전화에, UDP를 편지로 비교한다고 합니다.

  • TCP의 경우 상대방의 번호(IP, Port)를 통해 전화를 걸어 연결이 되면 서로 의사소통을 주고 받죠
    • 들었니? > 아니! 다시말해줘
  • UDP의 경우 상대방의 번호(IP, Port)만 알면 그냥 편지에 데이터를 써서 우체통에 넣어버립니다.
    • 수신자는 자신의 편지통에 편지가 왔는지 직접 확인할때까지는 알수가 없고, 송신자 또한 편지를 보내긴 했지만 실제 그 편지를 받았는지도 읽었는지도 중간에 사라져버렸는지도 확인할 수도 관심도 없습니다.

이러한 UDP는 TCP와 달리 비연결형 소켓이기 때문에 연결을 위해 할당되는 논리적 경로가 없는것이 특징입니다.

TCP와 달리 파란색 가상선이 존재하지 않는 것을 볼 수 있습니다.

그렇기 때문에 UDP는 데이터들이 서로 다른 경로로 전송이 되고 각각의 패킷은 독립적인 관계이면서 실제 보낸 순서대로 도착하지 않을 수도 있습니다.
이런 패킷들을 데이터그램이라 하고 이러한 방식은 UDP라고 합니다.

이러한 UDP의 특징은 아래와 같습니다.

  1. 비연결형 서비스로 데이터 그램방식을 제공
  2. 정보를 주고받을 때 Handshake와 같은 신호절차를 거치지 않음
  3. 최소한의 에러만 검출
  4. 데이터가 제대로 도착할수도, 중간에 유실될 수도, 순서가 바뀌어 도착할수도 있음
  5. TCP보다 빠른 속도
  6. 낮은 신뢰성

UDP의 경우 연결을 맺고 끊는 과정이 존재하지 않고, Ack를 보내지도 않으며, 패킷 순서를 부여하여 추적 관리하거나 혼잡, 흐름 제어도 하지 않기 때문에 속도가 빠르고 네트워크 부하도 적습니다. 그러나 중간에 패킷 손실과 같은 것을 체크할 수도 없기 때문에 데이터 전송면에서 신뢰성이 떨어지는 것도 사실입니다.

따라서 TCP와 반대로 UDP는 신뢰성보다 연속성이 중요한 서비스에서 사용되는것이 옳습니다.

Network 7계층(OSI)

|

개인적인 연습 내용을 정리한 글입니다.
더 좋은 방법이 있거나, 잘못된 부분이 있으면 편하게 의견 주세요. :)


보기전에 읽기 좋을 포스팅

Network TCP와 UDP 개념 설명

먼저 참고해보시고 아래글 읽으면 이해가 훨씬 수월해요!

OSI(Open Systems Interconnection) 7계층

개방된 시스템, 시스템 간의 상호연결성을 부여하는 표준
개방형 상호연결 시스템. 누구나 다 참조해서 장치를 만들거나 부가적으로 뭔가를 추가하는 것이 가능

우리가 보통 통신을 하기 위해 데이터흐름을 파악하기 쉽게 계층을 나눠놨고 그 계층 하나하나는 모두 모듈화가 되어있습니다. 하나를 통으로 만들어놓은 것이 아니라, 각각의 모듈로 따로 만들어져 조립한 것, 즉 융합이 되어있습니다. 이러한 네트워크 규격을 ISO가 발표를 했고 그게 바로 OSI 7계층이라고 합니다.

만약 우리가 자동차를 샀는데, 고장이 났다고 생각해봅시다. 자동차가 고장났다고 해서 자동차를 통으로 바꾸지는 않죠?
엔진이 고장나면 엔진만 고치면 되고, 타이어가 고장났다면 타이어를 고치면 됩니다. 그리고 자동차를 만드는 회사가 자동차의 모든 부품을 다 만들지도 않죠.

타이어 회사 따로있고, 엔진회사도 따로 존재합니다. 즉 자동차 하나를 만들기 위해서도 각 계층별로 모듈화가 되어있음을 의미합니다.
어느 규격을 만들어놓고 각 부품별로 모듈화가 되어있기 때문에 우리는 자동차가 고장났다고 해서 자동차 자체를 바꿀 필요도, 내 자동차 브랜드의 부품을 사야할 필요도 없는것 입니다. 이렇듯 모듈들이 융합 되어있기 때문에 어디서 고장났는지 파악하기도 쉽고, 교체도 원하는 부품으로 가능하고 설계도 단순해지는것 입니다.

더 나아가, 통신장치에서는 어떨까요? 여기서는 더 다양한 모듈들이 존재합니다.

만약 우리가 메일을 보낸다고 생각해봅시다. 어떻게 멀리있는 다른 지역, 혹은 다른 나라에 사는 친구한테 수많은 정보가 오가는 네트워킹 속에서 내가 원하는 사람 딱 그 사람에게 정확한 정보가 전달될 수 있는 걸까요? 이또한 유추해보자면 다양하고 복잡한 모듈들이 존재해 가능하다는 것을 볼 수 있겠죠. 위에서 말했듯 데이터를 통신하는 것 또한 데이터 흐름을 파악하기 쉽게 계층을 나눠놨고 각각 계층은 하나하나 모듈화가 되어있습니다. 이러한 모듈을 파악하기 위한 계층구조가 바로 OSI 7계층인 것입니다.

OSI 7계층의 특징

  1. 통신이 일어나는 과정을 7단계로 크게 구분해 한눈에 들어올 수 있도록 정의했다.
  2. 통신이 일어나는 과정을 단계별로 파악이 가능하다.
  3. 각 계층은 독립적이다. (-> 7단계 중 특정한 곳에 이상이 생기면 다른 단계의 장비 및 소프트웨어를 건들지 않고도 이상이 생긴 단계만 고칠 수 있다.)
  4. 따라서 OSI 7계층 모델을 알면 네트워크 구성을 예측하고 이해할 수 있다.

용이성, 유지관리의 수월성

OSI 7계층 각각은 무엇인가?

각 계층은 네트워크 통신에 필요한 기능들을 크게 물리계층, 데이터링크계층, 네트워크계층, 전송계층, 세션계층, 표현계층, 응용계층 이렇게 7개로 구분하여 나누었습니다. 크게 말하면 물리계층은 하드웨어, 데이터링크 계층이 하드웨어+소프트웨어, 이외 계층은 모두 소프트웨어입니다.

모듈이 아닌 왜 계층이라는 단어를 사용한걸까?

상하구조를 가지기 때문입니다. 상위 계층의 프로토콜이 제대로 동작하기 위해서는 반드시 하위의 모든 계층에 아무런 문제가 없어야합니다. 즉 7계층이 제대로 동작하기 위해서는 하위의 1,2,3,4,5,6 계층이 모두 완벽해야한다는 것이죠. 간단하게 물리적 회선이 연결되어 있어야 데이터를 보낼 수 있기 때문입니다.

물리계층(Pshtsical Layer)

통신을 하기 위해서는 매체가 필요합니다. 흔히 우리가 사용하는 매체는 전도성이 좋은 구리입니다.
물리계층 이름에서도 짐작 가능하듯 우리에게는 전기신호를 주고 받을 매체가 반드시 필요합니다. 신기하게도 컴퓨터 또한 전기로 데이터를 정의하는데, 이를 정의하는 기준은 단순하게도 전기가 흐른다or 전기가 흐르지 않는다 단 두가지만으로 정의가 됩니다. 따라서 컴퓨터 언어를 이진수 체계라고도 하는 것 입니다. 0과 1만으로 다른사람들과 통신을 주고받는다는 것을 의미하죠.
통신단위는 비트: 0과 1로 나타내어지는 전기적 온 오프 상태를 의미

따라서 간단하게 말해 물리계층은 전기적 특성을 이용해 신호를 만드는 역할을 의미합니다.
신호를 주고받기 위한 전기적, 과학적, 전파적 특성을 정의하는 계층이죠.

그렇다면 0과 1만으로 도대체 무얼 어떻게 전달한다는 걸까요?

컴퓨터는 0과 1만으로 100010100 이런식의 이진수만으로 데이터를 표현합니다.

즉, 0과 1로만 이루어진 디지털 시그널을 전압으로 전달해야 그 신호를 가지고 사람들은 데이터를 줄 수 있습니다. 반대로 데이터를 받기 위해서는 이러한 디지털 시그널을 전압으로 변형을 해야하는 과정을 거쳐야겠죠. 위에서 말했듯 이러한 전기적 특성을 이용해 신호를 만드는 역할을 수행하는 것이 바로 물리계층입니다.

우리가 너무나 당연하게 사용하는 렌선케이블.. 이게 바로 물리계층에 해당하는 장비이고 이 케이블을 통해 신호가 왔다갔다하게 됩니다.
이러한 물리적인 것 외에도 와이파이, 블루투스 등 공기가 전달 매체인 경우도 모두 물리계층에 해당하는 장비입니다.

쉽게 생각하자면, 통신을 하기 위해 가장 최 앞단, 물리적인 부분에 위치한 것이 바로 물리계층인 것입니다.

  • 통신 케이블, 리피터, 허브, 모뎀 등…

물리계층의 특징

  1. 전기적, 기계적, 과학적, 기능적인 여러 특성을 이용해 통신 케이블로 데이터를 전송
  2. 단지 데이터를 전달할 뿐, 데이터가 무엇인지, 어떤 에어가 있는지, 어떤것이 더 효과적으로 데이터를 보내는지는 관여하지 않음
  3. 장비와 장비 사이 0과 1을 구분할 수 있도록 두 기기의 물리적 계층이 신호 규칙에 합의해야 함
  4. 전기적, 기계적 연결을 통해 데이터 비트를 전송

물리계층은 하드웨어적 특성을 가지고 있고, 네트워크 계층부터는 소프트웨어적 특성을 가지고 있다 말씀드렸었습니다.
이런 가운데 데이터 링크계층은 하드웨어적 특성과 소프트웨어적 특성을 둘다 가지고 있는 것이 특징입니다.

쉽게 생각해보자면, 소프트웨어로부터 정보를 전달받으면 하드웨어로 연결해주는 연결다리 역할이라고 생각하면 될 것 같습니다.
혹은 반대로 하드웨어(회선)으로부터 받은 데이터를 받아 우리가 받아볼 수 있도록 소프트웨어 특성을 같인 계층으로 전달해주는 것을 생각해볼수도 있겠죠.

위 이미지를 보면 데이터 링크계층으로부터 물리적 계층이 데이터를 전달받아 랜선과 같은 전달 매체를 통해 상대방의 물리적 계층으로 시그마를 보내는것을 알 수 있습니다. 쉽게 말해, 물리적인 매체를 통해 데이터를 보내야 하고, 그렇기 때문에 데이터 링크 계층에서 뭔가를 받게 되는것을 의미합니다. 데이터를 보내기 위해서는 회선과 같은 매체로 연결이 되어있어야 하니 데이터링크 계층은 물리계층보다 위에 있게 되는 것이죠. 상하관계를 쉽게 이해할 수 있을 것 같습니다 :)

막연하게 우리는 IP주소를 알면 네트워크를 통해 통신이 가능하단 것을 알고 있스빈다. IP는 마치 주소와도 같기 때문에 이 같은 통신이 가능한 것인데.. 모든 컴퓨터의 IP 주소를 다 알 수 없는데, 컴퓨터는 어떻게 통신을 하고있는 걸까요?

만약 제가 제 컴퓨터를 통해서 미국에 있는 A라는 컴퓨터 IP 주소를 지정해주고 메시지를 전달해줘. 라고 요청했다고 가정해봅시다.

이때 데이터링크 계층에서는 연결되어있는 바로 이웃 컴퓨터와의 통신만을 생각하는 것이 특징입니다.
우리는 통신을 할때 어디 어디를 다 들려서 통신해줘. 라고 요청하지 않고 목적지의 IP만 전달해주고 통신을 요청합니다.

위 사진에서처럼 말이죠.

데이터 링크 계층은 직접 연결된 서로 다른 2개의 네트워크 장치간의 데이터 전송을 담당하는 계층입니다.
즉, 직접 연결되지 않은 장치에는 데이터를 보낼 수 없는것이 특징입니다. 그렇기 때문에 데이터링크 계층은 이웃간의 전송에만 신경을 쓸 뿐, 그 길이 맞는지 아닌지를 데이터링크 계층에서 판단하지는 않습니다. 그 영역은 바로 네트워크 계층에서 이루어지게 됩니다. 단순히 직접 연결된 장치하고만 통신하지, 이웃장치를 넘어서는 통신의 문제는 생각하지 않는것이 그 특징입니다.

후에 이를 담당하는 역할은 네트워크 계층의 IP 프로토콜입니다 :)

네트워크 계층(Network Layer)

물리계층의 아날로그 신호는 거리가 먼 지점까지 전달되지 않는 것이 특징입니다. 신호를 세게 해주는 ‘리피터’라는 장비를 사용할수는 있지만, 이는 특정 지점에 전달하기 보다 무분별하게 전달을 하기 때문에 효율이 떨어집니다. 이를 해결하기 위해 사용하는 장비가 바로 라우터 입니다. 무분별하게 신호를 전파하는 리피터와는 다르게 라우터는 내장된 라우팅 알고리즘을 통해 전달할 수 있는 가장 가까운 라우터까지의 경로를 결정하고 이를 저장합니다. 이러한 행위를 라우팅 이라고 합니다.

경로가 결정되면 전달해야할 데이터를 다음 라우터에게 전달합니다. 라우터에서 라우터 > 이렇게 N개의 라우터가 지속적으로 정보를 전달하면서 최종 목적지까지 전달하는 방법을 포워딩 이라고 표현합니다. 이때 정보를 전달받는 라우터는 본인이 최종 목적지인지 여부와 응답 데이터를 다시 출발지 라우터로 보내기 위한 데이터가 필요합니다.

즉 전달해야하는 데이터는 출발지 정보, 목적지 정보가 부가적으로 필요하고 해당 정보는 위에서 언급했던 IP 라는 정보로 처리됩니다.

이때 전달 데이터에 IP 정보를 붙인 데이터를 패킷 이라고 부릅니다.

네트워크 계층의 특징

  1. 데이터링크 계층에서 넘어온 데이터를 패킷으로 만들거나, 수신된 패킷 데이터를 해석
  2. 다음 라우터의 경로를 찾기 위한 라우팅을 진행
  3. 패키 전달의 역할을 다음 라우터에게 위임하는 포워딩 진행

데이터를 패킷 단위로 분할해 전송하는 네트워크 계층의 가장 주된 역할은 최적의 경로를 선택 하는 것 입니다. 데이터가 수신자에게 도착하기까지 여러 시스템을 거치게 되는데, 이때 올바른 경로를 선택할 수 있게 하는 라우팅 기능을 지원하는 것이고 경로 선택 외에도 한곳으로 트래픽이 몰리지 않도록 제어하며 패킷의 분할 및 병합, 두개 이상의 네트워크를 연결하는 등의 역할을 수행하는것이 특징입니다.

전송 계층(Transport Layer)

일반적으로 데이터 통신은 여러 프로그램들이 동시 다발적으로 진행이 되는 것이 특징이죠.
그렇기 때문에 어떤 특정한 데이터가 어떤 프로그램과 관련이 있는지 식별할 수 있는 것이 큰 관건입니다. 이를 식별하기 위한 데이터가 포트번호 입니다.

전송계층에서는 하위 계층에 데이터를 전달할 때 데이터에 포트번호를 붙이며, 하위 계층으로부터 데이터를 전달받을 때에도 포트번호를 통해 데이터를 식별합니다.
이때 테이터 통신 프로토콜에 따른 알고리즘이 수행되는데 그 대표적인 예가 TCP/UDP 프로토콜입니다.

즉, 전송계층에서는 양 끝단의 사용자들이 신뢰성있는 데이터를 주고받게 해주는 역할을 하게 됩니다. 말 그래도 송/수신 측의 실질적인 연결을 설정하고 신뢰성 있는 통신이 될 수 있도록 가능하게 하는것이 역할입니다. 즉 전체 메시지의 전송을 책임진다고 볼 수 있는 것이죠.

위 그림과 같이 순차번호 기반의 오류제어 방식을 사용하고 신뢰성 있고 효율적인 데이터를 전송하는 것이 특징입니다.

보통 TCP 프로토콜을 이용하는데, 이를 통해 포트를 열어 응용프로그램이 전송을 할 수 있도록 도와줍니다.
이때 데이터 전송을 위해 포트 번호가 사용되는 것이고 그 대표적인 프로토콜이 TCP와 UDP가 있는 것이죠.

세션계층(Session Layer)

세션 계층은 통신 세션을 구성하는 계층으로 포트번호를 기반을 통해 연결합니다.
이때 세션은 데이터가 통신하기 위한 논리적인 연결을 의미하는데, 통신을 하기 위한 문이라고 생각하면 쉽습니다.

이러한 세션계층은 응용 프로그램 간의 대화를 유지하기 위한 구조를 제공하고, 이를 처리하기 위해 프로세스들의 논리적인 연결을 담당하는 계층입니다. 통신 중 연결이 끊어지지 않도록 유지시켜주는 역할을 수행하기 위해 TCP/IP 세션 연결의 설정과 해제 등의 기능을 수행합니다(os에서 진행) 즉, 응용 프로그램들 사이의 접속을 설정하고 유지하며 데이터 전송 시 동기점을 제공함으로써 오류 발생 시 데이터를 재전송 하거나 복구할 수 있도록 도와주는 역할을 합니다.

예로 로그인을 생각해봅시다. 로그인을 통해 다양한 응용프로그램과 세션을 이루면서 데이터를 주고 받습니다. 여러 프로그램에 동시에 로그인을 할수도 있고 로그아웃을 하기 전까지 통신관리 및 동기화를 이룰 수 있죠.

표현계층(Presentation Layer)

데이터의 표현 방식에 관한 서비스가 이루어지는 것이 표현 계층입니다. 번역기를 생각하면 이해하기 쉬운 개념입니다.
말 그대로 송/수신자가 서로 다른 문자를 사용하는 경우 번역해서 일관된 데이터 전송으로 인해 서로 이해할 수 있도록 돕는 역할을 합니다.

암호화된 데이터의 해독을 수행하고 필요에 따라서는 데이터 압축 기능을 제공하기도 합니다.

응용계층(Application Layer)

사용자에게 직접 제공되는 서비스나 프로그램의 대부분은 응용계층에 해당됩니다.

응용 어플리케이션이라고도 불리며 사용자의 명령에 따라 특정 작업을 수행하는 소프트 웨어나 인터페이스를 제공하는 여러 프로토콜 등 다양한 범주에서 정보를 처리하는 역할을 수행합니다. 이러한 응용프로그램은 앞서 발생했던 요구사항을 처리하기 위해 네트워크 통신을 이용한 데이터의 송/수신이 발생하는 가장 마지막 영역을 의미합니다.

운영체제는 전송 계층에서 제공하는 API를 활용해 네트워크 통신을 가능토록 API를 제공하는데, 이를 소켓 API 라고 합니다.

해당 계층은 소켓 프로그래밍을 통해 데이터를 송/수신 합니다.
이렇게 해당 계층의 역할은 개발된 프로그램이 수행하게 됩니다.

iOS UITextField 각종 옵션들 정리

|

개인공부 후 자료를 남기기 위한 목적임으로 내용 상에 오류가 있을 수 있습니다.


UITextField

ClearButton(내용 삭제)

  • never: 모든 경우 보이지 않음
  • while editing: 입력 중인 경우 버튼이 보임
  • unless editing: 입력이 완료되어야 버튼이 보임
  • always: 모든 경우에 버튼이 보임

Adjust to Fit

텍스트필드의 크기가 줄어들 때 텍스트의 크기도 줄여야할지를 지정해 줌

  • min Font Size: 폰트 최소 크기를 지정

Text Input Traits

  • Capitalization: 첫 글자를 자동으로 대문자화
  • Keyboard Type
    • Number Pad: 숫자만 입력 > Return Key 없음
  • Return Key
    • Auto-enable Return Key: 글자가 없을 경우 리턴 키 비활성화 하고 싶다면 사용 > true
  • Secure Text Entry: 비밀 번호의 경우 true 로 지정

Autoresize Subviews

뷰의 크기가 변할 때 하위 뷰의 크기를 변경하게 해줄지를 지정해 줌(default: false)

iOS Grouped로 지정된 tableview의 top 여백 지우는 방법

|

개인공부 후 자료를 남기기 위한 목적임으로 내용 상에 오류가 있을 수 있습니다.


Grouped Tableview

그룹으로 지정한 테이블뷰의 top 부분의 여백이 나오는 경우가 있다.
해당 여백은 아래 코드로 지우기 가능하다.

private let tableView: UITableView = {
    let tableView = UITableView(frame: .zero, style: .grouped)
    tableView.tableHeaderView = UIView(frame: CGRect(x: 0, y: 0, width: 0, height: 0.1))
    return tableView
}()