4계층의 역할과 개요
TCP
에러복구
세그먼트를 수신하면 수신한 것을 송신처에게 전달하는 것을 응답확인이라고 함.
커넥션을 맺는다.
커넥션 확립 과정
커넥션을 끊기 위해 4way handshake를 한다.
TCP는 어플리케이션으로 부터 받은 데이터를 세그먼트로 캡슐화한다.
윈도우 제어: 위의 방법을 쓴다면, 응답 확인이 오기 전까지는 다음 패킷을 전송하지 않는데 그러면 효율이 좋지 못하다. 그래서 한번에 패킷을 여러개 보내는 방법을 사용하는데, 이곳에서 윈도우 제어를 사용한다. 버퍼를 사용하여 해당 버퍼의 양이 다 전송완료 되면 다음 패킷들을 보낸다. 또 어느정도 버퍼량을 갖는지 서로 공유하여 윈도우 사이즈만큼 데이터를 보내 오버플로 하지 않는다. 확인응답을 기다리지 않고 보낼 수 있는 데이터을 윈도우사이라고 할 수 잇다.
포트번호
UDP
네트워크 주소 변환
인터넷에 접속하지 않는 네트워크를 위해 사용할 수 있는 IP 주소
NAT(Network Address Translation)
NAPT(Network Address Port Translation)
5 ~ 7계층
코틀린의 델리게이트
var notNullStr:String by Delegates.notNull<String>()
fum main() {
notNullStr = "초기 값"
println(notNullStr)
}
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")
}
operator fun<T> getValue(ref, P: property):T {
return this.p.name as T
}
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")
}
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<*>를 받을 수가 있을까 ? 누가 넣어줄까 ?
코틀린 delegate 추가적 내용