Transport Layer

Transport Layer(전송 계층)은 End Point 간 신뢰성 있는 데이터 전송을 담당하는 계층입니다. 데이터를 순차적이고 안정적으로 전달해주며, 포트 번호에 해당하는 프로세스에 데이터를 전달합니다. 데이터의 순서를 보장하고, 송수신 과정에서 메모리 한계로 데이터가 누락되거나 통신 속도가 느려지는 것을 방지합니다.

TCP(Transmission Control Protocol)

전송 계층에서 대표적인 프로토콜이 TCP입니다. 이를 통해 신뢰성 있는 데이터 통신이 가능하게 해준다고 할 수 있습니다. 커넥션을 연결할 때, TCP 헤더 안에 있는 9개의 플래그 비트를 사용합니다.

flag, 플래그 : 프로그래밍에서 특정 동작을 수행할지 말지를 결정하는 1비트 변수를 의미합니다. true/false와 같이 2가지의 약속된 신호를 남기기 위해서 사용합니다.

3-way handshake

TCP에서 커넥션 연결을 위해서 쓰리 웨이 핸드쉐이크라는 방식을 사용합니다. 그 동작 과정은 다음과 같습니다.

  1. 클라이언트가 서버에게 SYN 비트를 1로 설정해서 패킷 송신을 합니다.
  2. 서버가 클라이언트에게 SYN, ACK 비트를 1로 설정해서 패킷 송신을 합니다.
  3. ACK 비트를 1로 설정해 패킷 송신을 합니다.

위 과정이 정상적으로 이루어졌다면, 커넥션 연결에 성공했고 클라이언트와 서버의 상태는 established로 변경됩니다.

4-way handshake

TCP에서 커넥션 종료(connection close)를 위해서는 포 웨이 핸드쉐이크 방식을 사용합니다.

패킷 : packet(package + bucket)으로, 네트워크를 통해 전송하기 쉽도록 자른 데이터의 전송 단위이자 형식화된 블록입니다. 패킷은 제어 정보와 사용자 데이터로 이루어지는데, 이를 페이로드(payload)라고도 합니다. 패킷 형식으로 데이터를 보낼 때, 장문의 메시지를 더 효과적이고 신뢰성 있게 보낼 수 있다는 장점이 있습니다.

페이로드 : 데이터가 전송될 때, 데이터에는 헤더 정보와 실제 데이터를 모두 포함합니다. 헤더에는 패킷의 소스 및 대상을 식별하는 정보가 있고, 실제 데이터는 '페이로드'라고 합니다. 헤더 정보(오버헤드 데이터)는 전송 프로세스에서만 사용되기 때문에, 목적지에 도달하면 패킷으로부터 벗겨집니다.

Closure

자바스크립트 함수의 정의는 정적 스코프(static scope or lexical scope)를 채택하고 있습니다. 따라서 함수의 유효범위는 함수를 어디서 호출했느냐가 아니라, 어디서 정의했느냐에 따라 다르게 정해집니다. 정의를 단 한번만 하기 때문에 정해지고 바뀌지 않는 것입니다.

함수 내에서 또 다른 함수를 정의하면, 자식 함수에서 부모 함수가 가진 변수나 메소드를 참조하여 사용할 수 있습니다. 이를 클로저라고 합니다.

Call Stack(호출 스택)

콜 스택은 여러 함수들을 호출하는 스크립트에서 해당 위치를 추적하는 인터프리터를 위한 메커니즘입니다. 가장 대표적인 인터프리터에는 웹 브라우저의 자바스크립트 인터프리터가 있습니다. 콜스택을 통해 현재 어떤 함수가 동작하고 있는지, 그 함수 내에서 또 어떤 함수가 동작하는지, 다음에는 어떤 함수가 호출되어야 하는지에 대해서 제어해줍니다.

동작 구성단계는 다음과 같습니다.

  1. 스크립트가 함수를 호출하면, 인터프리터는 이를 호출 스택에 추가한 다음 함수를 수행합니다.
  2. 해당 함수에 의해 호출되는 모든 함수는 호출 스택에 추가되며, 호출이 도달하는 위치에서 실행합니다.
  3. 메인 함수가 끝나면 인터프리터는 스택을 제거하고, 메인 코드 목록에서 중단된 실행을 다시 시작합니다.
  4. 스택이 할당된 공간보다 많은 공간을 차지하면 '스택 오버플로우' 에러가 발생합니다.

Scope

