2020-02-14 TIL

할 일 목록

  • 코틀린 어제자 녹취록 작성
  • 네트워크 시험문제 발제

완료하지 못한 목록

완료 목록

5Fs

1. Fact

1. 네트워크

  1. 4계층의 역할과 개요

    • TCP

      1. 에러복구

        • 세그먼트를 수신하면 수신한 것을 송신처에게 전달하는 것을 응답확인이라고 함.

          • 확인 응답 번호로 다음에 받을 데이터 번호를 알린다.
        • 시퀀스 번호는 보내는 데이터의 앞 부분에 있는 옥텟 번호이고, 확인응답 번호는 다음에 받고 싶은 데이터의 선두 옥텟 번호이다.
      2. 흐름제어
      3. 커넥션을 맺는다.

        • 데이터를 통신하기 전에 사전에 가상 통신로를 확보하는 것.
        • 커넥션 확립 과정

          1. 통신로를 확보하기 위해 상대에게 데이터 전송의 허가 요청을 함.
          2. 그것에 대한 허가를 송신처에게 알림과 동시에 수신처 측이 데이터 전송 허가요청을 함께 보냄
          3. 송신처도 데이터 전송 허가를 보내면서 상방향의 통로를 확보
          4. 위의 과정을 3way handshake라고 한다.
          5. 커넥션을 끊기 위해 4way handshake를 한다.

            • 중간에 wait하는 시간이 있는데, 아직 상대방은 끊은지 모르고 보낼 수 있기 때문에 wait이 존재한다.
      4. TCP는 어플리케이션으로 부터 받은 데이터를 세그먼트로 캡슐화한다.

        • 캡슐화 할 때 한개의 데이터를 MSS(Max Segment Size)로 분할
        • 각각의 세그먼트에 번호를 부여하고, 이 번호를 시퀀스 번호라고 한다.
      5. RTT(Round Trip Time) : 지금까지 보낸 데이터에 대해 확인응답이 돌아오기 까지 걸린 시간을 계산함.
      6. 윈도우 제어: 위의 방법을 쓴다면, 응답 확인이 오기 전까지는 다음 패킷을 전송하지 않는데 그러면 효율이 좋지 못하다. 그래서 한번에 패킷을 여러개 보내는 방법을 사용하는데, 이곳에서 윈도우 제어를 사용한다. 버퍼를 사용하여 해당 버퍼의 양이 다 전송완료 되면 다음 패킷들을 보낸다. 또 어느정도 버퍼량을 갖는지 서로 공유하여 윈도우 사이즈만큼 데이터를 보내 오버플로 하지 않는다. 확인응답을 기다리지 않고 보낼 수 있는 데이터을 윈도우사이라고 할 수 잇다.

        • 윈도우 사이즈로 상대방에게 자신의 버퍼량을 전달해서 수신할 수 있는 용량을 조절한다.
    • UDP
  2. 포트번호

    • port number : 어플리케이션이 송신한 데이터인지 어느 어플리케이션이 수신한 데이터 인지 결정하기 위한것.
    • well known port : 1 ~ 1023번 까지 이미 정해져 있는 잘 알려진 포트넘버
  3. UDP

    • 커넥션을 맺지 않고, TCP와 다르게 정확 확실하지 않지만 빠르다는 장점이 있다.
    • 브로드캐스트가 필요한 어플리케이션도 UDP를 사용할 수 있다. 호스트의 비트 번호가 모두 1인 주소로 하면 브로드캐스트를 할 수 있다.
  4. 네트워크 주소 변환

    • 네트워크 고갈 문제를 해결하기 위한 방법
    • 인터넷에 접속하지 않는 네트워크를 위해 사용할 수 있는 IP 주소

      1. Class A : 10.0.0.0
      2. Class B : 172.16.0.0 ~ 172.31.0.0
      3. Class C : 192.168.0.0 ~ 192.168.255.0
      4. 인터넷에 접속하지 않고 TCP/IP를 사용할 경우 위의 주소를 사용해도 되고, 중복을 염려하지 않아도 된다.
    • NAT(Network Address Translation)

      • 내부 네트워크에서는 사설 IP를 할당하는데 이는 내부 네트워크에서 TCP/IP를 사용한 통신을 위한것이다.
      • 인터넷을 이용할 때는 글로벌 IP 주소로 다시 바꿔서 내보낸다.
      • 하지만 NAT가 보유하는 글로벌 IP주소 수 이상의 호스트는 인터넷에 동시에 접속할 수 없다.
  5. NAPT(Network Address Port Translation)

    • 하나의 글로벌 IP주소로 복수의 컴퓨터를 접속하게 하는데 IP 주소 뿐만 아니라 포트 번호도 변환해서 IP보다 더 많은 컴퓨터 접속을 가능하게 한다.
    • 단점으론 LAN 내부에서 외부로 공개하고 싶은 서버가 있을 경우 NAPT 테이블에 저장되있지 않는 것은 LAN 내부로 들어올 수 없다.
    • 해결책으로 수동으로 변환을 입력하여 NAPT테이블에 미리 변환을 저장 시켜줘야 한다.
    • 또 다른 단점으로 FTP를 기본으로 지원하지 않는다. FTP 데이터 부분에도 송신처의 IP 주소와 포트 번호가 기술되는데, 이것은 NAPT의 관리 대상이 되지 않는다.
  6. 5 ~ 7계층

    • 5계층 : 세션 계층으로 다이얼로그 제어를 하며 간단하게 말하면 대화가 성립되도록 하는 제어이다.
    • 6계층 : 표현 계층으로 어플리케이션에 맞는 데이터 형식(문자, 영상, 동영상, 음성)이 있는데 변환을 해서 하드웨어랑 OS 차이를 없앤 데이터를 교환한다. 압축이나 암호화를 수행할 수도 있다.
    • 7계층 : 어플리케이션 계층으로 어플리케이션의 목적에 따라 네트워크 서비스를 제공하는 계층이다. 어플리케이션 계층이 각각 목적에 따라 송수신하는 데이터의 형식이나 순서 등이 정해져 있다.

2. 네트워크 문제

  1. 4계층이 하는 역할에 대해서 작성하시오 p.232
  2. 4계층에서 다루는 port 번호가 어떤 목적으로 사용되고 있는지 작성하시오 p.234
  3. TCP에서 커넥션이 필요한 이유에 대해 작성하시오 p.239
  4. TCP 커넥션 확립 절차에 대해서 설명하시오 p.240
  5. TCP 통신에서 에러 복구를 하는데 있어서 시퀀스가 어떤 역할을 하는지 통신 절차를 예를들어 설명하시오 p.246
  6. 윈도우 제어가 어떤 문제를 해결하기 위해 나왔는지, 어떻게 동작하는지 설명하시오 p.248
  7. TCP와 UDP의 특징을 비교하시오 p.259
  8. 네트워크 고갈문제를 해결하기 위한 방법 2가지 p.264
  9. NAPT가 나오게된 배경, NPA의 동작 방법, NAPT의 단점에 대해서 설명하시오 p.268
  10. 5,6,7 계층의 이름과 각 계층에 대해서 설명하시오 p.276
  11. 1 ~ 7 각 계층이 어떻게 유기적으로 동작하는지 설명하시오 p.280

3. 코틀린 스터디

  • 코틀린의 델리게이트

    • class delegate와 property delegate가 있다.
    • delegate : 변수나 filed에 직접 값을 할당하지 않고, delegate 객체에게 할당 하는것
    • 우리가 그 속성을 쓰는것 같지만 그 속성을 getValue나 setValue를 호출하는 코드로 컴파일러가 바꿔준다. 단지 문법상으로 속성을 쓰는것 처럼 사용이 가능하다
    • a.b.getValue를 구현한 객체가 있다면, a.b만 호출해서 사용할 수 있다.
    • b에게 직접 값 할당이 아니라 operator로 getValue setValue를 구현하는 객체를 넣어주면 a.b로 쓸 수 있다. 원래는 a.b.getValue()를 해야한다.(???????) 코드로 쳐보기.
    • 컴파일러에게 hint를 주기 위해 =로 할당하지 않고, by를 할당한다.
var notNullStr:String by Delegates.notNull<String>()

fum main() {
    notNullStr = "초기 값"
    println(notNullStr)
}
  • 컴파일러는 by 하는 시점에 delegate 객체의 getValue의 타입을 조사한다. 밑의 코드에서 Book의 생성자는 map을 받아 field 값들을 delegate by로 넣고 있다. 이렇게 할 수 있는 이유는 map에 이미 getValue setValue가 operator로 구현이 되어 delegate 객체라는 의미이다.
data class Book (val delegate:Map<String,Any?>) {
    val name:String by delegate
    val authors:String by delegate
    val pageCount:Int by delegate
    val publicationDate:Date by delegate
    val publisher:String by delegate
}

fun main(args: Array<String>) {
    val map1 = mapOf(
            Pair("name","Reactive Programming in Kotlin"),
            Pair("authors","Rivu Chakraborty"),
            Pair("pageCount",400),
            Pair("publicationDate",SimpleDateFormat("yyyy/MM/dd").parse("2017/12/05")),
            Pair("publisher","Packt")
    )
    val map2 = mapOf(
            "name" to "Kotlin Blueprints",
            "authors" to "Ashish Belagali, Hardik Trivedi, Akshay Chordiya",

            "publicationDate" to SimpleDateFormat("yyyy/MM/dd").parse("2017/12/10"),
            "publisher" to "Packt"
    )

    val book1 = Book(map1)
    val book2 = Book(map2)
    book2.pageCount

    println("Book1 $book1 \nBook2 $book2")
}
  • 위의 map의 getValue를 구현해보면 밑과 같을것이다. 다른 언어에서 operator는 제네릭이 사용되는 경우가 없다.