스코프는 현재 실행되는 컨텍스트를 의미합니다. 컨텍스트는 변수나 메소드와 같은 표현식을 같은 스코프 내에 있다면 참조해서 사용할 수 있습니다.

그리고 스코프는 계층적인 구조를 갖기 때문에 하위 스코프는 상위 스코프를 접근할 수 있지만, 반대로는 불가합니다.

부모 함수에 있는 변수와 메소드를 자식 함수가 참조할 수 있습니다. 이때 반드시 부모 함수 내부에 자식 함수가 정의되어 있어야 합니다.

전역 영역에 정의된 변수나 메소드는 최상위 요소이기 때문에, 어느 곳에서든 참조해서 사용할 수 있는 것입니다.

execute context(실행 컨텍스트)

문자 그대로의 뜻은 '상황, 맥락, 문맥 상의 의미'를 갖고 있습니다. JavaScript에서의 컨텍스트는 실행에 필요한 다양한 정보를 형상화하고, 이들을 목록화 관리하기 위한 추상적인 개념입니다. 또한 다음과 같은 더 구체적인 정보들을 포함하고 있습니다.

1. 실행 가능한 코드가 실행되는 프로그램 환경

2. 실행에 필요한 정보들로써 변수의 유효 범위(scope), 유효 기간(lifetime)의 결정을 위한 환경 정보들

  • 전역변수, 지역변수, 매개변수, 객체의 프로퍼티
  • 함수 선언 정보
  • 변수의 유효범위(scope)
  • this가 참조하는 정보

위와 같은 정보를 객체 형태로 담아 스택(LIFO)으로 관리합니다. 자바스크립트 엔진은 코드를 읽어내려가며, 실행 가능한 코드를 만나면 코드를 평가해서 실행 컨텍스트를 만들어냅니다.

얉은 복사 & 깊은 복사

깊은 복사는 복사본을 만들 때 사용한 원본과 동일한 참조를 공유하지 않는 복사입니다. 따라서 원본을 수정해도 복사본은 영향을 받지 않고, 복사본을 수정해도 원본은 영향을 받지 않습니다.

반대로 얇은 복사는 원본 또는 복사본을 수정했을 때, 서로 영향을 받아 동일하게 수정됩니다. 이는 두 객체가 동일한 참조값을 갖기 때문입니다.

얉은 복사 : 수정 시 영향 받음
깊은 복사 : 수정 시 영향 안 받음

Array Method

얇은 복사로 기존 배열 자체를 수정하는 메소드가 있고, 깊은 복사로 새로운 배열을 반환하여 기존 배열에 영향을 주지 않는 메소드가 있습니다. 이를 잘 구분하여 상황에 맞는 메소드를 사용할 필요가 있습니다.

  • concat() : 기존에 배열에 인자로 주어진 배열을 합쳐서 새로운 배열로 반환합니다.
  • forEach() : 각 항목을 돌면서 주어진 매개변수와 콜백함수를 이용해서 동작을 수행합니다.
  • find() : 각 항목을 돌면서 주어진 조건에 해당하여 true인 첫번째 항목값을 반환합니다.
  • findIndex() : 각 항목을 돌면서 주어진 조건에 해당하여 true인 첫번째 항목의 인덱스값을 반환합니다. true인 값이 없으면, -1을 반환합니다.
  • filter() : 각 항목을 돌면서 주어진 조건에 해당하는 모든 값을 배열에 담아서 반환합니다.
  • map() : 각 항목을 돌면서 주어진 동작을 실행하고, 그 결과값을 새로운 배열로 반환해줍니다.
  • sort() : 원본 배열 자체를 주어진 조건에 맞게 재정렬해줍니다.
  • reduce() : prev(누적값, previous)과 cur(현재값, current) 그리고 초기값을 이용해서 특정한 연산을 누적시켜 실행시킬 수 있습니다. 만약 초기값을 전달하지 않으면, 배열의 첫번째 값이 초기값으로 설정됩니다. 그리고 단순 연산 뿐만 아니라, 배열 및 객체를 수정하고 생성하는 동작도 가능합니다.

패킷 교환 방식
호출 스택
Context 컨텍스트, 상황 (Context)
JavaScript에서 개체 복사
자바스크립트 중급 강좌 #7 - 배열 메소드1(Array methods)
르윈의 TCP UDP
http://wiki.hash.kr/index.php/%ED%8C%A8%ED%82%B7

profile
Front-end | Web Develop | Computer Science 🧑🏻‍💻

0개의 댓글