operator fun<T> getValue(ref, P: property):T {
    return this.p.name as T
}
  • 또한 destructure이 되는 이유는 list, array, pair operator로 이미 만들어 놓았기 때문이다.?????????? 이거 다시 확인
  • 밑의 코드에서 $myEven은 $myEven.getValue()로 번역된다.
var myEven:Int by makeEven(0) {
    property, oldValue, newValue, wasEven ->
    println("${property.name} $oldValue -> $newValue, Even:$wasEven")
}

fun main(args: Array<String>) {
    myEven = 6
    println("myEven:$myEven")
}
  • delegate 객체로 by가 아니라 = 로 할당한다면 getValue(), setValue()로 호출해야한다. =로 할당하고 getValue 해봤는데, operator로 getValue할때 들어가는 ref와 Kproperty 값이 전달되지 않음.
abstract class MakeEven(initialValue: Int):ReadWriteProperty<Any?,Int> {
    private var value:Int = initialValue

    override fun getValue(thisRef: Any?, property: KProperty<*>) = value

    override fun setValue(thisRef: Any?, property: KProperty<*>, value: Int) {
        val oldValue = value
        val wasEven = value%2==0
        if(wasEven) {
            this.value = value
        } else {
            this.value = value+1
        }
        afterAssignmentCall(property,oldValue,value,wasEven)
    }

    abstract fun afterAssignmentCall (property: KProperty<*>, oldValue: Int, newValue: Int, wasEven:Boolean):Unit
}
  • 근데 어떻게 위의 코드처럼 thisRef와 KProperty<*>를 받을 수가 있을까 ? 누가 넣어줄까 ?

    • 코틀린 컴파일러는 해당 변수에 대해 자세한 여러가지를 알고 있다. 그래서 kotlin reflection에 의해 kproperty 또는 kfunction 또는 kclass로 번역이 된다. 그래서 인자값으로 자동으로 넣어준다.
    • 그래서 컴파일 할 때 컴파일러가 setValue를 setValue(myEven, kProperty<MyEven>, 입력값)으로 변경해준다.
  • 위의 코드는 ReadWriteProperty 부분은 굳이 상속하지 않아도 되고,한다면 그냥 var에 넣을 수 있음을 명시하는 것이다.
  • 코틀린 delegate 추가적 내용

    • 따라서 delegate는 컴파일러가 우리를 위해 만들어주는 편의 문법이다.
    • AOP의 joint point이다. 아무 객체에 operator 넣으면 operator 기능이 안에 들어가 컴파일러가 인식하는 joincut이 된다.
    • 모든 객체의 인터페이스나 상속에 무관히 joint cut으로 넣을 수 있다. 상속이고 뭐고 operator getValue setValue가 있으면 바로 delegate가 된다.
    • 자바에선 AOP를 자바 reflection에서 했는데, 코틀린은 컴파일타임에 진행
    • operator : 언어가 제공하는 컴파일러가 제공하는 기능의 혜택을 받기 위해 operator는 객체를 함수처럼 쓰고싶어서 그냥 호출하고 싶다면 invoke를 쓰면 된다. 컴파일러가 invoke를 함수호출로 바궈준다.
    • 코틀린은 컴파일러와 우리가 만든 커스텀 객체와의 대화를 어려운 reflection 객체나 특수한 어떤 annotation 객체 프로세서를 이용하지 않고 되게 쉬운 operator를 써서 처리해줌
    • 모든 operator는 suspend가 가능한데, 이 객체를 만드는 context가 suspend 안이라면 suspend delegate를 사용할 수 있다.(이해 안됨)

2.Feelings

  • 오늘은 일이 있어서 공부를 많이하지는 못했지만, 하나 하나 모두 정확하게 알아내려고 노력 했다.
  • 네트워크 시험을 봤는데 분명히 책을 자세히 읽었음에도 기억이 나지 않거나 놓친 부분이 있어서 아쉬웠다.

3.Findings

  • 외우는게 답이다.

4.Future Action Plan

  • 코틀린을 다 뜯어서 파헤쳐야겠다. 나와있는 코드 다 10 번씩 쳐보고 다 내껄로 만들고 다시 인출하는 과정을 가져야겠다.

5.FeedBack


Written by@Zero1
This blog is for that I organize what I study and my thinking, feeling and experience.

GitHub